diff --git a/schemas/Makefile b/schemas/Makefile deleted file mode 100644 index 9ed26b3..0000000 --- a/schemas/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -# To generate schema -# comment out this part from typescript-json-schema.js#L884 -# -# if (indexType.flags !== ts.TypeFlags.Number && !isIndexedObject) { -# throw new Error("Not supported: IndexSignatureDeclaration with index symbol other than a number or a string"); -# } - -gen-schema-single: - bun -bun typescript-json-schema --noExtraProps --required --skipLibCheck --tsNodeRegister=true -o "${OUT}" "${IN}" ${CLASS} - # minify - python3 -c "import json; f=open('${OUT}', 'r'); j=json.load(f); f.close(); f=open('${OUT}', 'w'); json.dump(j, f, separators=(',', ':'));" - -gen-schema: - bun -bun tsc - sed -i 's#"type": "module"#"type": "commonjs"#' package.json - make IN=config/config.ts \ - CLASS=Config \ - OUT=config.schema.json \ - gen-schema-single - make IN=providers/routes.ts \ - CLASS=Routes \ - OUT=routes.schema.json \ - gen-schema-single - make IN=middlewares/middleware_compose.ts \ - CLASS=MiddlewareCompose \ - OUT=middleware_compose.schema.json \ - gen-schema-single - make IN=docker.ts \ - CLASS=DockerRoutes \ - OUT=docker_routes.schema.json \ - gen-schema-single - sed -i 's#"type": "commonjs"#"type": "module"#' package.json - bun format:write \ No newline at end of file diff --git a/schemas/bun.lock b/schemas/bun.lock deleted file mode 100644 index d4c0376..0000000 --- a/schemas/bun.lock +++ /dev/null @@ -1,120 +0,0 @@ -{ - "lockfileVersion": 1, - "workspaces": { - "": { - "name": "godoxy-schemas", - "devDependencies": { - "prettier": "^3.5.3", - "typescript": "^5.8.3", - "typescript-json-schema": "^0.65.1", - }, - }, - }, - "packages": { - "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], - - "@tsconfig/node10": ["@tsconfig/node10@1.0.11", "", {}, "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="], - - "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], - - "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="], - - "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], - - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - - "@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], - - "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], - - "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], - - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - - "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], - - "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - - "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], - - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - - "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - - "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], - - "diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], - - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - - "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - - "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], - - "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], - - "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - - "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], - - "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - - "path-equal": ["path-equal@1.2.5", "", {}, "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g=="], - - "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], - - "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], - - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], - - "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], - - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="], - - "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], - - "typescript-json-schema": ["typescript-json-schema@0.65.1", "", { "dependencies": { "@types/json-schema": "^7.0.9", "@types/node": "^18.11.9", "glob": "^7.1.7", "path-equal": "^1.2.5", "safe-stable-stringify": "^2.2.0", "ts-node": "^10.9.1", "typescript": "~5.5.0", "yargs": "^17.1.1" }, "bin": { "typescript-json-schema": "bin/typescript-json-schema" } }, "sha512-tuGH7ff2jPaUYi6as3lHyHcKpSmXIqN7/mu50x3HlYn0EHzLpmt3nplZ7EuhUkO0eqDRc9GqWNkfjgBPIS9kxg=="], - - "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], - - "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], - - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - - "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - - "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="], - - "typescript-json-schema/typescript": ["typescript@5.5.4", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q=="], - } -} diff --git a/schemas/config.schema.json b/schemas/config.schema.json deleted file mode 100644 index 4095f70..0000000 --- a/schemas/config.schema.json +++ /dev/null @@ -1 +0,0 @@ -{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"definitions":{"AccessLogFieldMode":{"enum":["drop","keep","redact"],"type":"string"},"AccessLogFormat":{"enum":["combined","common","json"],"type":"string"},"AutocertConfig":{"anyOf":[{"$ref":"#/definitions/LocalOptions"},{"$ref":"#/definitions/CloudflareOptions"},{"$ref":"#/definitions/CloudDNSOptions"},{"$ref":"#/definitions/DuckDNSOptions"},{"$ref":"#/definitions/OVHOptionsWithAppKey"},{"$ref":"#/definitions/OVHOptionsWithOAuth2Config"},{"$ref":"#/definitions/PorkbunOptions"}]},"CIDR":{"anyOf":[{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$","type":"string"},{"pattern":"^.*:.*:.*:.*:.*:.*:.*:.*$","type":"string"},{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$","type":"string"},{"pattern":"^::[0-9]*$","type":"string"},{"pattern":"^.*::/[0-9]*$","type":"string"},{"pattern":"^.*:.*::/[0-9]*$","type":"string"}]},"CloudDNSOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"client_id":{"type":"string"},"email":{"$ref":"#/definitions/Email"},"password":{"type":"string"}},"required":["client_id","email","password"],"type":"object"},"provider":{"const":"clouddns","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"CloudflareOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"auth_token":{"type":"string"}},"required":["auth_token"],"type":"object"},"provider":{"const":"cloudflare","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"DomainName":{"additionalProperties":false,"pattern":"^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$","properties":{},"type":"object"},"DomainOrWildcard":{"additionalProperties":false,"pattern":"^(\\*\\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$","properties":{},"type":"object"},"DuckDNSOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"provider":{"const":"duckdns","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"Duration":{"pattern":"^([0-9]+(ms|s|m|h))+$","type":"string"},"Email":{"format":"email","type":"string"},"GotifyConfig":{"additionalProperties":false,"properties":{"name":{"type":"string"},"provider":{"const":"gotify","type":"string"},"token":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","token","url"],"type":"object"},"HTTPHeader":{"description":"HTTP Header","pattern":"^[a-zA-Z0-9\\-]+$","type":"string"},"LocalOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"key_path":{"type":"string"},"options":{"properties":{},"type":"object"},"provider":{"const":"local","type":"string"}},"required":["provider"],"type":"object"},"MiddlewareComposeMap":{"anyOf":[{"additionalProperties":false,"properties":{"use":{"enum":["CustomErrorPage","ErrorPage","customErrorPage","custom_error_page","errorPage","error_page"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"bypass":{"additionalProperties":false,"description":"Bypass redirect","properties":{"user_agents":{"description":"Bypass redirect for user agents","items":{"type":"string"},"type":"array"}},"type":"object"},"use":{"enum":["RedirectHTTP","redirectHTTP","redirect_http"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["SetXForwarded","setXForwarded","set_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["HideXForwarded","hideXForwarded","hide_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allow":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"message":{"default":"IP not allowed","description":"Error message when blocked","type":"string"},"status":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked (alias of status_code)"},"status_code":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked"},"use":{"enum":["CIDRWhitelist","cidrWhitelist","cidr_whitelist"],"type":"string"}},"required":["allow","use"],"type":"object"},{"additionalProperties":false,"properties":{"recursive":{"default":false,"description":"Recursively resolve the IP","type":"boolean"},"use":{"enum":["CloudflareRealIP","cloudflareRealIp","cloudflare_real_ip"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"add_prefix":{"description":"Add prefix to request URL","type":"string"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyRequest","Request","modifyRequest","modify_request","request"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyResponse","Response","modifyResponse","modify_response","response"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allowed_groups":{"description":"Allowed groups","items":{"type":"string"},"minItems":1,"type":"array"},"allowed_users":{"description":"Allowed users","items":{"type":"string"},"minItems":1,"type":"array"},"use":{"enum":["OIDC","oidc"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"average":{"description":"Average number of requests allowed in a period","type":"number"},"burst":{"description":"Maximum number of requests allowed in a period","type":"number"},"period":{"$ref":"#/definitions/Duration","default":"1s","description":"Duration of the rate limit"},"use":{"enum":["RateLimit","rateLimit","rate_limit"],"type":"string"}},"required":["average","burst","use"],"type":"object"},{"additionalProperties":false,"properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"},"use":{"enum":["RealIP","realIP","real_ip"],"type":"string"}},"required":["from","use"],"type":"object"}]},"NtfyConfig":{"additionalProperties":false,"properties":{"name":{"type":"string"},"provider":{"const":"ntfy","type":"string"},"style":{"type":"string"},"token":{"type":"string"},"topic":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","topic","url"],"type":"object"},"OVHEndpoint":{"enum":["kimsufi-ca","kimsufi-eu","ovh-ca","ovh-eu","ovh-us","soyoustart-ca","soyoustart-eu"],"type":"string"},"OVHOptionsWithAppKey":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"api_endpoint":{"$ref":"#/definitions/OVHEndpoint"},"application_key":{"type":"string"},"application_secret":{"type":"string"},"consumer_key":{"type":"string"}},"required":["application_key","application_secret","consumer_key"],"type":"object"},"provider":{"const":"ovh","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"OVHOptionsWithOAuth2Config":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"api_endpoint":{"$ref":"#/definitions/OVHEndpoint"},"application_secret":{"type":"string"},"consumer_key":{"type":"string"},"oauth2_config":{"additionalProperties":false,"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"}},"required":["client_id","client_secret"],"type":"object"}},"required":["application_secret","consumer_key","oauth2_config"],"type":"object"},"provider":{"const":"ovh","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"PorkbunOptions":{"additionalProperties":false,"properties":{"cert_path":{"type":"string"},"domains":{"items":{"$ref":"#/definitions/DomainOrWildcard"},"type":"array"},"email":{"$ref":"#/definitions/Email"},"key_path":{"type":"string"},"options":{"additionalProperties":false,"properties":{"api_key":{"type":"string"},"secret_api_key":{"type":"string"}},"required":["api_key","secret_api_key"],"type":"object"},"provider":{"const":"porkbun","type":"string"}},"required":["domains","email","options","provider"],"type":"object"},"StatusCode":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"type":"number"}]},"StatusCodeRange":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"pattern":"^[0-9]*-[0-9]*$","type":"string"},{"type":"number"}]},"URI":{"format":"uri-reference","type":"string"},"URL":{"format":"uri","type":"string"},"WebhookColorMode":{"enum":["dec","hex"],"type":"string"},"WebhookConfig":{"additionalProperties":false,"properties":{"color_mode":{"$ref":"#/definitions/WebhookColorMode","default":"hex","description":"Webhook color mode"},"method":{"$ref":"#/definitions/WebhookMethod","default":"POST","description":"Webhook method"},"mime_type":{"$ref":"#/definitions/WebhookMimeType","default":"application/json","description":"Webhook mime type"},"name":{"type":"string"},"payload":{"description":"Webhook message (usally JSON),\nrequired when template is not defined","type":"string"},"provider":{"const":"webhook","type":"string"},"template":{"$ref":"#/definitions/WebhookTemplate","default":"discord","description":"Webhook template"},"token":{"type":"string"},"url":{"$ref":"#/definitions/URL"}},"required":["name","provider","url"],"type":"object"},"WebhookMethod":{"enum":["GET","POST","PUT"],"type":"string"},"WebhookMimeType":{"enum":["application/json","application/x-www-form-urlencoded","text/markdown","text/plain"],"type":"string"},"WebhookTemplate":{"enum":["","discord"],"type":"string"}},"properties":{"autocert":{"$ref":"#/definitions/AutocertConfig","description":"Optional autocert configuration","examples":[{"provider":"local"},{"domains":["example.com"],"email":"abc@gmail","options":{"auth_token":"c1234565789-abcdefghijklmnopqrst"},"provider":"cloudflare"},{"domains":["example.com"],"email":"abc@gmail","options":{"client_id":"c1234565789","email":"abc@gmail","password":"password"},"provider":"clouddns"}]},"entrypoint":{"additionalProperties":false,"properties":{"access_log":{"additionalProperties":false,"description":"Entrypoint access log configuration","examples":[{"fields":{"headers":{"config":{"foo":"redact"},"default":"keep"}},"filters":{"status_codes":{"values":["200-299"]}},"format":"combined","path":"/var/log/access.log"}],"properties":{"buffer_size":{"default":65536,"description":"The size of the buffer.","minimum":0,"type":"integer"},"fields":{"additionalProperties":false,"properties":{"cookie":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"header":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"query":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"}},"type":"object"},"filters":{"additionalProperties":false,"properties":{"cidr":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"}},"required":["values"],"type":"object"},"headers":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"}},"required":["values"],"type":"object"},"host":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"method":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"enum":["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"],"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"status_code":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/StatusCodeRange"},"type":"array"}},"required":["values"],"type":"object"}},"type":"object"},"format":{"$ref":"#/definitions/AccessLogFormat","default":"combined","description":"The format of the access log."},"path":{"$ref":"#/definitions/URI"}},"required":["path"],"type":"object"},"middlewares":{"description":"Entrypoint middleware configuration","examples":[{"use":"RedirectHTTP"},{"allow":["127.0.0.1","10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],"message":"Forbidden","status":403,"use":"CIDRWhitelist"}],"items":{"$ref":"#/definitions/MiddlewareComposeMap"},"type":"array"}},"type":"object"},"homepage":{"additionalProperties":false,"properties":{"use_default_categories":{"default":true,"description":"Use default app categories (uses docker image name)","type":"boolean"}},"required":["use_default_categories"],"type":"object"},"match_domains":{"description":"Optional list of domains to match","examples":["example.com","*.example.com"],"items":{"$ref":"#/definitions/DomainName"},"minItems":1,"type":"array"},"providers":{"additionalProperties":false,"properties":{"agents":{"description":"List of GoDoxy agents","examples":["10.0.2.3:8890","10.0.2.4:8890"],"items":{"pattern":"^.*:[0-9]*$","type":"string"},"minItems":1,"type":"array"},"docker":{"additionalProperties":{"anyOf":[{"format":"uri","type":"string"},{"const":"$DOCKER_HOST","type":"string"}]},"description":"Name-value mapping of docker hosts to retrieve routes from","examples":[{"local":"$DOCKER_HOST"},{"remote":"tcp://10.0.2.1:2375"},{"remote2":"ssh://root:1234@10.0.2.2"}],"minProperties":1,"type":"object"},"include":{"description":"List of route definition files to include","examples":["file1.yml","file2.yml"],"items":{"pattern":"^[\\w\\d\\-_]+\\.(yaml|yml)$"},"minItems":1,"type":"array"},"notification":{"description":"List of notification providers","examples":[{"name":"gotify","provider":"gotify","token":"abcd","url":"https://gotify.domain.tld"},{"name":"discord","provider":"webhook","template":"discord","url":"https://discord.com/api/webhooks/1234/abcd"}],"items":{"anyOf":[{"$ref":"#/definitions/GotifyConfig"},{"$ref":"#/definitions/NtfyConfig"},{"$ref":"#/definitions/WebhookConfig"}]},"minItems":1,"type":"array"}},"type":"object"},"timeout_shutdown":{"default":3,"description":"Optional timeout before shutdown","minimum":1,"type":"number"}},"required":["providers"],"type":"object"} \ No newline at end of file diff --git a/schemas/config/access_log.d.ts b/schemas/config/access_log.d.ts deleted file mode 100644 index 7f57c49..0000000 --- a/schemas/config/access_log.d.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { CIDR, HTTPHeader, HTTPMethod, StatusCodeRange, URI } from "../types"; -export declare const ACCESS_LOG_FORMATS: readonly [ - "combined", - "common", - "json", -]; -export type AccessLogFormat = (typeof ACCESS_LOG_FORMATS)[number]; -export type AccessLogConfig = { - /** - * The size of the buffer. - * - * @minimum 0 - * @default 65536 - * @TJS-type integer - */ - buffer_size?: number; - /** The format of the access log. - * - * @default "combined" - */ - format?: AccessLogFormat; - path: URI; - filters?: AccessLogFilters; - fields?: AccessLogFields; -}; -export type AccessLogFilter = { - /** Whether the filter is negative. - * - * @default false - */ - negative?: boolean; - values: T[]; -}; -export type AccessLogFilters = { - status_code?: AccessLogFilter; - method?: AccessLogFilter; - host?: AccessLogFilter; - headers?: AccessLogFilter; - cidr?: AccessLogFilter; -}; -export declare const ACCESS_LOG_FIELD_MODES: readonly [ - "keep", - "drop", - "redact", -]; -export type AccessLogFieldMode = (typeof ACCESS_LOG_FIELD_MODES)[number]; -export type AccessLogField = { - default?: AccessLogFieldMode; - config: { - [key: string]: AccessLogFieldMode; - }; -}; -export type AccessLogFields = { - header?: AccessLogField; - query?: AccessLogField; - cookie?: AccessLogField; -}; diff --git a/schemas/config/access_log.js b/schemas/config/access_log.js deleted file mode 100644 index 0876f2a..0000000 --- a/schemas/config/access_log.js +++ /dev/null @@ -1,2 +0,0 @@ -export const ACCESS_LOG_FORMATS = ["combined", "common", "json"]; -export const ACCESS_LOG_FIELD_MODES = ["keep", "drop", "redact"]; diff --git a/schemas/config/access_log.ts b/schemas/config/access_log.ts deleted file mode 100644 index 1438afb..0000000 --- a/schemas/config/access_log.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CIDR, HTTPHeader, HTTPMethod, StatusCodeRange, URI } from "../types"; - -export const ACCESS_LOG_FORMATS = ["combined", "common", "json"] as const; - -export type AccessLogFormat = (typeof ACCESS_LOG_FORMATS)[number]; - -export type AccessLogConfig = { - /** - * The size of the buffer. - * - * @minimum 0 - * @default 65536 - * @TJS-type integer - */ - buffer_size?: number; - /** The format of the access log. - * - * @default "combined" - */ - format?: AccessLogFormat; - /* The path to the access log file. */ - path: URI; - /* The access log filters. */ - filters?: AccessLogFilters; - /* The access log fields. */ - fields?: AccessLogFields; -}; - -export type AccessLogFilter = { - /** Whether the filter is negative. - * - * @default false - */ - negative?: boolean; - /* The values to filter. */ - values: T[]; -}; - -export type AccessLogFilters = { - /* Status code filter. */ - status_code?: AccessLogFilter; - /* Method filter. */ - method?: AccessLogFilter; - /* Host filter. */ - host?: AccessLogFilter; - /* Header filter. */ - headers?: AccessLogFilter; - /* CIDR filter. */ - cidr?: AccessLogFilter; -}; - -export const ACCESS_LOG_FIELD_MODES = ["keep", "drop", "redact"] as const; -export type AccessLogFieldMode = (typeof ACCESS_LOG_FIELD_MODES)[number]; - -export type AccessLogField = { - default?: AccessLogFieldMode; - config: { - [key: string]: AccessLogFieldMode; - }; -}; - -export type AccessLogFields = { - header?: AccessLogField; - query?: AccessLogField; - cookie?: AccessLogField; -}; diff --git a/schemas/config/autocert.d.ts b/schemas/config/autocert.d.ts deleted file mode 100644 index 702f91e..0000000 --- a/schemas/config/autocert.d.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { DomainOrWildcard, Email } from "../types"; -export declare const AUTOCERT_PROVIDERS: readonly [ - "local", - "cloudflare", - "clouddns", - "duckdns", - "ovh", - "porkbun", -]; -export type AutocertProvider = (typeof AUTOCERT_PROVIDERS)[number]; -export type AutocertConfig = - | LocalOptions - | CloudflareOptions - | CloudDNSOptions - | DuckDNSOptions - | OVHOptionsWithAppKey - | OVHOptionsWithOAuth2Config - | PorkbunOptions; -export interface AutocertConfigBase { - email: Email; - domains: DomainOrWildcard[]; - cert_path?: string; - key_path?: string; -} -export interface LocalOptions { - provider: "local"; - cert_path?: string; - key_path?: string; - options?: {} | null; -} -export interface CloudflareOptions extends AutocertConfigBase { - provider: "cloudflare"; - options: { - auth_token: string; - }; -} -export interface CloudDNSOptions extends AutocertConfigBase { - provider: "clouddns"; - options: { - client_id: string; - email: Email; - password: string; - }; -} -export interface DuckDNSOptions extends AutocertConfigBase { - provider: "duckdns"; - options: { - token: string; - }; -} -export interface PorkbunOptions extends AutocertConfigBase { - provider: "porkbun"; - options: { - api_key: string; - secret_api_key: string; - }; -} -export declare const OVH_ENDPOINTS: readonly [ - "ovh-eu", - "ovh-ca", - "ovh-us", - "kimsufi-eu", - "kimsufi-ca", - "soyoustart-eu", - "soyoustart-ca", -]; -export type OVHEndpoint = (typeof OVH_ENDPOINTS)[number]; -export interface OVHOptionsWithAppKey extends AutocertConfigBase { - provider: "ovh"; - options: { - application_secret: string; - consumer_key: string; - api_endpoint?: OVHEndpoint; - application_key: string; - }; -} -export interface OVHOptionsWithOAuth2Config extends AutocertConfigBase { - provider: "ovh"; - options: { - application_secret: string; - consumer_key: string; - api_endpoint?: OVHEndpoint; - oauth2_config: { - client_id: string; - client_secret: string; - }; - }; -} diff --git a/schemas/config/autocert.js b/schemas/config/autocert.js deleted file mode 100644 index 3cefc37..0000000 --- a/schemas/config/autocert.js +++ /dev/null @@ -1,17 +0,0 @@ -export const AUTOCERT_PROVIDERS = [ - "local", - "cloudflare", - "clouddns", - "duckdns", - "ovh", - "porkbun", -]; -export const OVH_ENDPOINTS = [ - "ovh-eu", - "ovh-ca", - "ovh-us", - "kimsufi-eu", - "kimsufi-ca", - "soyoustart-eu", - "soyoustart-ca", -]; diff --git a/schemas/config/autocert.ts b/schemas/config/autocert.ts deleted file mode 100644 index 1363198..0000000 --- a/schemas/config/autocert.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { DomainOrWildcard, Email } from "../types"; - -export const AUTOCERT_PROVIDERS = [ - "local", - "cloudflare", - "clouddns", - "duckdns", - "ovh", - "porkbun", -] as const; - -export type AutocertProvider = (typeof AUTOCERT_PROVIDERS)[number]; - -export type AutocertConfig = - | LocalOptions - | CloudflareOptions - | CloudDNSOptions - | DuckDNSOptions - | OVHOptionsWithAppKey - | OVHOptionsWithOAuth2Config - | PorkbunOptions; - -export interface AutocertConfigBase { - /* ACME email */ - email: Email; - /* ACME domains */ - domains: DomainOrWildcard[]; - /* ACME certificate path */ - cert_path?: string; - /* ACME key path */ - key_path?: string; -} - -export interface LocalOptions { - provider: "local"; - /* ACME certificate path */ - cert_path?: string; - /* ACME key path */ - key_path?: string; - options?: {} | null; -} - -export interface CloudflareOptions extends AutocertConfigBase { - provider: "cloudflare"; - options: { auth_token: string }; -} - -export interface CloudDNSOptions extends AutocertConfigBase { - provider: "clouddns"; - options: { - client_id: string; - email: Email; - password: string; - }; -} - -export interface DuckDNSOptions extends AutocertConfigBase { - provider: "duckdns"; - options: { - token: string; - }; -} - -export interface PorkbunOptions extends AutocertConfigBase { - provider: "porkbun"; - options: { - api_key: string; - secret_api_key: string; - }; -} -export const OVH_ENDPOINTS = [ - "ovh-eu", - "ovh-ca", - "ovh-us", - "kimsufi-eu", - "kimsufi-ca", - "soyoustart-eu", - "soyoustart-ca", -] as const; - -export type OVHEndpoint = (typeof OVH_ENDPOINTS)[number]; - -export interface OVHOptionsWithAppKey extends AutocertConfigBase { - provider: "ovh"; - options: { - application_secret: string; - consumer_key: string; - api_endpoint?: OVHEndpoint; - application_key: string; - }; -} - -export interface OVHOptionsWithOAuth2Config extends AutocertConfigBase { - provider: "ovh"; - options: { - application_secret: string; - consumer_key: string; - api_endpoint?: OVHEndpoint; - oauth2_config: { - client_id: string; - client_secret: string; - }; - }; -} diff --git a/schemas/config/config.d.ts b/schemas/config/config.d.ts deleted file mode 100644 index e88116f..0000000 --- a/schemas/config/config.d.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { DomainName } from "../types"; -import { AutocertConfig } from "./autocert"; -import { EntrypointConfig } from "./entrypoint"; -import { HomepageConfig } from "./homepage"; -import { Providers } from "./providers"; -export type Config = { - /** Optional autocert configuration - * - * @examples require(".").autocertExamples - */ - autocert?: AutocertConfig; - entrypoint?: EntrypointConfig; - providers: Providers; - /** Optional list of domains to match - * - * @minItems 1 - * @examples require(".").matchDomainsExamples - */ - match_domains?: DomainName[]; - homepage?: HomepageConfig; - /** - * Optional timeout before shutdown - * @default 3 - * @minimum 1 - */ - timeout_shutdown?: number; -}; -export declare const autocertExamples: ( - | { - provider: string; - email?: undefined; - domains?: undefined; - options?: undefined; - } - | { - provider: string; - email: string; - domains: string[]; - options: { - auth_token: string; - client_id?: undefined; - email?: undefined; - password?: undefined; - }; - } - | { - provider: string; - email: string; - domains: string[]; - options: { - client_id: string; - email: string; - password: string; - auth_token?: undefined; - }; - } -)[]; -export declare const matchDomainsExamples: readonly [ - "example.com", - "*.example.com", -]; diff --git a/schemas/config/config.js b/schemas/config/config.js deleted file mode 100644 index 56cc465..0000000 --- a/schemas/config/config.js +++ /dev/null @@ -1,20 +0,0 @@ -export const autocertExamples = [ - { provider: "local" }, - { - provider: "cloudflare", - email: "abc@gmail", - domains: ["example.com"], - options: { auth_token: "c1234565789-abcdefghijklmnopqrst" }, - }, - { - provider: "clouddns", - email: "abc@gmail", - domains: ["example.com"], - options: { - client_id: "c1234565789", - email: "abc@gmail", - password: "password", - }, - }, -]; -export const matchDomainsExamples = ["example.com", "*.example.com"]; diff --git a/schemas/config/config.ts b/schemas/config/config.ts deleted file mode 100644 index 93ce86d..0000000 --- a/schemas/config/config.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { DomainName } from "../types"; -import { AutocertConfig } from "./autocert"; -import { EntrypointConfig } from "./entrypoint"; -import { HomepageConfig } from "./homepage"; -import { Providers } from "./providers"; - -export type Config = { - /** Optional autocert configuration - * - * @examples require(".").autocertExamples - */ - autocert?: AutocertConfig; - /* Optional entrypoint configuration */ - entrypoint?: EntrypointConfig; - /* Providers configuration (include file, docker, notification) */ - providers: Providers; - /** Optional list of domains to match - * - * @minItems 1 - * @examples require(".").matchDomainsExamples - */ - match_domains?: DomainName[]; - /* Optional homepage configuration */ - homepage?: HomepageConfig; - /** - * Optional timeout before shutdown - * @default 3 - * @minimum 1 - */ - timeout_shutdown?: number; -}; - -export const autocertExamples = [ - { provider: "local" }, - { - provider: "cloudflare", - email: "abc@gmail", - domains: ["example.com"], - options: { auth_token: "c1234565789-abcdefghijklmnopqrst" }, - }, - { - provider: "clouddns", - email: "abc@gmail", - domains: ["example.com"], - options: { - client_id: "c1234565789", - email: "abc@gmail", - password: "password", - }, - }, -]; -export const matchDomainsExamples = ["example.com", "*.example.com"] as const; diff --git a/schemas/config/entrypoint.d.ts b/schemas/config/entrypoint.d.ts deleted file mode 100644 index 7584dd6..0000000 --- a/schemas/config/entrypoint.d.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { MiddlewareCompose } from "../middlewares/middleware_compose"; -import { AccessLogConfig } from "./access_log"; -export type EntrypointConfig = { - /** Entrypoint middleware configuration - * - * @examples require(".").middlewaresExamples - */ - middlewares?: MiddlewareCompose; - /** Entrypoint access log configuration - * - * @examples require(".").accessLogExamples - */ - access_log?: AccessLogConfig; -}; -export declare const accessLogExamples: readonly [ - { - readonly path: "/var/log/access.log"; - readonly format: "combined"; - readonly filters: { - readonly status_codes: { - readonly values: readonly ["200-299"]; - }; - }; - readonly fields: { - readonly headers: { - readonly default: "keep"; - readonly config: { - readonly foo: "redact"; - }; - }; - }; - }, -]; -export declare const middlewaresExamples: readonly [ - { - readonly use: "RedirectHTTP"; - }, - { - readonly use: "CIDRWhitelist"; - readonly allow: readonly [ - "127.0.0.1", - "10.0.0.0/8", - "172.16.0.0/12", - "192.168.0.0/16", - ]; - readonly status: 403; - readonly message: "Forbidden"; - }, -]; diff --git a/schemas/config/entrypoint.js b/schemas/config/entrypoint.js deleted file mode 100644 index d81c2ba..0000000 --- a/schemas/config/entrypoint.js +++ /dev/null @@ -1,30 +0,0 @@ -export const accessLogExamples = [ - { - path: "/var/log/access.log", - format: "combined", - filters: { - status_codes: { - values: ["200-299"], - }, - }, - fields: { - headers: { - default: "keep", - config: { - foo: "redact", - }, - }, - }, - }, -]; -export const middlewaresExamples = [ - { - use: "RedirectHTTP", - }, - { - use: "CIDRWhitelist", - allow: ["127.0.0.1", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"], - status: 403, - message: "Forbidden", - }, -]; diff --git a/schemas/config/entrypoint.ts b/schemas/config/entrypoint.ts deleted file mode 100644 index d4c1b82..0000000 --- a/schemas/config/entrypoint.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { MiddlewareCompose } from "../middlewares/middleware_compose"; -import { AccessLogConfig } from "./access_log"; - -export type EntrypointConfig = { - /** Entrypoint middleware configuration - * - * @examples require(".").middlewaresExamples - */ - middlewares?: MiddlewareCompose; - /** Entrypoint access log configuration - * - * @examples require(".").accessLogExamples - */ - access_log?: AccessLogConfig; -}; - -export const accessLogExamples = [ - { - path: "/var/log/access.log", - format: "combined", - filters: { - status_codes: { - values: ["200-299"], - }, - }, - fields: { - headers: { - default: "keep", - config: { - foo: "redact", - }, - }, - }, - }, -] as const; - -export const middlewaresExamples = [ - { - use: "RedirectHTTP", - }, - { - use: "CIDRWhitelist", - allow: ["127.0.0.1", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"], - status: 403, - message: "Forbidden", - }, -] as const; diff --git a/schemas/config/homepage.d.ts b/schemas/config/homepage.d.ts deleted file mode 100644 index 31f783b..0000000 --- a/schemas/config/homepage.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type HomepageConfig = { - /** - * Use default app categories (uses docker image name) - * @default true - */ - use_default_categories: boolean; -}; diff --git a/schemas/config/homepage.js b/schemas/config/homepage.js deleted file mode 100644 index cb0ff5c..0000000 --- a/schemas/config/homepage.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/schemas/config/homepage.ts b/schemas/config/homepage.ts deleted file mode 100644 index 31f783b..0000000 --- a/schemas/config/homepage.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type HomepageConfig = { - /** - * Use default app categories (uses docker image name) - * @default true - */ - use_default_categories: boolean; -}; diff --git a/schemas/config/notification.d.ts b/schemas/config/notification.d.ts deleted file mode 100644 index 8bf6552..0000000 --- a/schemas/config/notification.d.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { URL } from "../types"; -export declare const NOTIFICATION_PROVIDERS: readonly [ - "webhook", - "gotify", - "ntfy", -]; -export type NotificationProvider = (typeof NOTIFICATION_PROVIDERS)[number]; -export type NotificationConfig = { - name: string; - url: URL; -}; -export interface GotifyConfig extends NotificationConfig { - provider: "gotify"; - token: string; -} -export declare const NTFY_MSG_STYLES: string[]; -export type NtfyStyle = (typeof NTFY_MSG_STYLES)[number]; -export interface NtfyConfig extends NotificationConfig { - provider: "ntfy"; - topic: string; - token?: string; - style?: NtfyStyle; -} -export declare const WEBHOOK_TEMPLATES: readonly ["", "discord"]; -export declare const WEBHOOK_METHODS: readonly ["POST", "GET", "PUT"]; -export declare const WEBHOOK_MIME_TYPES: readonly [ - "application/json", - "application/x-www-form-urlencoded", - "text/plain", - "text/markdown", -]; -export declare const WEBHOOK_COLOR_MODES: readonly ["hex", "dec"]; -export type WebhookTemplate = (typeof WEBHOOK_TEMPLATES)[number]; -export type WebhookMethod = (typeof WEBHOOK_METHODS)[number]; -export type WebhookMimeType = (typeof WEBHOOK_MIME_TYPES)[number]; -export type WebhookColorMode = (typeof WEBHOOK_COLOR_MODES)[number]; -export interface WebhookConfig extends NotificationConfig { - provider: "webhook"; - /** - * Webhook template - * - * @default "discord" - */ - template?: WebhookTemplate; - token?: string; - /** - * Webhook message (usally JSON), - * required when template is not defined - */ - payload?: string; - /** - * Webhook method - * - * @default "POST" - */ - method?: WebhookMethod; - /** - * Webhook mime type - * - * @default "application/json" - */ - mime_type?: WebhookMimeType; - /** - * Webhook color mode - * - * @default "hex" - */ - color_mode?: WebhookColorMode; -} diff --git a/schemas/config/notification.js b/schemas/config/notification.js deleted file mode 100644 index a163e29..0000000 --- a/schemas/config/notification.js +++ /dev/null @@ -1,11 +0,0 @@ -export const NOTIFICATION_PROVIDERS = ["webhook", "gotify", "ntfy"]; -export const NTFY_MSG_STYLES = ["markdown", "plain"]; -export const WEBHOOK_TEMPLATES = ["", "discord"]; -export const WEBHOOK_METHODS = ["POST", "GET", "PUT"]; -export const WEBHOOK_MIME_TYPES = [ - "application/json", - "application/x-www-form-urlencoded", - "text/plain", - "text/markdown", -]; -export const WEBHOOK_COLOR_MODES = ["hex", "dec"]; diff --git a/schemas/config/notification.ts b/schemas/config/notification.ts deleted file mode 100644 index 6366a94..0000000 --- a/schemas/config/notification.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { URL } from "../types"; - -export const NOTIFICATION_PROVIDERS = ["webhook", "gotify", "ntfy"] as const; - -export type NotificationProvider = (typeof NOTIFICATION_PROVIDERS)[number]; - -export type NotificationConfig = { - /* Name of the notification provider */ - name: string; - /* URL of the notification provider */ - url: URL; -}; - -export interface GotifyConfig extends NotificationConfig { - provider: "gotify"; - /* Gotify token */ - token: string; -} - -export const NTFY_MSG_STYLES = ["markdown", "plain"]; -export type NtfyStyle = (typeof NTFY_MSG_STYLES)[number]; - -export interface NtfyConfig extends NotificationConfig { - provider: "ntfy"; - topic: string; - token?: string; - style?: NtfyStyle; -} - -export const WEBHOOK_TEMPLATES = ["", "discord"] as const; -export const WEBHOOK_METHODS = ["POST", "GET", "PUT"] as const; -export const WEBHOOK_MIME_TYPES = [ - "application/json", - "application/x-www-form-urlencoded", - "text/plain", - "text/markdown", -] as const; -export const WEBHOOK_COLOR_MODES = ["hex", "dec"] as const; - -export type WebhookTemplate = (typeof WEBHOOK_TEMPLATES)[number]; -export type WebhookMethod = (typeof WEBHOOK_METHODS)[number]; -export type WebhookMimeType = (typeof WEBHOOK_MIME_TYPES)[number]; -export type WebhookColorMode = (typeof WEBHOOK_COLOR_MODES)[number]; - -export interface WebhookConfig extends NotificationConfig { - provider: "webhook"; - /** - * Webhook template - * - * @default "discord" - */ - template?: WebhookTemplate; - /* Webhook token */ - token?: string; - /** - * Webhook message (usally JSON), - * required when template is not defined - */ - payload?: string; - /** - * Webhook method - * - * @default "POST" - */ - method?: WebhookMethod; - /** - * Webhook mime type - * - * @default "application/json" - */ - mime_type?: WebhookMimeType; - /** - * Webhook color mode - * - * @default "hex" - */ - color_mode?: WebhookColorMode; -} diff --git a/schemas/config/providers.d.ts b/schemas/config/providers.d.ts deleted file mode 100644 index c91d083..0000000 --- a/schemas/config/providers.d.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { URI, URL } from "../types"; -import { GotifyConfig, NtfyConfig, WebhookConfig } from "./notification"; -export type Providers = { - /** List of route definition files to include - * - * @minItems 1 - * @examples require(".").includeExamples - * @items.pattern ^[\w\d\-_]+\.(yaml|yml)$ - */ - include?: URI[]; - /** Name-value mapping of docker hosts to retrieve routes from - * - * @minProperties 1 - * @examples require(".").dockerExamples - */ - docker?: { - [name: string]: URL | "$DOCKER_HOST"; - }; - /** List of GoDoxy agents - * - * @minItems 1 - * @examples require(".").agentExamples - */ - agents?: `${string}:${number}`[]; - /** List of notification providers - * - * @minItems 1 - * @examples require(".").notificationExamples - */ - notification?: (WebhookConfig | GotifyConfig | NtfyConfig)[]; -}; -export declare const includeExamples: readonly ["file1.yml", "file2.yml"]; -export declare const dockerExamples: readonly [ - { - readonly local: "$DOCKER_HOST"; - }, - { - readonly remote: "tcp://10.0.2.1:2375"; - }, - { - readonly remote2: "ssh://root:1234@10.0.2.2"; - }, -]; -export declare const notificationExamples: readonly [ - { - readonly name: "gotify"; - readonly provider: "gotify"; - readonly url: "https://gotify.domain.tld"; - readonly token: "abcd"; - }, - { - readonly name: "discord"; - readonly provider: "webhook"; - readonly template: "discord"; - readonly url: "https://discord.com/api/webhooks/1234/abcd"; - }, -]; -export declare const agentExamples: readonly ["10.0.2.3:8890", "10.0.2.4:8890"]; diff --git a/schemas/config/providers.js b/schemas/config/providers.js deleted file mode 100644 index 5ba5d0e..0000000 --- a/schemas/config/providers.js +++ /dev/null @@ -1,21 +0,0 @@ -export const includeExamples = ["file1.yml", "file2.yml"]; -export const dockerExamples = [ - { local: "$DOCKER_HOST" }, - { remote: "tcp://10.0.2.1:2375" }, - { remote2: "ssh://root:1234@10.0.2.2" }, -]; -export const notificationExamples = [ - { - name: "gotify", - provider: "gotify", - url: "https://gotify.domain.tld", - token: "abcd", - }, - { - name: "discord", - provider: "webhook", - template: "discord", - url: "https://discord.com/api/webhooks/1234/abcd", - }, -]; -export const agentExamples = ["10.0.2.3:8890", "10.0.2.4:8890"]; diff --git a/schemas/config/providers.ts b/schemas/config/providers.ts deleted file mode 100644 index 896f5ea..0000000 --- a/schemas/config/providers.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { URI, URL } from "../types"; -import { GotifyConfig, NtfyConfig, WebhookConfig } from "./notification"; - -export type Providers = { - /** List of route definition files to include - * - * @minItems 1 - * @examples require(".").includeExamples - * @items.pattern ^[\w\d\-_]+\.(yaml|yml)$ - */ - include?: URI[]; - /** Name-value mapping of docker hosts to retrieve routes from - * - * @minProperties 1 - * @examples require(".").dockerExamples - */ - docker?: { [name: string]: URL | "$DOCKER_HOST" }; - /** List of GoDoxy agents - * - * @minItems 1 - * @examples require(".").agentExamples - */ - agents?: `${string}:${number}`[]; - /** List of notification providers - * - * @minItems 1 - * @examples require(".").notificationExamples - */ - notification?: (WebhookConfig | GotifyConfig | NtfyConfig)[]; -}; - -export const includeExamples = ["file1.yml", "file2.yml"] as const; -export const dockerExamples = [ - { local: "$DOCKER_HOST" }, - { remote: "tcp://10.0.2.1:2375" }, - { remote2: "ssh://root:1234@10.0.2.2" }, -] as const; -export const notificationExamples = [ - { - name: "gotify", - provider: "gotify", - url: "https://gotify.domain.tld", - token: "abcd", - }, - { - name: "discord", - provider: "webhook", - template: "discord", - url: "https://discord.com/api/webhooks/1234/abcd", - }, -] as const; -export const agentExamples = ["10.0.2.3:8890", "10.0.2.4:8890"] as const; diff --git a/schemas/docker.d.ts b/schemas/docker.d.ts deleted file mode 100644 index 02884ad..0000000 --- a/schemas/docker.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { IdleWatcherConfig } from "./providers/idlewatcher"; -import { Route } from "./providers/routes"; -export type DockerRoutes = { - [key: string]: Route & IdleWatcherConfig; -}; diff --git a/schemas/docker.js b/schemas/docker.js deleted file mode 100644 index cb0ff5c..0000000 --- a/schemas/docker.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/schemas/docker.ts b/schemas/docker.ts deleted file mode 100644 index 8068440..0000000 --- a/schemas/docker.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IdleWatcherConfig } from "./providers/idlewatcher"; -import { Route } from "./providers/routes"; - -//FIXME: fix this -export type DockerRoutes = { - [key: string]: Route & IdleWatcherConfig; -}; diff --git a/schemas/docker_routes.schema.json b/schemas/docker_routes.schema.json deleted file mode 100644 index 32025ef..0000000 --- a/schemas/docker_routes.schema.json +++ /dev/null @@ -1 +0,0 @@ -{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":{"anyOf":[{"additionalProperties":false,"properties":{"access_log":{"additionalProperties":false,"description":"Access log config","examples":[{"fields":{"headers":{"config":{"foo":"redact"},"default":"keep"}},"filters":{"status_codes":{"values":["200-299"]}},"format":"combined","path":"/var/log/access.log"}],"properties":{"buffer_size":{"default":65536,"description":"The size of the buffer.","minimum":0,"type":"integer"},"fields":{"additionalProperties":false,"properties":{"cookie":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"header":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"query":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"}},"type":"object"},"filters":{"additionalProperties":false,"properties":{"cidr":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"}},"required":["values"],"type":"object"},"headers":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"}},"required":["values"],"type":"object"},"host":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"method":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"enum":["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"],"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"status_code":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/StatusCodeRange"},"type":"array"}},"required":["values"],"type":"object"}},"type":"object"},"format":{"$ref":"#/definitions/AccessLogFormat","default":"combined","description":"The format of the access log."},"path":{"$ref":"#/definitions/URI"}},"required":["path"],"type":"object"},"alias":{"description":"Alias (subdomain or FDN)","minLength":1,"type":"string"},"healthcheck":{"additionalProperties":false,"description":"Healthcheck config","properties":{"disable":{"default":false,"description":"Disable healthcheck","type":"boolean"},"interval":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck interval"},"path":{"$ref":"#/definitions/URI","default":"/","description":"Healthcheck path"},"timeout":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck timeout"},"use_get":{"default":false,"description":"Use GET instead of HEAD","type":"boolean"}},"type":"object"},"homepage":{"additionalProperties":false,"description":"Homepage config","examples":[{"category":"Arr suite","icon":"png/sonarr.png","name":"Sonarr"},{"icon":"@target/favicon.ico","name":"App"}],"properties":{"category":{"type":"string"},"description":{"type":"string"},"icon":{"anyOf":[{"format":"uri","type":"string"},{"description":"Walkxcode icon","pattern":"^(png|svg|webp)\\/[\\w\\d\\-_]+\\.\\1","type":"string"},{"pattern":"^@selfhst/.*\\..*$","type":"string"},{"pattern":"^@walkxcode/.*\\..*$","type":"string"},{"pattern":"^@target/.*$","type":"string"},{"pattern":"^/.*$","type":"string"}]},"name":{"type":"string"},"show":{"default":true,"description":"Whether show in dashboard","type":"boolean"},"url":{"$ref":"#/definitions/URL"},"widget_config":{"additionalProperties":{},"type":"object"}},"type":"object"},"host":{"anyOf":[{"format":"hostname","type":"string"},{"format":"ipv4","type":"string"},{"format":"ipv6","type":"string"}],"default":"localhost","description":"Proxy host"},"idle_timeout":{"$ref":"#/definitions/Duration"},"load_balance":{"$ref":"#/definitions/LoadBalanceConfig","description":"Load balance config"},"middlewares":{"$ref":"#/definitions/MiddlewaresMap","description":"Middlewares"},"no_tls_verify":{"default":false,"description":"Skip TLS verification","type":"boolean"},"path_patterns":{"description":"Path patterns (only patterns that match will be proxied).\n\nSee https://pkg.go.dev/net/http#hdr-Patterns-ServeMux","items":{"$ref":"#/definitions/PathPattern"},"type":"array"},"port":{"$ref":"#/definitions/Port","default":80,"description":"Proxy port"},"response_header_timeout":{"$ref":"#/definitions/Duration","default":"60s","description":"Response header timeout"},"scheme":{"$ref":"#/definitions/ProxyScheme","default":"http","description":"Proxy scheme"},"start_endpoint":{"$ref":"#/definitions/URI"},"stop_method":{"$ref":"#/definitions/StopMethod","default":"stop","description":"Stop method"},"stop_signal":{"$ref":"#/definitions/Signal"},"stop_timeout":{"$ref":"#/definitions/Duration","default":"30s","description":"Stop timeout"},"wake_timeout":{"$ref":"#/definitions/Duration","default":"30s","description":"Wake timeout"}},"type":"object"},{"additionalProperties":false,"properties":{"access_log":{"additionalProperties":false,"description":"Access log config","examples":[{"fields":{"headers":{"config":{"foo":"redact"},"default":"keep"}},"filters":{"status_codes":{"values":["200-299"]}},"format":"combined","path":"/var/log/access.log"}],"properties":{"buffer_size":{"default":65536,"description":"The size of the buffer.","minimum":0,"type":"integer"},"fields":{"additionalProperties":false,"properties":{"cookie":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"header":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"query":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"}},"type":"object"},"filters":{"additionalProperties":false,"properties":{"cidr":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"}},"required":["values"],"type":"object"},"headers":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"}},"required":["values"],"type":"object"},"host":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"method":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"enum":["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"],"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"status_code":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/StatusCodeRange"},"type":"array"}},"required":["values"],"type":"object"}},"type":"object"},"format":{"$ref":"#/definitions/AccessLogFormat","default":"combined","description":"The format of the access log."},"path":{"$ref":"#/definitions/URI"}},"required":["path"],"type":"object"},"alias":{"description":"Alias (subdomain or FDN)","minLength":1,"type":"string"},"healthcheck":{"additionalProperties":false,"description":"Healthcheck config","properties":{"disable":{"default":false,"description":"Disable healthcheck","type":"boolean"},"interval":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck interval"},"path":{"$ref":"#/definitions/URI","default":"/","description":"Healthcheck path"},"timeout":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck timeout"},"use_get":{"default":false,"description":"Use GET instead of HEAD","type":"boolean"}},"type":"object"},"homepage":{"additionalProperties":false,"description":"Homepage config","examples":[{"category":"Arr suite","icon":"png/sonarr.png","name":"Sonarr"},{"icon":"@target/favicon.ico","name":"App"}],"properties":{"category":{"type":"string"},"description":{"type":"string"},"icon":{"anyOf":[{"format":"uri","type":"string"},{"description":"Walkxcode icon","pattern":"^(png|svg|webp)\\/[\\w\\d\\-_]+\\.\\1","type":"string"},{"pattern":"^@selfhst/.*\\..*$","type":"string"},{"pattern":"^@walkxcode/.*\\..*$","type":"string"},{"pattern":"^@target/.*$","type":"string"},{"pattern":"^/.*$","type":"string"}]},"name":{"type":"string"},"show":{"default":true,"description":"Whether show in dashboard","type":"boolean"},"url":{"$ref":"#/definitions/URL"},"widget_config":{"additionalProperties":{},"type":"object"}},"type":"object"},"idle_timeout":{"$ref":"#/definitions/Duration"},"middlewares":{"$ref":"#/definitions/MiddlewaresMap","description":"Middlewares"},"path_patterns":{"description":"Path patterns (only patterns that match will be proxied).\n\nSee https://pkg.go.dev/net/http#hdr-Patterns-ServeMux","items":{"$ref":"#/definitions/PathPattern"},"type":"array"},"root":{"type":"string"},"scheme":{"const":"fileserver","type":"string"},"start_endpoint":{"$ref":"#/definitions/URI"},"stop_method":{"$ref":"#/definitions/StopMethod","default":"stop","description":"Stop method"},"stop_signal":{"$ref":"#/definitions/Signal"},"stop_timeout":{"$ref":"#/definitions/Duration","default":"30s","description":"Stop timeout"},"wake_timeout":{"$ref":"#/definitions/Duration","default":"30s","description":"Wake timeout"}},"required":["root","scheme"],"type":"object"},{"additionalProperties":false,"properties":{"alias":{"description":"Alias (subdomain or FDN)","minLength":1,"type":"string"},"healthcheck":{"additionalProperties":false,"description":"Healthcheck config","properties":{"disable":{"default":false,"description":"Disable healthcheck","type":"boolean"},"interval":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck interval"},"path":{"$ref":"#/definitions/URI","default":"/","description":"Healthcheck path"},"timeout":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck timeout"},"use_get":{"default":false,"description":"Use GET instead of HEAD","type":"boolean"}},"type":"object"},"host":{"anyOf":[{"format":"hostname","type":"string"},{"format":"ipv4","type":"string"},{"format":"ipv6","type":"string"}],"default":"localhost","description":"Stream host"},"idle_timeout":{"$ref":"#/definitions/Duration"},"port":{"$ref":"#/definitions/StreamPort"},"scheme":{"$ref":"#/definitions/StreamScheme","default":"tcp","description":"Stream scheme"},"start_endpoint":{"$ref":"#/definitions/URI"},"stop_method":{"$ref":"#/definitions/StopMethod","default":"stop","description":"Stop method"},"stop_signal":{"$ref":"#/definitions/Signal"},"stop_timeout":{"$ref":"#/definitions/Duration","default":"30s","description":"Stop timeout"},"wake_timeout":{"$ref":"#/definitions/Duration","default":"30s","description":"Wake timeout"}},"required":["port"],"type":"object"}]},"definitions":{"AccessLogFieldMode":{"enum":["drop","keep","redact"],"type":"string"},"AccessLogFormat":{"enum":["combined","common","json"],"type":"string"},"CIDR":{"anyOf":[{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$","type":"string"},{"pattern":"^.*:.*:.*:.*:.*:.*:.*:.*$","type":"string"},{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$","type":"string"},{"pattern":"^::[0-9]*$","type":"string"},{"pattern":"^.*::/[0-9]*$","type":"string"},{"pattern":"^.*:.*::/[0-9]*$","type":"string"}]},"Duration":{"pattern":"^([0-9]+(ms|s|m|h))+$","type":"string"},"HTTPHeader":{"description":"HTTP Header","pattern":"^[a-zA-Z0-9\\-]+$","type":"string"},"LoadBalanceConfig":{"anyOf":[{"additionalProperties":false,"properties":{"link":{"description":"Alias (subdomain or FDN) of load-balancer","minLength":1,"type":"string"},"weight":{"description":"Load-balance weight (reserved for future use)","maximum":100,"minimum":0,"type":"number"}},"required":["link"],"type":"object"},{"additionalProperties":false,"properties":{"link":{"description":"Alias (subdomain or FDN) of load-balancer","minLength":1,"type":"string"},"mode":{"const":"round_robin","type":"string"},"weight":{"description":"Load-balance weight (reserved for future use)","maximum":100,"minimum":0,"type":"number"}},"required":["link","mode"],"type":"object"},{"additionalProperties":false,"properties":{"link":{"description":"Alias (subdomain or FDN) of load-balancer","minLength":1,"type":"string"},"mode":{"const":"least_conn","type":"string"},"weight":{"description":"Load-balance weight (reserved for future use)","maximum":100,"minimum":0,"type":"number"}},"required":["link","mode"],"type":"object"},{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"description":"Real IP config, header to get client IP from","properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"},"use":{"enum":["RealIP","realIP","real_ip"],"type":"string"}},"required":["from","use"],"type":"object"},"link":{"description":"Alias (subdomain or FDN) of load-balancer","minLength":1,"type":"string"},"mode":{"const":"ip_hash","type":"string"},"weight":{"description":"Load-balance weight (reserved for future use)","maximum":100,"minimum":0,"type":"number"}},"required":["config","link","mode"],"type":"object"}]},"MiddlewaresMap":{"anyOf":[{"additionalProperties":false,"properties":{"CIDRWhitelist":{"$ref":"#/definitions/Omit"},"CloudflareRealIP":{"$ref":"#/definitions/Omit"},"CustomErrorPage":{"$ref":"#/definitions/Omit"},"ErrorPage":{"$ref":"#/definitions/Omit"},"HideXForwarded":{"$ref":"#/definitions/Omit"},"ModifyRequest":{"$ref":"#/definitions/Omit"},"ModifyResponse":{"$ref":"#/definitions/Omit"},"OIDC":{"$ref":"#/definitions/Omit"},"RateLimit":{"$ref":"#/definitions/Omit"},"RealIP":{"$ref":"#/definitions/Omit"},"RedirectHTTP":{"$ref":"#/definitions/Omit"},"Request":{"$ref":"#/definitions/Omit"},"Response":{"$ref":"#/definitions/Omit"},"SetXForwarded":{"$ref":"#/definitions/Omit"},"cidrWhitelist":{"$ref":"#/definitions/Omit"},"cidr_whitelist":{"$ref":"#/definitions/Omit"},"cloudflareRealIp":{"$ref":"#/definitions/Omit"},"cloudflare_real_ip":{"$ref":"#/definitions/Omit"},"customErrorPage":{"$ref":"#/definitions/Omit"},"custom_error_page":{"$ref":"#/definitions/Omit"},"errorPage":{"$ref":"#/definitions/Omit"},"error_page":{"$ref":"#/definitions/Omit"},"hideXForwarded":{"$ref":"#/definitions/Omit"},"hide_x_forwarded":{"$ref":"#/definitions/Omit"},"modifyRequest":{"$ref":"#/definitions/Omit"},"modifyResponse":{"$ref":"#/definitions/Omit"},"modify_request":{"$ref":"#/definitions/Omit"},"modify_response":{"$ref":"#/definitions/Omit"},"oidc":{"$ref":"#/definitions/Omit"},"rateLimit":{"$ref":"#/definitions/Omit"},"rate_limit":{"$ref":"#/definitions/Omit"},"realIP":{"$ref":"#/definitions/Omit"},"real_ip":{"$ref":"#/definitions/Omit"},"redirectHTTP":{"$ref":"#/definitions/Omit"},"redirect_http":{"$ref":"#/definitions/Omit"},"request":{"$ref":"#/definitions/Omit"},"response":{"$ref":"#/definitions/Omit"},"setXForwarded":{"$ref":"#/definitions/Omit"},"set_x_forwarded":{"$ref":"#/definitions/Omit"}},"type":"object"},{"type":"object"}]},"Omit":{"additionalProperties":false,"properties":{"allow":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"message":{"default":"IP not allowed","description":"Error message when blocked","type":"string"},"status":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked (alias of status_code)"},"status_code":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked"}},"required":["allow"],"type":"object"},"Omit":{"additionalProperties":false,"properties":{"recursive":{"default":false,"description":"Recursively resolve the IP","type":"boolean"}},"type":"object"},"Omit":{"additionalProperties":false,"type":"object"},"Omit":{"additionalProperties":false,"type":"object"},"Omit":{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"add_prefix":{"description":"Add prefix to request URL","type":"string"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"}},"type":"object"},"Omit":{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"}},"type":"object"},"Omit":{"additionalProperties":false,"properties":{"allowed_groups":{"description":"Allowed groups","items":{"type":"string"},"minItems":1,"type":"array"},"allowed_users":{"description":"Allowed users","items":{"type":"string"},"minItems":1,"type":"array"}},"type":"object"},"Omit":{"additionalProperties":false,"properties":{"average":{"description":"Average number of requests allowed in a period","type":"number"},"burst":{"description":"Maximum number of requests allowed in a period","type":"number"},"period":{"$ref":"#/definitions/Duration","default":"1s","description":"Duration of the rate limit"}},"required":["average","burst"],"type":"object"},"Omit":{"additionalProperties":false,"properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"}},"required":["from"],"type":"object"},"Omit":{"additionalProperties":false,"properties":{"bypass":{"additionalProperties":false,"description":"Bypass redirect","properties":{"user_agents":{"description":"Bypass redirect for user agents","items":{"type":"string"},"type":"array"}},"type":"object"}},"type":"object"},"Omit":{"additionalProperties":false,"type":"object"},"PathPattern":{"pattern":"^(?:([A-Z]+) )?(?:([a-zA-Z0-9.-]+)\\\\/)?(\\\\/[^\\\\s]*)$","type":"string"},"Port":{"maximum":65535,"minimum":0,"type":"integer"},"ProxyScheme":{"enum":["http","https"],"type":"string"},"Signal":{"enum":["","HUP","INT","QUIT","SIGHUP","SIGINT","SIGQUIT","SIGTERM","TERM"],"type":"string"},"StatusCode":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"type":"number"}]},"StatusCodeRange":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"pattern":"^[0-9]*-[0-9]*$","type":"string"},{"type":"number"}]},"StopMethod":{"enum":["kill","pause","stop"],"type":"string"},"StreamPort":{"pattern":"^\\d+:\\d+$","type":"string"},"StreamScheme":{"enum":["tcp","udp"],"type":"string"},"URI":{"format":"uri-reference","type":"string"},"URL":{"format":"uri","type":"string"}},"type":"object"} \ No newline at end of file diff --git a/schemas/index.d.ts b/schemas/index.d.ts deleted file mode 100644 index f078530..0000000 --- a/schemas/index.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -import * as AccessLog from "./config/access_log"; -import * as Autocert from "./config/autocert"; -import * as Config from "./config/config"; -import * as Entrypoint from "./config/entrypoint"; -import * as Notification from "./config/notification"; -import * as Providers from "./config/providers"; -import * as MiddlewareCompose from "./middlewares/middleware_compose"; -import * as Middlewares from "./middlewares/middlewares"; -import * as Healthcheck from "./providers/healthcheck"; -import * as Homepage from "./providers/homepage"; -import * as IdleWatcher from "./providers/idlewatcher"; -import * as LoadBalance from "./providers/loadbalance"; -import * as Routes from "./providers/routes"; -import * as GoDoxy from "./types"; -import ConfigSchema from "./config.schema.json"; -import DockerRoutesSchema from "./docker_routes.schema.json"; -import MiddlewareComposeSchema from "./middleware_compose.schema.json"; -import RoutesSchema from "./routes.schema.json"; -export { - AccessLog, - Autocert, - Config, - ConfigSchema, - DockerRoutesSchema, - Entrypoint, - GoDoxy, - Healthcheck, - Homepage, - IdleWatcher, - LoadBalance, - MiddlewareCompose, - MiddlewareComposeSchema, - Middlewares, - Notification, - Providers, - Routes, - RoutesSchema, -}; diff --git a/schemas/index.js b/schemas/index.js deleted file mode 100644 index 0582c30..0000000 --- a/schemas/index.js +++ /dev/null @@ -1,19 +0,0 @@ -import * as AccessLog from "./config/access_log"; -import * as Autocert from "./config/autocert"; -import * as Config from "./config/config"; -import * as Entrypoint from "./config/entrypoint"; -import * as Notification from "./config/notification"; -import * as Providers from "./config/providers"; -import * as MiddlewareCompose from "./middlewares/middleware_compose"; -import * as Middlewares from "./middlewares/middlewares"; -import * as Healthcheck from "./providers/healthcheck"; -import * as Homepage from "./providers/homepage"; -import * as IdleWatcher from "./providers/idlewatcher"; -import * as LoadBalance from "./providers/loadbalance"; -import * as Routes from "./providers/routes"; -import * as GoDoxy from "./types"; -import ConfigSchema from "./config.schema.json"; -import DockerRoutesSchema from "./docker_routes.schema.json"; -import MiddlewareComposeSchema from "./middleware_compose.schema.json"; -import RoutesSchema from "./routes.schema.json"; -export { AccessLog, Autocert, Config, ConfigSchema, DockerRoutesSchema, Entrypoint, GoDoxy, Healthcheck, Homepage, IdleWatcher, LoadBalance, MiddlewareCompose, MiddlewareComposeSchema, Middlewares, Notification, Providers, Routes, RoutesSchema, }; diff --git a/schemas/index.ts b/schemas/index.ts deleted file mode 100644 index 91da37d..0000000 --- a/schemas/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import * as AccessLog from "./config/access_log"; -import * as Autocert from "./config/autocert"; -import * as Config from "./config/config"; -import * as Entrypoint from "./config/entrypoint"; -import * as Notification from "./config/notification"; -import * as Providers from "./config/providers"; - -import * as MiddlewareCompose from "./middlewares/middleware_compose"; -import * as Middlewares from "./middlewares/middlewares"; - -import * as Healthcheck from "./providers/healthcheck"; -import * as Homepage from "./providers/homepage"; -import * as IdleWatcher from "./providers/idlewatcher"; -import * as LoadBalance from "./providers/loadbalance"; -import * as Routes from "./providers/routes"; - -import * as GoDoxy from "./types"; - -import ConfigSchema from "./config.schema.json"; -import DockerRoutesSchema from "./docker_routes.schema.json"; -import MiddlewareComposeSchema from "./middleware_compose.schema.json"; -import RoutesSchema from "./routes.schema.json"; - -export { - AccessLog, - Autocert, - Config, - ConfigSchema, - DockerRoutesSchema, - Entrypoint, - GoDoxy, - Healthcheck, - Homepage, - IdleWatcher, - LoadBalance, - MiddlewareCompose, - MiddlewareComposeSchema, - Middlewares, - Notification, - Providers, - Routes, - RoutesSchema, -}; diff --git a/schemas/middleware_compose.schema.json b/schemas/middleware_compose.schema.json deleted file mode 100644 index 8e66f87..0000000 --- a/schemas/middleware_compose.schema.json +++ /dev/null @@ -1 +0,0 @@ -{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"CIDR":{"anyOf":[{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$","type":"string"},{"pattern":"^.*:.*:.*:.*:.*:.*:.*:.*$","type":"string"},{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$","type":"string"},{"pattern":"^::[0-9]*$","type":"string"},{"pattern":"^.*::/[0-9]*$","type":"string"},{"pattern":"^.*:.*::/[0-9]*$","type":"string"}]},"Duration":{"pattern":"^([0-9]+(ms|s|m|h))+$","type":"string"},"HTTPHeader":{"description":"HTTP Header","pattern":"^[a-zA-Z0-9\\-]+$","type":"string"},"MiddlewareComposeMap":{"anyOf":[{"additionalProperties":false,"properties":{"use":{"enum":["CustomErrorPage","ErrorPage","customErrorPage","custom_error_page","errorPage","error_page"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"bypass":{"additionalProperties":false,"description":"Bypass redirect","properties":{"user_agents":{"description":"Bypass redirect for user agents","items":{"type":"string"},"type":"array"}},"type":"object"},"use":{"enum":["RedirectHTTP","redirectHTTP","redirect_http"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["SetXForwarded","setXForwarded","set_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"use":{"enum":["HideXForwarded","hideXForwarded","hide_x_forwarded"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allow":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"message":{"default":"IP not allowed","description":"Error message when blocked","type":"string"},"status":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked (alias of status_code)"},"status_code":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked"},"use":{"enum":["CIDRWhitelist","cidrWhitelist","cidr_whitelist"],"type":"string"}},"required":["allow","use"],"type":"object"},{"additionalProperties":false,"properties":{"recursive":{"default":false,"description":"Recursively resolve the IP","type":"boolean"},"use":{"enum":["CloudflareRealIP","cloudflareRealIp","cloudflare_real_ip"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"add_prefix":{"description":"Add prefix to request URL","type":"string"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyRequest","Request","modifyRequest","modify_request","request"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"},"use":{"enum":["ModifyResponse","Response","modifyResponse","modify_response","response"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"allowed_groups":{"description":"Allowed groups","items":{"type":"string"},"minItems":1,"type":"array"},"allowed_users":{"description":"Allowed users","items":{"type":"string"},"minItems":1,"type":"array"},"use":{"enum":["OIDC","oidc"],"type":"string"}},"required":["use"],"type":"object"},{"additionalProperties":false,"properties":{"average":{"description":"Average number of requests allowed in a period","type":"number"},"burst":{"description":"Maximum number of requests allowed in a period","type":"number"},"period":{"$ref":"#/definitions/Duration","default":"1s","description":"Duration of the rate limit"},"use":{"enum":["RateLimit","rateLimit","rate_limit"],"type":"string"}},"required":["average","burst","use"],"type":"object"},{"additionalProperties":false,"properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"},"use":{"enum":["RealIP","realIP","real_ip"],"type":"string"}},"required":["from","use"],"type":"object"}]},"StatusCode":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"type":"number"}]}},"items":{"$ref":"#/definitions/MiddlewareComposeMap"},"type":"array"} \ No newline at end of file diff --git a/schemas/middlewares/middleware_compose.d.ts b/schemas/middlewares/middleware_compose.d.ts deleted file mode 100644 index 132a1b9..0000000 --- a/schemas/middlewares/middleware_compose.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { MiddlewareComposeMap } from "./middlewares"; -export type MiddlewareCompose = MiddlewareComposeMap[]; diff --git a/schemas/middlewares/middleware_compose.js b/schemas/middlewares/middleware_compose.js deleted file mode 100644 index cb0ff5c..0000000 --- a/schemas/middlewares/middleware_compose.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/schemas/middlewares/middleware_compose.ts b/schemas/middlewares/middleware_compose.ts deleted file mode 100644 index 3aef0fb..0000000 --- a/schemas/middlewares/middleware_compose.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { MiddlewareComposeMap } from "./middlewares"; - -export type MiddlewareCompose = MiddlewareComposeMap[]; diff --git a/schemas/middlewares/middlewares.d.ts b/schemas/middlewares/middlewares.d.ts deleted file mode 100644 index 4a0df0d..0000000 --- a/schemas/middlewares/middlewares.d.ts +++ /dev/null @@ -1,186 +0,0 @@ -import * as types from "../types"; -export type KeyOptMapping< - T extends { - use: string; - }, -> = { - [key in T["use"]]?: Omit; -}; -export declare const ALL_MIDDLEWARES: readonly [ - "ErrorPage", - "RedirectHTTP", - "SetXForwarded", - "HideXForwarded", - "CIDRWhitelist", - "CloudflareRealIP", - "ModifyRequest", - "ModifyResponse", - "OIDC", - "RateLimit", - "RealIP", -]; -/** - * @type object - * @patternProperties {"^.*@file$": {"type": "null"}} - */ -export type MiddlewareFileRef = { - [key: `${string}@file`]: null; -}; -export type MiddlewaresMap = - | (KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping) - | MiddlewareFileRef; -export type MiddlewareComposeMap = - | CustomErrorPage - | RedirectHTTP - | SetXForwarded - | HideXForwarded - | CIDRWhitelist - | CloudflareRealIP - | ModifyRequest - | ModifyResponse - | OIDC - | RateLimit - | RealIP; -export type CustomErrorPage = { - use: - | "error_page" - | "errorPage" - | "ErrorPage" - | "custom_error_page" - | "customErrorPage" - | "CustomErrorPage"; -}; -export type RedirectHTTP = { - use: "redirect_http" | "redirectHTTP" | "RedirectHTTP"; - /** Bypass redirect */ - bypass?: { - /** Bypass redirect for user agents */ - user_agents?: string[]; - }; -}; -export type SetXForwarded = { - use: "set_x_forwarded" | "setXForwarded" | "SetXForwarded"; -}; -export type HideXForwarded = { - use: "hide_x_forwarded" | "hideXForwarded" | "HideXForwarded"; -}; -export type CIDRWhitelist = { - use: "cidr_whitelist" | "cidrWhitelist" | "CIDRWhitelist"; - allow: types.CIDR[]; - /** HTTP status code when blocked - * - * @default 403 - */ - status_code?: types.StatusCode; - /** HTTP status code when blocked (alias of status_code) - * - * @default 403 - */ - status?: types.StatusCode; - /** Error message when blocked - * - * @default "IP not allowed" - */ - message?: string; -}; -export type CloudflareRealIP = { - use: "cloudflare_real_ip" | "cloudflareRealIp" | "CloudflareRealIP"; - /** Recursively resolve the IP - * - * @default false - */ - recursive?: boolean; -}; -export type ModifyRequest = { - use: - | "request" - | "Request" - | "modify_request" - | "modifyRequest" - | "ModifyRequest"; - /** Set HTTP headers */ - set_headers?: { - [key: types.HTTPHeader]: string; - }; - /** Add HTTP headers */ - add_headers?: { - [key: types.HTTPHeader]: string; - }; - /** Hide HTTP headers */ - hide_headers?: types.HTTPHeader[]; - /** Add prefix to request URL */ - add_prefix?: string; -}; -export type ModifyResponse = { - use: - | "response" - | "Response" - | "modify_response" - | "modifyResponse" - | "ModifyResponse"; - /** Set HTTP headers */ - set_headers?: { - [key: types.HTTPHeader]: string; - }; - /** Add HTTP headers */ - add_headers?: { - [key: types.HTTPHeader]: string; - }; - /** Hide HTTP headers */ - hide_headers?: types.HTTPHeader[]; -}; -export type OIDC = { - use: "oidc" | "OIDC"; - /** Allowed users - * - * @minItems 1 - */ - allowed_users?: string[]; - /** Allowed groups - * - * @minItems 1 - */ - allowed_groups?: string[]; -}; -export type RateLimit = { - use: "rate_limit" | "rateLimit" | "RateLimit"; - /** Average number of requests allowed in a period - * - * @min 1 - */ - average: number; - /** Maximum number of requests allowed in a period - * - * @min 1 - */ - burst: number; - /** Duration of the rate limit - * - * @default 1s - */ - period?: types.Duration; -}; -export type RealIP = { - use: "real_ip" | "realIP" | "RealIP"; - /** Header to get the client IP from - * - * @default "X-Real-IP" - */ - header?: types.HTTPHeader; - from: types.CIDR[]; - /** Recursive resolve the IP - * - * @default false - */ - recursive?: boolean; -}; diff --git a/schemas/middlewares/middlewares.js b/schemas/middlewares/middlewares.js deleted file mode 100644 index 4c8a98a..0000000 --- a/schemas/middlewares/middlewares.js +++ /dev/null @@ -1,13 +0,0 @@ -export const ALL_MIDDLEWARES = [ - "ErrorPage", - "RedirectHTTP", - "SetXForwarded", - "HideXForwarded", - "CIDRWhitelist", - "CloudflareRealIP", - "ModifyRequest", - "ModifyResponse", - "OIDC", - "RateLimit", - "RealIP", -]; diff --git a/schemas/middlewares/middlewares.ts b/schemas/middlewares/middlewares.ts deleted file mode 100644 index 9557f87..0000000 --- a/schemas/middlewares/middlewares.ts +++ /dev/null @@ -1,190 +0,0 @@ -import * as types from "../types"; - -export type KeyOptMapping = { - [key in T["use"]]?: Omit; -}; - -export const ALL_MIDDLEWARES = [ - "ErrorPage", - "RedirectHTTP", - "SetXForwarded", - "HideXForwarded", - "CIDRWhitelist", - "CloudflareRealIP", - "ModifyRequest", - "ModifyResponse", - "OIDC", - "RateLimit", - "RealIP", -] as const; - -/** - * @type object - * @patternProperties {"^.*@file$": {"type": "null"}} - */ -export type MiddlewareFileRef = { - [key: `${string}@file`]: null; -}; - -export type MiddlewaresMap = - | (KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping & - KeyOptMapping) - | MiddlewareFileRef; - -export type MiddlewareComposeMap = - | CustomErrorPage - | RedirectHTTP - | SetXForwarded - | HideXForwarded - | CIDRWhitelist - | CloudflareRealIP - | ModifyRequest - | ModifyResponse - | OIDC - | RateLimit - | RealIP; - -export type CustomErrorPage = { - use: - | "error_page" - | "errorPage" - | "ErrorPage" - | "custom_error_page" - | "customErrorPage" - | "CustomErrorPage"; -}; - -export type RedirectHTTP = { - use: "redirect_http" | "redirectHTTP" | "RedirectHTTP"; - /** Bypass redirect */ - bypass?: { - /** Bypass redirect for user agents */ - user_agents?: string[]; - }; -}; - -export type SetXForwarded = { - use: "set_x_forwarded" | "setXForwarded" | "SetXForwarded"; -}; -export type HideXForwarded = { - use: "hide_x_forwarded" | "hideXForwarded" | "HideXForwarded"; -}; - -export type CIDRWhitelist = { - use: "cidr_whitelist" | "cidrWhitelist" | "CIDRWhitelist"; - /* Allowed CIDRs/IPs */ - allow: types.CIDR[]; - /** HTTP status code when blocked - * - * @default 403 - */ - status_code?: types.StatusCode; - /** HTTP status code when blocked (alias of status_code) - * - * @default 403 - */ - status?: types.StatusCode; - /** Error message when blocked - * - * @default "IP not allowed" - */ - message?: string; -}; - -export type CloudflareRealIP = { - use: "cloudflare_real_ip" | "cloudflareRealIp" | "CloudflareRealIP"; - /** Recursively resolve the IP - * - * @default false - */ - recursive?: boolean; -}; - -export type ModifyRequest = { - use: - | "request" - | "Request" - | "modify_request" - | "modifyRequest" - | "ModifyRequest"; - /** Set HTTP headers */ - set_headers?: { [key: types.HTTPHeader]: string }; - /** Add HTTP headers */ - add_headers?: { [key: types.HTTPHeader]: string }; - /** Hide HTTP headers */ - hide_headers?: types.HTTPHeader[]; - /** Add prefix to request URL */ - add_prefix?: string; -}; - -export type ModifyResponse = { - use: - | "response" - | "Response" - | "modify_response" - | "modifyResponse" - | "ModifyResponse"; - /** Set HTTP headers */ - set_headers?: { [key: types.HTTPHeader]: string }; - /** Add HTTP headers */ - add_headers?: { [key: types.HTTPHeader]: string }; - /** Hide HTTP headers */ - hide_headers?: types.HTTPHeader[]; -}; - -export type OIDC = { - use: "oidc" | "OIDC"; - /** Allowed users - * - * @minItems 1 - */ - allowed_users?: string[]; - /** Allowed groups - * - * @minItems 1 - */ - allowed_groups?: string[]; -}; - -export type RateLimit = { - use: "rate_limit" | "rateLimit" | "RateLimit"; - /** Average number of requests allowed in a period - * - * @min 1 - */ - average: number; - /** Maximum number of requests allowed in a period - * - * @min 1 - */ - burst: number; - /** Duration of the rate limit - * - * @default 1s - */ - period?: types.Duration; -}; - -export type RealIP = { - use: "real_ip" | "realIP" | "RealIP"; - /** Header to get the client IP from - * - * @default "X-Real-IP" - */ - header?: types.HTTPHeader; - from: types.CIDR[]; - /** Recursive resolve the IP - * - * @default false - */ - recursive?: boolean; -}; diff --git a/schemas/package.json b/schemas/package.json deleted file mode 100644 index 1ca9a19..0000000 --- a/schemas/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "godoxy-schemas", - "version": "0.10.1-6", - "description": "JSON Schema and typescript types for GoDoxy configuration", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/yusing/godoxy" - }, - "files": [ - "**/*.ts", - "**/*.js", - "*.schema.json", - "../README.md", - "../LICENSE" - ], - "type": "module", - "main": "./index.ts", - "exports": { - ".": { - "types": "./index.d.ts", - "import": "./index.ts", - "require": "./index.js" - } - }, - "devDependencies": { - "prettier": "^3.5.3", - "typescript": "^5.8.3", - "typescript-json-schema": "^0.65.1" - }, - "displayName": "GoDoxy Types", - "packageManager": "bun@1.2.9", - "publisher": "yusing", - "scripts": { - "format:write": "prettier --write \"**/*.ts\" --cache" - } -} \ No newline at end of file diff --git a/schemas/providers/healthcheck.d.ts b/schemas/providers/healthcheck.d.ts deleted file mode 100644 index 05b6df5..0000000 --- a/schemas/providers/healthcheck.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Duration, URI } from "../types"; -/** - * @additionalProperties false - */ -export type HealthcheckConfig = { - /** Disable healthcheck - * - * @default false - */ - disable?: boolean; - /** Healthcheck path - * - * @default / - */ - path?: URI; - /** - * Use GET instead of HEAD - * - * @default false - */ - use_get?: boolean; - /** Healthcheck interval - * - * @default 5s - */ - interval?: Duration; - /** Healthcheck timeout - * - * @default 5s - */ - timeout?: Duration; -}; diff --git a/schemas/providers/healthcheck.js b/schemas/providers/healthcheck.js deleted file mode 100644 index cb0ff5c..0000000 --- a/schemas/providers/healthcheck.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/schemas/providers/healthcheck.ts b/schemas/providers/healthcheck.ts deleted file mode 100644 index fc2853e..0000000 --- a/schemas/providers/healthcheck.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Duration, URI } from "../types"; - -/** - * @additionalProperties false - */ -export type HealthcheckConfig = { - /** Disable healthcheck - * - * @default false - */ - disable?: boolean; - /** Healthcheck path - * - * @default / - */ - path?: URI; - /** - * Use GET instead of HEAD - * - * @default false - */ - use_get?: boolean; - /** Healthcheck interval - * - * @default 5s - */ - interval?: Duration; - /** Healthcheck timeout - * - * @default 5s - */ - timeout?: Duration; -}; diff --git a/schemas/providers/homepage.d.ts b/schemas/providers/homepage.d.ts deleted file mode 100644 index a51a129..0000000 --- a/schemas/providers/homepage.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { URL } from "../types"; -/** - * @additionalProperties false - */ -export type HomepageConfig = { - /** Whether show in dashboard - * - * @default true - */ - show?: boolean; - name?: string; - icon?: URL | WalkxcodeIcon | ExternalIcon | TargetRelativeIconPath; - description?: string; - url?: URL; - category?: string; - widget_config?: { - [key: string]: any; - }; -}; -/** Walkxcode icon - * - * @pattern ^(png|svg|webp)\/[\w\d\-_]+\.\1 - * @type string - */ -export type WalkxcodeIcon = string & {}; -export type ExternalIcon = `@${"selfhst" | "walkxcode"}/${string}.${string}`; -export type TargetRelativeIconPath = `@target/${string}` | `/${string}`; diff --git a/schemas/providers/homepage.js b/schemas/providers/homepage.js deleted file mode 100644 index cb0ff5c..0000000 --- a/schemas/providers/homepage.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/schemas/providers/homepage.ts b/schemas/providers/homepage.ts deleted file mode 100644 index e40791f..0000000 --- a/schemas/providers/homepage.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { URL } from "../types"; - -/** - * @additionalProperties false - */ -export type HomepageConfig = { - /** Whether show in dashboard - * - * @default true - */ - show?: boolean; - /* Display name on dashboard */ - name?: string; - /* Display icon on dashboard */ - icon?: URL | WalkxcodeIcon | ExternalIcon | TargetRelativeIconPath; - /* App description */ - description?: string; - /* Override url */ - url?: URL; - /* App category */ - category?: string; - /* Widget config */ - widget_config?: { - [key: string]: any; - }; -}; - -/** Walkxcode icon - * - * @pattern ^(png|svg|webp)\/[\w\d\-_]+\.\1 - * @type string - */ -export type WalkxcodeIcon = string & {}; - -/* Walkxcode / selfh.st icon */ -export type ExternalIcon = `@${"selfhst" | "walkxcode"}/${string}.${string}`; - -/* Relative path to proxy target */ -export type TargetRelativeIconPath = `@target/${string}` | `/${string}`; diff --git a/schemas/providers/idlewatcher.d.ts b/schemas/providers/idlewatcher.d.ts deleted file mode 100644 index ed5daf5..0000000 --- a/schemas/providers/idlewatcher.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Duration, URI } from "../types"; -export declare const STOP_METHODS: readonly ["pause", "stop", "kill"]; -export type StopMethod = (typeof STOP_METHODS)[number]; -export declare const STOP_SIGNALS: readonly [ - "", - "SIGINT", - "SIGTERM", - "SIGHUP", - "SIGQUIT", - "INT", - "TERM", - "HUP", - "QUIT", -]; -export type Signal = (typeof STOP_SIGNALS)[number]; -export type IdleWatcherConfig = { - idle_timeout?: Duration; - /** Wake timeout - * - * @default 30s - */ - wake_timeout?: Duration; - /** Stop timeout - * - * @default 30s - */ - stop_timeout?: Duration; - /** Stop method - * - * @default stop - */ - stop_method?: StopMethod; - stop_signal?: Signal; - start_endpoint?: URI; -}; diff --git a/schemas/providers/idlewatcher.js b/schemas/providers/idlewatcher.js deleted file mode 100644 index 3af0328..0000000 --- a/schemas/providers/idlewatcher.js +++ /dev/null @@ -1,12 +0,0 @@ -export const STOP_METHODS = ["pause", "stop", "kill"]; -export const STOP_SIGNALS = [ - "", - "SIGINT", - "SIGTERM", - "SIGHUP", - "SIGQUIT", - "INT", - "TERM", - "HUP", - "QUIT", -]; diff --git a/schemas/providers/idlewatcher.ts b/schemas/providers/idlewatcher.ts deleted file mode 100644 index 8047f1c..0000000 --- a/schemas/providers/idlewatcher.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Duration, URI } from "../types"; - -export const STOP_METHODS = ["pause", "stop", "kill"] as const; -export type StopMethod = (typeof STOP_METHODS)[number]; - -export const STOP_SIGNALS = [ - "", - "SIGINT", - "SIGTERM", - "SIGHUP", - "SIGQUIT", - "INT", - "TERM", - "HUP", - "QUIT", -] as const; -export type Signal = (typeof STOP_SIGNALS)[number]; - -export type IdleWatcherConfig = { - /* Idle timeout */ - idle_timeout?: Duration; - /** Wake timeout - * - * @default 30s - */ - wake_timeout?: Duration; - /** Stop timeout - * - * @default 30s - */ - stop_timeout?: Duration; - /** Stop method - * - * @default stop - */ - stop_method?: StopMethod; - /* Stop signal */ - stop_signal?: Signal; - /* Start endpoint (any path can wake the container if not specified) */ - start_endpoint?: URI; -}; diff --git a/schemas/providers/loadbalance.d.ts b/schemas/providers/loadbalance.d.ts deleted file mode 100644 index c2ccdcd..0000000 --- a/schemas/providers/loadbalance.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { RealIP } from "../middlewares/middlewares"; -export declare const LOAD_BALANCE_MODES: readonly [ - "round_robin", - "least_conn", - "ip_hash", -]; -export type LoadBalanceMode = (typeof LOAD_BALANCE_MODES)[number]; -export type LoadBalanceConfigBase = { - /** Alias (subdomain or FDN) of load-balancer - * - * @minLength 1 - */ - link: string; - /** Load-balance weight (reserved for future use) - * - * @minimum 0 - * @maximum 100 - */ - weight?: number; -}; -export type LoadBalanceConfig = LoadBalanceConfigBase & - ( - | {} - | RoundRobinLoadBalanceConfig - | LeastConnLoadBalanceConfig - | IPHashLoadBalanceConfig - ); -export type IPHashLoadBalanceConfig = { - mode: "ip_hash"; - /** Real IP config, header to get client IP from */ - config: RealIP; -}; -export type LeastConnLoadBalanceConfig = { - mode: "least_conn"; -}; -export type RoundRobinLoadBalanceConfig = { - mode: "round_robin"; -}; diff --git a/schemas/providers/loadbalance.js b/schemas/providers/loadbalance.js deleted file mode 100644 index da3887d..0000000 --- a/schemas/providers/loadbalance.js +++ /dev/null @@ -1,5 +0,0 @@ -export const LOAD_BALANCE_MODES = [ - "round_robin", - "least_conn", - "ip_hash", -]; diff --git a/schemas/providers/loadbalance.ts b/schemas/providers/loadbalance.ts deleted file mode 100644 index 4d29fdf..0000000 --- a/schemas/providers/loadbalance.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { RealIP } from "../middlewares/middlewares"; - -export const LOAD_BALANCE_MODES = [ - "round_robin", - "least_conn", - "ip_hash", -] as const; -export type LoadBalanceMode = (typeof LOAD_BALANCE_MODES)[number]; - -export type LoadBalanceConfigBase = { - /** Alias (subdomain or FDN) of load-balancer - * - * @minLength 1 - */ - link: string; - /** Load-balance weight (reserved for future use) - * - * @minimum 0 - * @maximum 100 - */ - weight?: number; -}; - -export type LoadBalanceConfig = LoadBalanceConfigBase & - ( - | {} // linking other routes - | RoundRobinLoadBalanceConfig - | LeastConnLoadBalanceConfig - | IPHashLoadBalanceConfig - ); - -export type IPHashLoadBalanceConfig = { - mode: "ip_hash"; - /** Real IP config, header to get client IP from */ - config: RealIP; -}; - -export type LeastConnLoadBalanceConfig = { - mode: "least_conn"; -}; - -export type RoundRobinLoadBalanceConfig = { - mode: "round_robin"; -}; diff --git a/schemas/providers/routes.d.ts b/schemas/providers/routes.d.ts deleted file mode 100644 index 4aaed50..0000000 --- a/schemas/providers/routes.d.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { AccessLogConfig } from "../config/access_log"; -import { accessLogExamples } from "../config/entrypoint"; -import { MiddlewaresMap } from "../middlewares/middlewares"; -import { - Duration, - Hostname, - IPv4, - IPv6, - PathPattern, - Port, - StreamPort, -} from "../types"; -import { HealthcheckConfig } from "./healthcheck"; -import { HomepageConfig } from "./homepage"; -import { LoadBalanceConfig } from "./loadbalance"; -export declare const PROXY_SCHEMES: readonly ["http", "https"]; -export declare const STREAM_SCHEMES: readonly ["tcp", "udp"]; -export type ProxyScheme = (typeof PROXY_SCHEMES)[number]; -export type StreamScheme = (typeof STREAM_SCHEMES)[number]; -export type Route = ReverseProxyRoute | FileServerRoute | StreamRoute; -export type Routes = { - [key: string]: Route; -}; -export type ReverseProxyRoute = { - /** Alias (subdomain or FDN) - * @minLength 1 - */ - alias?: string; - /** Proxy scheme - * - * @default http - */ - scheme?: ProxyScheme; - /** Proxy host - * - * @default localhost - */ - host?: Hostname | IPv4 | IPv6; - /** Proxy port - * - * @default 80 - */ - port?: Port; - /** Skip TLS verification - * - * @default false - */ - no_tls_verify?: boolean; - /** Response header timeout - * - * @default 60s - */ - response_header_timeout?: Duration; - /** Path patterns (only patterns that match will be proxied). - * - * See https://pkg.go.dev/net/http#hdr-Patterns-ServeMux - */ - path_patterns?: PathPattern[]; - /** Healthcheck config */ - healthcheck?: HealthcheckConfig; - /** Load balance config */ - load_balance?: LoadBalanceConfig; - /** Middlewares */ - middlewares?: MiddlewaresMap; - /** Homepage config - * - * @examples require(".").homepageExamples - */ - homepage?: HomepageConfig; - /** Access log config - * - * @examples require(".").accessLogExamples - */ - access_log?: AccessLogConfig; -}; -export type FileServerRoute = { - /** Alias (subdomain or FDN) - * @minLength 1 - */ - alias?: string; - scheme: "fileserver"; - root: string; - /** Path patterns (only patterns that match will be proxied). - * - * See https://pkg.go.dev/net/http#hdr-Patterns-ServeMux - */ - path_patterns?: PathPattern[]; - /** Middlewares */ - middlewares?: MiddlewaresMap; - /** Homepage config - * - * @examples require(".").homepageExamples - */ - homepage?: HomepageConfig; - /** Access log config - * - * @examples require(".").accessLogExamples - */ - access_log?: AccessLogConfig; - /** Healthcheck config */ - healthcheck?: HealthcheckConfig; -}; -export type StreamRoute = { - /** Alias (subdomain or FDN) - * @minLength 1 - */ - alias?: string; - /** Stream scheme - * - * @default tcp - */ - scheme?: StreamScheme; - /** Stream host - * - * @default localhost - */ - host?: Hostname | IPv4 | IPv6; - port: StreamPort; - /** Healthcheck config */ - healthcheck?: HealthcheckConfig; -}; -export declare const homepageExamples: ( - | { - name: string; - icon: string; - category: string; - } - | { - name: string; - icon: string; - category?: undefined; - } -)[]; -export declare const loadBalanceExamples: ( - | { - link: string; - mode: string; - config?: undefined; - } - | { - link: string; - mode: string; - config: { - header: string; - }; - } -)[]; -export { accessLogExamples }; diff --git a/schemas/providers/routes.js b/schemas/providers/routes.js deleted file mode 100644 index 931e113..0000000 --- a/schemas/providers/routes.js +++ /dev/null @@ -1,28 +0,0 @@ -import { accessLogExamples } from "../config/entrypoint"; -export const PROXY_SCHEMES = ["http", "https"]; -export const STREAM_SCHEMES = ["tcp", "udp"]; -export const homepageExamples = [ - { - name: "Sonarr", - icon: "png/sonarr.png", - category: "Arr suite", - }, - { - name: "App", - icon: "@target/favicon.ico", - }, -]; -export const loadBalanceExamples = [ - { - link: "flaresolverr", - mode: "round_robin", - }, - { - link: "service.domain.com", - mode: "ip_hash", - config: { - header: "X-Real-IP", - }, - }, -]; -export { accessLogExamples }; diff --git a/schemas/providers/routes.ts b/schemas/providers/routes.ts deleted file mode 100644 index 29ab6d8..0000000 --- a/schemas/providers/routes.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { AccessLogConfig } from "../config/access_log"; -import { accessLogExamples } from "../config/entrypoint"; -import { MiddlewaresMap } from "../middlewares/middlewares"; -import { - Duration, - Hostname, - IPv4, - IPv6, - PathPattern, - Port, - StreamPort, -} from "../types"; -import { HealthcheckConfig } from "./healthcheck"; -import { HomepageConfig } from "./homepage"; -import { LoadBalanceConfig } from "./loadbalance"; -export const PROXY_SCHEMES = ["http", "https"] as const; -export const STREAM_SCHEMES = ["tcp", "udp"] as const; - -export type ProxyScheme = (typeof PROXY_SCHEMES)[number]; -export type StreamScheme = (typeof STREAM_SCHEMES)[number]; - -export type Route = ReverseProxyRoute | FileServerRoute | StreamRoute; -export type Routes = { - [key: string]: Route; -}; - -export type ReverseProxyRoute = { - /** Alias (subdomain or FDN) - * @minLength 1 - */ - alias?: string; - /** Proxy scheme - * - * @default http - */ - scheme?: ProxyScheme; - /** Proxy host - * - * @default localhost - */ - host?: Hostname | IPv4 | IPv6; - /** Proxy port - * - * @default 80 - */ - port?: Port; - /** Skip TLS verification - * - * @default false - */ - no_tls_verify?: boolean; - /** Response header timeout - * - * @default 60s - */ - response_header_timeout?: Duration; - /** Path patterns (only patterns that match will be proxied). - * - * See https://pkg.go.dev/net/http#hdr-Patterns-ServeMux - */ - path_patterns?: PathPattern[]; - /** Healthcheck config */ - healthcheck?: HealthcheckConfig; - /** Load balance config */ - load_balance?: LoadBalanceConfig; - /** Middlewares */ - middlewares?: MiddlewaresMap; - /** Homepage config - * - * @examples require(".").homepageExamples - */ - homepage?: HomepageConfig; - /** Access log config - * - * @examples require(".").accessLogExamples - */ - access_log?: AccessLogConfig; -}; - -export type FileServerRoute = { - /** Alias (subdomain or FDN) - * @minLength 1 - */ - alias?: string; - scheme: "fileserver"; - /* File server root path */ - root: string; - /** Path patterns (only patterns that match will be proxied). - * - * See https://pkg.go.dev/net/http#hdr-Patterns-ServeMux - */ - path_patterns?: PathPattern[]; - /** Middlewares */ - middlewares?: MiddlewaresMap; - /** Homepage config - * - * @examples require(".").homepageExamples - */ - homepage?: HomepageConfig; - /** Access log config - * - * @examples require(".").accessLogExamples - */ - access_log?: AccessLogConfig; - /** Healthcheck config */ - healthcheck?: HealthcheckConfig; -}; - -export type StreamRoute = { - /** Alias (subdomain or FDN) - * @minLength 1 - */ - alias?: string; - /** Stream scheme - * - * @default tcp - */ - scheme?: StreamScheme; - /** Stream host - * - * @default localhost - */ - host?: Hostname | IPv4 | IPv6; - /* Stream port */ - port: StreamPort; - /** Healthcheck config */ - healthcheck?: HealthcheckConfig; -}; - -export const homepageExamples = [ - { - name: "Sonarr", - icon: "png/sonarr.png", - category: "Arr suite", - }, - { - name: "App", - icon: "@target/favicon.ico", - }, -]; - -export const loadBalanceExamples = [ - { - link: "flaresolverr", - mode: "round_robin", - }, - { - link: "service.domain.com", - mode: "ip_hash", - config: { - header: "X-Real-IP", - }, - }, -]; - -export { accessLogExamples }; diff --git a/schemas/routes.schema.json b/schemas/routes.schema.json deleted file mode 100644 index 5c2be97..0000000 --- a/schemas/routes.schema.json +++ /dev/null @@ -1 +0,0 @@ -{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":{"$ref":"#/definitions/Route"},"definitions":{"AccessLogFieldMode":{"enum":["drop","keep","redact"],"type":"string"},"AccessLogFormat":{"enum":["combined","common","json"],"type":"string"},"CIDR":{"anyOf":[{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$","type":"string"},{"pattern":"^.*:.*:.*:.*:.*:.*:.*:.*$","type":"string"},{"pattern":"^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$","type":"string"},{"pattern":"^::[0-9]*$","type":"string"},{"pattern":"^.*::/[0-9]*$","type":"string"},{"pattern":"^.*:.*::/[0-9]*$","type":"string"}]},"Duration":{"pattern":"^([0-9]+(ms|s|m|h))+$","type":"string"},"HTTPHeader":{"description":"HTTP Header","pattern":"^[a-zA-Z0-9\\-]+$","type":"string"},"LoadBalanceConfig":{"anyOf":[{"additionalProperties":false,"properties":{"link":{"description":"Alias (subdomain or FDN) of load-balancer","minLength":1,"type":"string"},"weight":{"description":"Load-balance weight (reserved for future use)","maximum":100,"minimum":0,"type":"number"}},"required":["link"],"type":"object"},{"additionalProperties":false,"properties":{"link":{"description":"Alias (subdomain or FDN) of load-balancer","minLength":1,"type":"string"},"mode":{"const":"round_robin","type":"string"},"weight":{"description":"Load-balance weight (reserved for future use)","maximum":100,"minimum":0,"type":"number"}},"required":["link","mode"],"type":"object"},{"additionalProperties":false,"properties":{"link":{"description":"Alias (subdomain or FDN) of load-balancer","minLength":1,"type":"string"},"mode":{"const":"least_conn","type":"string"},"weight":{"description":"Load-balance weight (reserved for future use)","maximum":100,"minimum":0,"type":"number"}},"required":["link","mode"],"type":"object"},{"additionalProperties":false,"properties":{"config":{"additionalProperties":false,"description":"Real IP config, header to get client IP from","properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"},"use":{"enum":["RealIP","realIP","real_ip"],"type":"string"}},"required":["from","use"],"type":"object"},"link":{"description":"Alias (subdomain or FDN) of load-balancer","minLength":1,"type":"string"},"mode":{"const":"ip_hash","type":"string"},"weight":{"description":"Load-balance weight (reserved for future use)","maximum":100,"minimum":0,"type":"number"}},"required":["config","link","mode"],"type":"object"}]},"MiddlewaresMap":{"anyOf":[{"additionalProperties":false,"properties":{"CIDRWhitelist":{"$ref":"#/definitions/Omit"},"CloudflareRealIP":{"$ref":"#/definitions/Omit"},"CustomErrorPage":{"$ref":"#/definitions/Omit"},"ErrorPage":{"$ref":"#/definitions/Omit"},"HideXForwarded":{"$ref":"#/definitions/Omit"},"ModifyRequest":{"$ref":"#/definitions/Omit"},"ModifyResponse":{"$ref":"#/definitions/Omit"},"OIDC":{"$ref":"#/definitions/Omit"},"RateLimit":{"$ref":"#/definitions/Omit"},"RealIP":{"$ref":"#/definitions/Omit"},"RedirectHTTP":{"$ref":"#/definitions/Omit"},"Request":{"$ref":"#/definitions/Omit"},"Response":{"$ref":"#/definitions/Omit"},"SetXForwarded":{"$ref":"#/definitions/Omit"},"cidrWhitelist":{"$ref":"#/definitions/Omit"},"cidr_whitelist":{"$ref":"#/definitions/Omit"},"cloudflareRealIp":{"$ref":"#/definitions/Omit"},"cloudflare_real_ip":{"$ref":"#/definitions/Omit"},"customErrorPage":{"$ref":"#/definitions/Omit"},"custom_error_page":{"$ref":"#/definitions/Omit"},"errorPage":{"$ref":"#/definitions/Omit"},"error_page":{"$ref":"#/definitions/Omit"},"hideXForwarded":{"$ref":"#/definitions/Omit"},"hide_x_forwarded":{"$ref":"#/definitions/Omit"},"modifyRequest":{"$ref":"#/definitions/Omit"},"modifyResponse":{"$ref":"#/definitions/Omit"},"modify_request":{"$ref":"#/definitions/Omit"},"modify_response":{"$ref":"#/definitions/Omit"},"oidc":{"$ref":"#/definitions/Omit"},"rateLimit":{"$ref":"#/definitions/Omit"},"rate_limit":{"$ref":"#/definitions/Omit"},"realIP":{"$ref":"#/definitions/Omit"},"real_ip":{"$ref":"#/definitions/Omit"},"redirectHTTP":{"$ref":"#/definitions/Omit"},"redirect_http":{"$ref":"#/definitions/Omit"},"request":{"$ref":"#/definitions/Omit"},"response":{"$ref":"#/definitions/Omit"},"setXForwarded":{"$ref":"#/definitions/Omit"},"set_x_forwarded":{"$ref":"#/definitions/Omit"}},"type":"object"},{"type":"object"}]},"Omit":{"additionalProperties":false,"properties":{"allow":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"message":{"default":"IP not allowed","description":"Error message when blocked","type":"string"},"status":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked (alias of status_code)"},"status_code":{"$ref":"#/definitions/StatusCode","default":403,"description":"HTTP status code when blocked"}},"required":["allow"],"type":"object"},"Omit":{"additionalProperties":false,"properties":{"recursive":{"default":false,"description":"Recursively resolve the IP","type":"boolean"}},"type":"object"},"Omit":{"additionalProperties":false,"type":"object"},"Omit":{"additionalProperties":false,"type":"object"},"Omit":{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"add_prefix":{"description":"Add prefix to request URL","type":"string"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"}},"type":"object"},"Omit":{"additionalProperties":false,"properties":{"add_headers":{"additionalProperties":false,"description":"Add HTTP headers","items":{"type":"string"},"type":"array"},"hide_headers":{"description":"Hide HTTP headers","items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"},"set_headers":{"additionalProperties":false,"description":"Set HTTP headers","items":{"type":"string"},"type":"array"}},"type":"object"},"Omit":{"additionalProperties":false,"properties":{"allowed_groups":{"description":"Allowed groups","items":{"type":"string"},"minItems":1,"type":"array"},"allowed_users":{"description":"Allowed users","items":{"type":"string"},"minItems":1,"type":"array"}},"type":"object"},"Omit":{"additionalProperties":false,"properties":{"average":{"description":"Average number of requests allowed in a period","type":"number"},"burst":{"description":"Maximum number of requests allowed in a period","type":"number"},"period":{"$ref":"#/definitions/Duration","default":"1s","description":"Duration of the rate limit"}},"required":["average","burst"],"type":"object"},"Omit":{"additionalProperties":false,"properties":{"from":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"},"header":{"$ref":"#/definitions/HTTPHeader","default":"X-Real-IP","description":"Header to get the client IP from"},"recursive":{"default":false,"description":"Recursive resolve the IP","type":"boolean"}},"required":["from"],"type":"object"},"Omit":{"additionalProperties":false,"properties":{"bypass":{"additionalProperties":false,"description":"Bypass redirect","properties":{"user_agents":{"description":"Bypass redirect for user agents","items":{"type":"string"},"type":"array"}},"type":"object"}},"type":"object"},"Omit":{"additionalProperties":false,"type":"object"},"PathPattern":{"pattern":"^(?:([A-Z]+) )?(?:([a-zA-Z0-9.-]+)\\\\/)?(\\\\/[^\\\\s]*)$","type":"string"},"Port":{"maximum":65535,"minimum":0,"type":"integer"},"ProxyScheme":{"enum":["http","https"],"type":"string"},"Route":{"anyOf":[{"additionalProperties":false,"properties":{"access_log":{"additionalProperties":false,"description":"Access log config","examples":[{"fields":{"headers":{"config":{"foo":"redact"},"default":"keep"}},"filters":{"status_codes":{"values":["200-299"]}},"format":"combined","path":"/var/log/access.log"}],"properties":{"buffer_size":{"default":65536,"description":"The size of the buffer.","minimum":0,"type":"integer"},"fields":{"additionalProperties":false,"properties":{"cookie":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"header":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"query":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"}},"type":"object"},"filters":{"additionalProperties":false,"properties":{"cidr":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"}},"required":["values"],"type":"object"},"headers":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"}},"required":["values"],"type":"object"},"host":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"method":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"enum":["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"],"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"status_code":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/StatusCodeRange"},"type":"array"}},"required":["values"],"type":"object"}},"type":"object"},"format":{"$ref":"#/definitions/AccessLogFormat","default":"combined","description":"The format of the access log."},"path":{"$ref":"#/definitions/URI"}},"required":["path"],"type":"object"},"alias":{"description":"Alias (subdomain or FDN)","minLength":1,"type":"string"},"healthcheck":{"additionalProperties":false,"description":"Healthcheck config","properties":{"disable":{"default":false,"description":"Disable healthcheck","type":"boolean"},"interval":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck interval"},"path":{"$ref":"#/definitions/URI","default":"/","description":"Healthcheck path"},"timeout":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck timeout"},"use_get":{"default":false,"description":"Use GET instead of HEAD","type":"boolean"}},"type":"object"},"homepage":{"additionalProperties":false,"description":"Homepage config","examples":[{"category":"Arr suite","icon":"png/sonarr.png","name":"Sonarr"},{"icon":"@target/favicon.ico","name":"App"}],"properties":{"category":{"type":"string"},"description":{"type":"string"},"icon":{"anyOf":[{"format":"uri","type":"string"},{"description":"Walkxcode icon","pattern":"^(png|svg|webp)\\/[\\w\\d\\-_]+\\.\\1","type":"string"},{"pattern":"^@selfhst/.*\\..*$","type":"string"},{"pattern":"^@walkxcode/.*\\..*$","type":"string"},{"pattern":"^@target/.*$","type":"string"},{"pattern":"^/.*$","type":"string"}]},"name":{"type":"string"},"show":{"default":true,"description":"Whether show in dashboard","type":"boolean"},"url":{"$ref":"#/definitions/URL"},"widget_config":{"additionalProperties":{},"type":"object"}},"type":"object"},"host":{"anyOf":[{"format":"hostname","type":"string"},{"format":"ipv4","type":"string"},{"format":"ipv6","type":"string"}],"default":"localhost","description":"Proxy host"},"load_balance":{"$ref":"#/definitions/LoadBalanceConfig","description":"Load balance config"},"middlewares":{"$ref":"#/definitions/MiddlewaresMap","description":"Middlewares"},"no_tls_verify":{"default":false,"description":"Skip TLS verification","type":"boolean"},"path_patterns":{"description":"Path patterns (only patterns that match will be proxied).\n\nSee https://pkg.go.dev/net/http#hdr-Patterns-ServeMux","items":{"$ref":"#/definitions/PathPattern"},"type":"array"},"port":{"$ref":"#/definitions/Port","default":80,"description":"Proxy port"},"response_header_timeout":{"$ref":"#/definitions/Duration","default":"60s","description":"Response header timeout"},"scheme":{"$ref":"#/definitions/ProxyScheme","default":"http","description":"Proxy scheme"}},"type":"object"},{"additionalProperties":false,"properties":{"access_log":{"additionalProperties":false,"description":"Access log config","examples":[{"fields":{"headers":{"config":{"foo":"redact"},"default":"keep"}},"filters":{"status_codes":{"values":["200-299"]}},"format":"combined","path":"/var/log/access.log"}],"properties":{"buffer_size":{"default":65536,"description":"The size of the buffer.","minimum":0,"type":"integer"},"fields":{"additionalProperties":false,"properties":{"cookie":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"header":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"},"query":{"additionalProperties":false,"properties":{"config":{"additionalProperties":{"enum":["drop","keep","redact"],"type":"string"},"type":"object"},"default":{"$ref":"#/definitions/AccessLogFieldMode"}},"required":["config"],"type":"object"}},"type":"object"},"filters":{"additionalProperties":false,"properties":{"cidr":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/CIDR"},"type":"array"}},"required":["values"],"type":"object"},"headers":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/HTTPHeader"},"type":"array"}},"required":["values"],"type":"object"},"host":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"method":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"enum":["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"],"type":"string"},"type":"array"}},"required":["values"],"type":"object"},"status_code":{"additionalProperties":false,"properties":{"negative":{"default":false,"description":"Whether the filter is negative.","type":"boolean"},"values":{"items":{"$ref":"#/definitions/StatusCodeRange"},"type":"array"}},"required":["values"],"type":"object"}},"type":"object"},"format":{"$ref":"#/definitions/AccessLogFormat","default":"combined","description":"The format of the access log."},"path":{"$ref":"#/definitions/URI"}},"required":["path"],"type":"object"},"alias":{"description":"Alias (subdomain or FDN)","minLength":1,"type":"string"},"healthcheck":{"additionalProperties":false,"description":"Healthcheck config","properties":{"disable":{"default":false,"description":"Disable healthcheck","type":"boolean"},"interval":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck interval"},"path":{"$ref":"#/definitions/URI","default":"/","description":"Healthcheck path"},"timeout":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck timeout"},"use_get":{"default":false,"description":"Use GET instead of HEAD","type":"boolean"}},"type":"object"},"homepage":{"additionalProperties":false,"description":"Homepage config","examples":[{"category":"Arr suite","icon":"png/sonarr.png","name":"Sonarr"},{"icon":"@target/favicon.ico","name":"App"}],"properties":{"category":{"type":"string"},"description":{"type":"string"},"icon":{"anyOf":[{"format":"uri","type":"string"},{"description":"Walkxcode icon","pattern":"^(png|svg|webp)\\/[\\w\\d\\-_]+\\.\\1","type":"string"},{"pattern":"^@selfhst/.*\\..*$","type":"string"},{"pattern":"^@walkxcode/.*\\..*$","type":"string"},{"pattern":"^@target/.*$","type":"string"},{"pattern":"^/.*$","type":"string"}]},"name":{"type":"string"},"show":{"default":true,"description":"Whether show in dashboard","type":"boolean"},"url":{"$ref":"#/definitions/URL"},"widget_config":{"additionalProperties":{},"type":"object"}},"type":"object"},"middlewares":{"$ref":"#/definitions/MiddlewaresMap","description":"Middlewares"},"path_patterns":{"description":"Path patterns (only patterns that match will be proxied).\n\nSee https://pkg.go.dev/net/http#hdr-Patterns-ServeMux","items":{"$ref":"#/definitions/PathPattern"},"type":"array"},"root":{"type":"string"},"scheme":{"const":"fileserver","type":"string"}},"required":["root","scheme"],"type":"object"},{"additionalProperties":false,"properties":{"alias":{"description":"Alias (subdomain or FDN)","minLength":1,"type":"string"},"healthcheck":{"additionalProperties":false,"description":"Healthcheck config","properties":{"disable":{"default":false,"description":"Disable healthcheck","type":"boolean"},"interval":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck interval"},"path":{"$ref":"#/definitions/URI","default":"/","description":"Healthcheck path"},"timeout":{"$ref":"#/definitions/Duration","default":"5s","description":"Healthcheck timeout"},"use_get":{"default":false,"description":"Use GET instead of HEAD","type":"boolean"}},"type":"object"},"host":{"anyOf":[{"format":"hostname","type":"string"},{"format":"ipv4","type":"string"},{"format":"ipv6","type":"string"}],"default":"localhost","description":"Stream host"},"port":{"$ref":"#/definitions/StreamPort"},"scheme":{"$ref":"#/definitions/StreamScheme","default":"tcp","description":"Stream scheme"}},"required":["port"],"type":"object"}]},"StatusCode":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"type":"number"}]},"StatusCodeRange":{"anyOf":[{"pattern":"^[0-9]*$","type":"string"},{"pattern":"^[0-9]*-[0-9]*$","type":"string"},{"type":"number"}]},"StreamPort":{"pattern":"^\\d+:\\d+$","type":"string"},"StreamScheme":{"enum":["tcp","udp"],"type":"string"},"URI":{"format":"uri-reference","type":"string"},"URL":{"format":"uri","type":"string"}},"type":"object"} \ No newline at end of file diff --git a/schemas/tsconfig.json b/schemas/tsconfig.json deleted file mode 100644 index 5ac8e5d..0000000 --- a/schemas/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "incremental": true, - "skipLibCheck": true, - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Node", - "strict": false, - "esModuleInterop": false, - "forceConsistentCasingInFileNames": true, - "allowJs": false, - "resolveJsonModule": true, - "declaration": true, - "allowSyntheticDefaultImports": true - }, - "include": ["**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/schemas/types.d.ts b/schemas/types.d.ts deleted file mode 100644 index f5390ae..0000000 --- a/schemas/types.d.ts +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @type "null" - */ -export type Null = null; -export type Nullable = T | Null; -export type NullOrEmptyMap = {} | Null; -export declare const HTTP_METHODS: readonly [ - "GET", - "POST", - "PUT", - "PATCH", - "DELETE", - "CONNECT", - "HEAD", - "OPTIONS", - "TRACE", -]; -export type HTTPMethod = (typeof HTTP_METHODS)[number]; -/** - * HTTP Header - * @pattern ^[a-zA-Z0-9\-]+$ - * @type string - */ -export type HTTPHeader = string & {}; -/** - * HTTP Query - * @pattern ^[a-zA-Z0-9\-_]+$ - * @type string - */ -export type HTTPQuery = string & {}; -/** - * HTTP Cookie - * @pattern ^[a-zA-Z0-9\-_]+$ - * @type string - */ -export type HTTPCookie = string & {}; -export type StatusCode = number | `${number}`; -export type StatusCodeRange = number | `${number}` | `${number}-${number}`; -/** - * @pattern ^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$ - */ -export type DomainName = string & {}; -/** - * @pattern ^(\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$ - */ -export type DomainOrWildcard = string & {}; -/** - * @format hostname - * @type string - */ -export type Hostname = string & {}; -/** - * @format ipv4 - * @type string - */ -export type IPv4 = string & {}; -/** - * @format ipv6 - * @type string - */ -export type IPv6 = string & {}; -export type CIDR = - | `${number}.${number}.${number}.${number}` - | `${string}:${string}:${string}:${string}:${string}:${string}:${string}:${string}` - | `${number}.${number}.${number}.${number}/${number}` - | `::${number}` - | `${string}::/${number}` - | `${string}:${string}::/${number}`; -/** - * @type integer - * @minimum 0 - * @maximum 65535 - */ -export type Port = number | `${number}`; -/** - * @pattern ^\d+:\d+$ - * @type string - */ -export type StreamPort = string & {}; -/** - * @format email - * @type string - */ -export type Email = string & {}; -/** - * @format uri - * @type string - */ -export type URL = string & {}; -/** - * @format uri-reference - * @type string - */ -export type URI = string & {}; -/** - * @pattern ^(?:([A-Z]+) )?(?:([a-zA-Z0-9.-]+)\\/)?(\\/[^\\s]*)$ - * @type string - */ -export type PathPattern = string & {}; -/** - * @pattern ^([0-9]+(ms|s|m|h))+$ - * @type string - */ -export type Duration = string & {}; -/** - * @format date-time - * @type string - */ -export type DateTime = string & {}; diff --git a/schemas/types.js b/schemas/types.js deleted file mode 100644 index 0f22981..0000000 --- a/schemas/types.js +++ /dev/null @@ -1,11 +0,0 @@ -export const HTTP_METHODS = [ - "GET", - "POST", - "PUT", - "PATCH", - "DELETE", - "CONNECT", - "HEAD", - "OPTIONS", - "TRACE", -]; diff --git a/schemas/types.ts b/schemas/types.ts deleted file mode 100644 index 2332f2a..0000000 --- a/schemas/types.ts +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @type "null" - */ -export type Null = null; -export type Nullable = T | Null; -export type NullOrEmptyMap = {} | Null; - -export const HTTP_METHODS = [ - "GET", - "POST", - "PUT", - "PATCH", - "DELETE", - "CONNECT", - "HEAD", - "OPTIONS", - "TRACE", -] as const; - -export type HTTPMethod = (typeof HTTP_METHODS)[number]; - -// "string & {}" Prevents skipping schema generation - -/** - * HTTP Header - * @pattern ^[a-zA-Z0-9\-]+$ - * @type string - */ -export type HTTPHeader = string & {}; - -/** - * HTTP Query - * @pattern ^[a-zA-Z0-9\-_]+$ - * @type string - */ -export type HTTPQuery = string & {}; -/** - * HTTP Cookie - * @pattern ^[a-zA-Z0-9\-_]+$ - * @type string - */ -export type HTTPCookie = string & {}; - -export type StatusCode = number | `${number}`; -export type StatusCodeRange = number | `${number}` | `${number}-${number}`; - -/** - * @pattern ^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$ - */ -export type DomainName = string & {}; -/** - * @pattern ^(\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$ - */ -export type DomainOrWildcard = string & {}; -/** - * @format hostname - * @type string - */ -export type Hostname = string & {}; -/** - * @format ipv4 - * @type string - */ -export type IPv4 = string & {}; -/** - * @format ipv6 - * @type string - */ -export type IPv6 = string & {}; - -/* CIDR / IPv4 / IPv6 */ -export type CIDR = - | `${number}.${number}.${number}.${number}` - | `${string}:${string}:${string}:${string}:${string}:${string}:${string}:${string}` - | `${number}.${number}.${number}.${number}/${number}` - | `::${number}` - | `${string}::/${number}` - | `${string}:${string}::/${number}`; - -/** - * @type integer - * @minimum 0 - * @maximum 65535 - */ -export type Port = number | `${number}`; - -/** - * @pattern ^\d+:\d+$ - * @type string - */ -export type StreamPort = string & {}; - -/** - * @format email - * @type string - */ -export type Email = string & {}; - -/** - * @format uri - * @type string - */ -export type URL = string & {}; - -/** - * @format uri-reference - * @type string - */ -export type URI = string & {}; - -/** - * @pattern ^(?:([A-Z]+) )?(?:([a-zA-Z0-9.-]+)\\/)?(\\/[^\\s]*)$ - * @type string - */ -export type PathPattern = string & {}; - -/** - * @pattern ^([0-9]+(ms|s|m|h))+$ - * @type string - */ -export type Duration = string & {}; - -/** - * @format date-time - * @type string - */ -export type DateTime = string & {};