acrylblends 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +73 -0
- package/dist/index.js +56 -2
- package/dist/index.js.map +1 -1
- package/docs/framework/LICENSE +23 -0
- package/docs/framework/README.md +63 -0
- package/docs/framework/UPSTREAM.md +3 -0
- package/docs/framework/agents/index.md +24 -0
- package/docs/framework/api/acryl.md +259 -0
- package/docs/framework/api/context.md +527 -0
- package/docs/framework/api/exception.md +80 -0
- package/docs/framework/api/index.md +12 -0
- package/docs/framework/api/presets.md +65 -0
- package/docs/framework/api/request.md +396 -0
- package/docs/framework/api/routing.md +303 -0
- package/docs/framework/api/summary.md +140 -0
- package/docs/framework/concepts/benchmarks.md +26 -0
- package/docs/framework/concepts/developer-experience.md +5 -0
- package/docs/framework/concepts/middleware.md +21 -0
- package/docs/framework/concepts/motivation.md +14 -0
- package/docs/framework/concepts/routers.md +63 -0
- package/docs/framework/concepts/stacks.md +235 -0
- package/docs/framework/concepts/web-standard.md +37 -0
- package/docs/framework/cordis/acryl-in-a-cordis-app.md +146 -0
- package/docs/framework/cordis/concepts.md +105 -0
- package/docs/framework/cordis/middleware.md +8 -0
- package/docs/framework/cordis/migration-from-0-3.md +111 -0
- package/docs/framework/cordis/migration-from-0-4.md +14 -0
- package/docs/framework/cordis/migration-from-dsh-webserver.md +103 -0
- package/docs/framework/cordis/mounting.md +85 -0
- package/docs/framework/cordis/node-server.md +75 -0
- package/docs/framework/cordis/plugin-lifecycle.md +111 -0
- package/docs/framework/cordis/surfaces.md +71 -0
- package/docs/framework/cordis/transport-and-cancellation.md +57 -0
- package/docs/framework/cordis/validation.md +135 -0
- package/docs/framework/getting-started/basic.md +196 -0
- package/docs/framework/getting-started/bun.md +221 -0
- package/docs/framework/getting-started/nodejs.md +344 -0
- package/docs/framework/getting-started/other-runtimes.md +23 -0
- package/docs/framework/guides/best-practices.md +231 -0
- package/docs/framework/guides/create-acrylblends.md +79 -0
- package/docs/framework/guides/examples.md +3 -0
- package/docs/framework/guides/faq.md +19 -0
- package/docs/framework/guides/helpers.md +33 -0
- package/docs/framework/guides/jsx-dom.md +299 -0
- package/docs/framework/guides/jsx.md +440 -0
- package/docs/framework/guides/middleware.md +253 -0
- package/docs/framework/guides/rpc.md +886 -0
- package/docs/framework/guides/testing.md +133 -0
- package/docs/framework/guides/validation.md +383 -0
- package/docs/framework/helpers/accepts.md +60 -0
- package/docs/framework/helpers/adapter.md +87 -0
- package/docs/framework/helpers/conninfo.md +112 -0
- package/docs/framework/helpers/cookie.md +232 -0
- package/docs/framework/helpers/css.md +285 -0
- package/docs/framework/helpers/dev.md +67 -0
- package/docs/framework/helpers/factory.md +180 -0
- package/docs/framework/helpers/html.md +123 -0
- package/docs/framework/helpers/jwt.md +184 -0
- package/docs/framework/helpers/proxy.md +118 -0
- package/docs/framework/helpers/route.md +143 -0
- package/docs/framework/helpers/ssg.md +393 -0
- package/docs/framework/helpers/streaming.md +119 -0
- package/docs/framework/helpers/testing.md +101 -0
- package/docs/framework/helpers/websocket.md +215 -0
- package/docs/framework/middleware/builtin/basic-auth.md +165 -0
- package/docs/framework/middleware/builtin/bearer-auth.md +138 -0
- package/docs/framework/middleware/builtin/body-limit.md +71 -0
- package/docs/framework/middleware/builtin/cache.md +122 -0
- package/docs/framework/middleware/builtin/combine.md +94 -0
- package/docs/framework/middleware/builtin/compress.md +59 -0
- package/docs/framework/middleware/builtin/context-storage.md +78 -0
- package/docs/framework/middleware/builtin/cors.md +135 -0
- package/docs/framework/middleware/builtin/csrf.md +105 -0
- package/docs/framework/middleware/builtin/etag.md +54 -0
- package/docs/framework/middleware/builtin/ip-restriction.md +69 -0
- package/docs/framework/middleware/builtin/jsx-renderer.md +286 -0
- package/docs/framework/middleware/builtin/jwk.md +192 -0
- package/docs/framework/middleware/builtin/jwt.md +145 -0
- package/docs/framework/middleware/builtin/language.md +232 -0
- package/docs/framework/middleware/builtin/logger.md +74 -0
- package/docs/framework/middleware/builtin/loopback-only.md +31 -0
- package/docs/framework/middleware/builtin/method-not-allowed.md +48 -0
- package/docs/framework/middleware/builtin/method-override.md +80 -0
- package/docs/framework/middleware/builtin/mount.md +106 -0
- package/docs/framework/middleware/builtin/pretty-json.md +53 -0
- package/docs/framework/middleware/builtin/request-id.md +94 -0
- package/docs/framework/middleware/builtin/secure-headers.md +247 -0
- package/docs/framework/middleware/builtin/timeout.md +98 -0
- package/docs/framework/middleware/builtin/timing.md +101 -0
- package/docs/framework/middleware/builtin/trailing-slash.md +74 -0
- package/docs/framework/middleware/third-party.md +4 -0
- package/docs/framework/upstream.json +9 -0
- package/lib/accepts-XBuZPVRI.js +52 -0
- package/lib/accepts.d.ts +33 -0
- package/lib/accepts.js +2 -0
- package/lib/acryl-base.d.ts +2 -0
- package/lib/acryl-base.js +332 -0
- package/lib/adapter.d.ts +12 -0
- package/lib/adapter.js +37 -0
- package/lib/app-BM0rTCp7.js +26 -0
- package/lib/app-CmAYW1Al.d.ts +21 -0
- package/lib/basic-auth.d.ts +72 -0
- package/lib/basic-auth.js +95 -0
- package/lib/bearer-auth.d.ts +89 -0
- package/lib/bearer-auth.js +94 -0
- package/lib/body-limit.d.ts +42 -0
- package/lib/body-limit.js +66 -0
- package/lib/client-BHTr318g.js +266 -0
- package/lib/client.d.ts +3 -0
- package/lib/client.js +2 -0
- package/lib/combine.d.ts +85 -0
- package/lib/combine.js +137 -0
- package/lib/compose-BuW2B6PZ.js +50 -0
- package/lib/compress.d.ts +38 -0
- package/lib/compress.js +79 -0
- package/lib/connection-C7xgP1hP.js +24 -0
- package/lib/conninfo.d.ts +25 -0
- package/lib/conninfo.js +2 -0
- package/lib/constants-Dy7ZvN1H.js +4 -0
- package/lib/context-Bm7rI-oK.d.ts +1234 -0
- package/lib/context-DDO0cfuP.js +365 -0
- package/lib/context-storage.d.ts +38 -0
- package/lib/context-storage.js +52 -0
- package/lib/cookie-ClMaKDQf.d.ts +40 -0
- package/lib/cookie.d.ts +24 -0
- package/lib/cookie.js +82 -0
- package/lib/cors.d.ts +52 -0
- package/lib/cors.js +106 -0
- package/lib/csrf.d.ts +75 -0
- package/lib/csrf.js +101 -0
- package/lib/etag.d.ts +40 -0
- package/lib/etag.js +135 -0
- package/lib/factory.d.ts +35 -0
- package/lib/factory.js +30 -0
- package/lib/headers-tu2YYN8T.d.ts +11 -0
- package/lib/html.d.ts +6 -0
- package/lib/html.js +31 -0
- package/lib/http-exception.d.ts +57 -0
- package/lib/http-exception.js +54 -0
- package/lib/http-status-DaAwGAFL.d.ts +35 -0
- package/lib/index-B-3F4wt2.d.ts +12 -0
- package/lib/index-UTBmM3GX.d.ts +68 -0
- package/lib/index-oOClm_Xk.d.ts +45 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +28 -0
- package/lib/ip-restriction.d.ts +68 -0
- package/lib/ip-restriction.js +166 -0
- package/lib/jwk.d.ts +52 -0
- package/lib/jwk.js +117 -0
- package/lib/jwt-BGJBw5AF.js +403 -0
- package/lib/jwt-Dg493Tai.d.ts +51 -0
- package/lib/jwt.d.ts +72 -0
- package/lib/jwt.js +115 -0
- package/lib/language.d.ts +88 -0
- package/lib/language.js +198 -0
- package/lib/logger.d.ts +22 -0
- package/lib/logger.js +54 -0
- package/lib/loopback-only.d.ts +45 -0
- package/lib/loopback-only.js +90 -0
- package/lib/method-not-allowed.d.ts +47 -0
- package/lib/method-not-allowed.js +82 -0
- package/lib/method-override.d.ts +46 -0
- package/lib/method-override.js +103 -0
- package/lib/mime-BQOYHl-l.d.ts +72 -0
- package/lib/node-server/conninfo.d.ts +11 -0
- package/lib/node-server/conninfo.js +19 -0
- package/lib/node-server/serve-static.d.ts +19 -0
- package/lib/node-server/serve-static.js +2 -0
- package/lib/node-server.d.ts +103 -0
- package/lib/node-server.js +1325 -0
- package/lib/powered-by.d.ts +28 -0
- package/lib/powered-by.js +24 -0
- package/lib/pretty-json.d.ts +40 -0
- package/lib/pretty-json.js +39 -0
- package/lib/reg-exp-router-DC1R3qoY.js +363 -0
- package/lib/request-id.d.ts +45 -0
- package/lib/request-id.js +34 -0
- package/lib/request.d.ts +2 -0
- package/lib/request.js +323 -0
- package/lib/route.d.ts +78 -0
- package/lib/route.js +126 -0
- package/lib/router/linear-router.d.ts +11 -0
- package/lib/router/linear-router.js +96 -0
- package/lib/router/pattern-router.d.ts +11 -0
- package/lib/router/pattern-router.js +41 -0
- package/lib/router/reg-exp-router.d.ts +35 -0
- package/lib/router/reg-exp-router.js +2 -0
- package/lib/router/smart-router.d.ts +15 -0
- package/lib/router/smart-router.js +2 -0
- package/lib/router/trie-router.d.ts +11 -0
- package/lib/router/trie-router.js +2 -0
- package/lib/router-CvUxUTOq.d.ts +99 -0
- package/lib/router.d.ts +2 -0
- package/lib/router.js +35 -0
- package/lib/schema-validator.d.ts +28 -0
- package/lib/schema-validator.js +22 -0
- package/lib/secure-headers.d.ts +125 -0
- package/lib/secure-headers.js +163 -0
- package/lib/serve-static-Dw_m6KxR.js +213 -0
- package/lib/serve-static.d.ts +31 -0
- package/lib/serve-static.js +77 -0
- package/lib/smart-router-C5CZ5XSM.js +49 -0
- package/lib/stream-CPdqZ0Fp.d.ts +34 -0
- package/lib/streaming-DHST3Scg.js +96 -0
- package/lib/streaming.d.ts +23 -0
- package/lib/streaming.js +2 -0
- package/lib/testing.d.ts +10 -0
- package/lib/testing.js +17 -0
- package/lib/timeout.d.ts +30 -0
- package/lib/timeout.js +42 -0
- package/lib/timing.d.ts +130 -0
- package/lib/timing.js +183 -0
- package/lib/trailing-slash.d.ts +91 -0
- package/lib/trailing-slash.js +85 -0
- package/lib/trie-router-CfFbapzL.js +146 -0
- package/lib/types-CDO6I3B0.d.ts +40 -0
- package/lib/types-CHesD1KG.d.ts +195 -0
- package/lib/types-CwrQjlaM.d.ts +105 -0
- package/lib/types-DR95J00T.d.ts +29 -0
- package/lib/types.d.ts +2 -0
- package/lib/types.js +4 -0
- package/lib/utils/accept.d.ts +9 -0
- package/lib/utils/accept.js +193 -0
- package/lib/utils/basic-auth.d.ts +8 -0
- package/lib/utils/basic-auth.js +20 -0
- package/lib/utils/body.d.ts +2 -0
- package/lib/utils/body.js +94 -0
- package/lib/utils/buffer.d.ts +19 -0
- package/lib/utils/buffer.js +51 -0
- package/lib/utils/color.d.ts +24 -0
- package/lib/utils/color.js +37 -0
- package/lib/utils/compress.d.ts +11 -0
- package/lib/utils/compress.js +11 -0
- package/lib/utils/concurrent.d.ts +17 -0
- package/lib/utils/concurrent.js +30 -0
- package/lib/utils/constants.d.ts +7 -0
- package/lib/utils/constants.js +7 -0
- package/lib/utils/cookie.d.ts +2 -0
- package/lib/utils/cookie.js +125 -0
- package/lib/utils/crypto.d.ts +14 -0
- package/lib/utils/crypto.js +34 -0
- package/lib/utils/encode.d.ts +11 -0
- package/lib/utils/encode.js +33 -0
- package/lib/utils/filepath.d.ts +14 -0
- package/lib/utils/filepath.js +25 -0
- package/lib/utils/handler.d.ts +9 -0
- package/lib/utils/handler.js +12 -0
- package/lib/utils/headers.d.ts +2 -0
- package/lib/utils/headers.js +1 -0
- package/lib/utils/html.d.ts +46 -0
- package/lib/utils/html.js +103 -0
- package/lib/utils/http-status.d.ts +2 -0
- package/lib/utils/http-status.js +1 -0
- package/lib/utils/ipaddr.d.ts +56 -0
- package/lib/utils/ipaddr.js +238 -0
- package/lib/utils/jwt.d.ts +24 -0
- package/lib/utils/jwt.js +2 -0
- package/lib/utils/mime.d.ts +2 -0
- package/lib/utils/mime.js +77 -0
- package/lib/utils/stream.d.ts +2 -0
- package/lib/utils/stream.js +88 -0
- package/lib/utils/types.d.ts +2 -0
- package/lib/utils/types.js +1 -0
- package/lib/utils/url.d.ts +46 -0
- package/lib/utils/url.js +197 -0
- package/lib/utils-dw8lxqjL.js +4 -0
- package/lib/validator-D84mq-dO.js +65 -0
- package/lib/validator.d.ts +42 -0
- package/lib/validator.js +2 -0
- package/lib/ws.d.ts +2 -0
- package/lib/ws.js +53 -0
- package/package.json +315 -15
- package/plugins/acryl-inspect/src/report.ts +15 -10
- package/plugins/acryl-inspect/src/service.ts +2 -2
- package/plugins/acryl-inspect/tests/report.spec.ts +9 -3
- package/plugins/acryl-inspect/tests/service.spec.ts +3 -3
- package/plugins/acryl-inspect/upstream.json +2 -2
- package/plugins/acryl-node-server/tests/adapter/app.ts +2 -2
- package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -1
- package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +2 -2
- package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +4 -4
- package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +5 -5
- package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +2 -2
- package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +20 -20
- package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +2 -2
- package/plugins/acryl-node-server/tests/adapter/server.test.ts +50 -50
- package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +4 -4
- package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +9 -9
- package/plugins/acryl-node-server/tests/server.spec.ts +6 -6
- package/plugins/acryl-node-server/upstream.json +2 -2
- package/plugins/acryl-router/src/client.ts +1 -1
- package/plugins/acryl-router/src/connection.ts +2 -2
- package/plugins/acryl-router/src/core/app-base.ts +29 -29
- package/plugins/acryl-router/src/core/app.test.ts +175 -175
- package/plugins/acryl-router/src/core/app.ts +8 -8
- package/plugins/acryl-router/src/core/client/client.test.ts +76 -76
- package/plugins/acryl-router/src/core/client/client.ts +2 -2
- package/plugins/acryl-router/src/core/client/fetch-result-please.ts +1 -1
- package/plugins/acryl-router/src/core/client/index.ts +1 -1
- package/plugins/acryl-router/src/core/client/types.test.ts +6 -6
- package/plugins/acryl-router/src/core/client/types.ts +16 -16
- package/plugins/acryl-router/src/core/client/utils.test.ts +2 -2
- package/plugins/acryl-router/src/core/context.test.ts +4 -4
- package/plugins/acryl-router/src/core/context.ts +6 -6
- package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +3 -3
- package/plugins/acryl-router/src/core/helper/accepts/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +6 -6
- package/plugins/acryl-router/src/core/helper/adapter/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/conninfo/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +8 -8
- package/plugins/acryl-router/src/core/helper/cookie/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/factory/index.test.ts +9 -9
- package/plugins/acryl-router/src/core/helper/factory/index.ts +10 -10
- package/plugins/acryl-router/src/core/helper/html/index.test.ts +4 -4
- package/plugins/acryl-router/src/core/helper/html/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/route/index.test.ts +7 -7
- package/plugins/acryl-router/src/core/helper/route/index.ts +8 -8
- package/plugins/acryl-router/src/core/helper/streaming/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/testing/index.test.ts +6 -6
- package/plugins/acryl-router/src/core/helper/testing/index.ts +4 -4
- package/plugins/acryl-router/src/core/helper/websocket/index.ts +2 -1
- package/plugins/acryl-router/src/core/http-exception.ts +1 -1
- package/plugins/acryl-router/src/core/index.ts +9 -9
- package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +5 -5
- package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +9 -9
- package/plugins/acryl-router/src/core/middleware/combine/index.ts +7 -7
- package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +9 -9
- package/plugins/acryl-router/src/core/middleware/compress/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +5 -5
- package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +7 -7
- package/plugins/acryl-router/src/core/middleware/cors/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +10 -10
- package/plugins/acryl-router/src/core/middleware/csrf/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +42 -42
- package/plugins/acryl-router/src/core/middleware/etag/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +16 -16
- package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +7 -6
- package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +16 -16
- package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +4 -3
- package/plugins/acryl-router/src/core/middleware/language/index.test.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/language/language.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +5 -5
- package/plugins/acryl-router/src/core/middleware/logger/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +24 -24
- package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +8 -8
- package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +5 -5
- package/plugins/acryl-router/src/core/middleware/method-override/index.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +30 -30
- package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +15 -15
- package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +35 -35
- package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +23 -23
- package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +1 -1
- package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +2 -2
- package/plugins/acryl-router/src/core/middleware/timeout/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +14 -14
- package/plugins/acryl-router/src/core/middleware/timing/timing.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +7 -7
- package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +7 -7
- package/plugins/acryl-router/src/core/request.test.ts +42 -42
- package/plugins/acryl-router/src/core/request.ts +6 -6
- package/plugins/acryl-router/src/core/router/linear-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/router/pattern-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/router/smart-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/router/trie-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/types.test.ts +115 -115
- package/plugins/acryl-router/src/core/types.ts +72 -72
- package/plugins/acryl-router/src/core/utils/body.ts +8 -8
- package/plugins/acryl-router/src/core/utils/html.ts +1 -1
- package/plugins/acryl-router/src/core/utils/jwt/jws.ts +3 -3
- package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +2 -2
- package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +3 -3
- package/plugins/acryl-router/src/core/utils/jwt/types.ts +1 -1
- package/plugins/acryl-router/src/core/utils/types.ts +42 -0
- package/plugins/acryl-router/src/core/utils/url.test.ts +2 -2
- package/plugins/acryl-router/src/core/validator/index.ts +1 -1
- package/plugins/acryl-router/src/core/validator/validator.test.ts +28 -28
- package/plugins/acryl-router/src/deprecated.ts +15 -0
- package/plugins/acryl-router/src/index.ts +3 -2
- package/plugins/acryl-router/src/middleware/index.ts +1 -1
- package/plugins/acryl-router/src/middleware/loopback-only.ts +34 -1
- package/plugins/acryl-router/src/service.ts +19 -13
- package/plugins/acryl-router/tests/docs-examples.spec.ts +11 -11
- package/plugins/acryl-router/tests/live-install.spec.ts +2 -2
- package/plugins/acryl-router/tests/loader.spec.ts +3 -3
- package/plugins/acryl-router/tests/loopback-only.spec.ts +80 -0
- package/plugins/acryl-router/tests/no-dom/consumer.ts +11 -0
- package/plugins/acryl-router/tests/no-dom/tsconfig.json +13 -0
- package/plugins/acryl-router/tests/service.spec.ts +39 -22
- package/plugins/acryl-router/upstream.json +3 -3
- package/plugins/acryl-router-http/tests/adapter.spec.ts +3 -3
- package/plugins/acryl-router-http/tests/surfaces.spec.ts +2 -2
- package/plugins/acryl-router-http/upstream.json +2 -2
- package/plugins/acryl-state/src/service.ts +2 -2
- package/plugins/acryl-state/upstream.json +2 -2
- package/plugins/builder/script.ts +3 -3
- package/plugins/extensions/index.ts +4 -3
- package/plugins/extensions/resolve.ts +70 -10
- package/plugins/openai/prompt.ts +7 -7
- package/shared/AGENTS.core.md +61 -0
- package/templates/agent/AGENTS.md +6 -0
- package/templates/agent/README.md +2 -2
- package/templates/agent/blend.yaml +1 -1
- package/templates/agent/src/routes.ts +2 -2
- package/templates/agent/test/model.test.ts +2 -2
- package/templates/agent/tsconfig.json +40 -0
- package/templates/blank/AGENTS.md +5 -0
- package/templates/blank/README.md +1 -1
- package/templates/blank/src/routes.ts +2 -2
- package/templates/todo/AGENTS.md +5 -0
- package/templates/todo/src/todo.ts +6 -4
- package/templates/todo/upstream.json +2 -2
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { n as ContentfulStatusCode } from "./http-status-DaAwGAFL.js";
|
|
2
|
+
|
|
3
|
+
//#region ../../plugins/acryl-router/src/core/http-exception.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Options for creating an `HTTPException`.
|
|
6
|
+
* @property res - Optional response object to use.
|
|
7
|
+
* @property message - Optional custom error message.
|
|
8
|
+
* @property cause - Optional cause of the error.
|
|
9
|
+
*/
|
|
10
|
+
type HTTPExceptionOptions = {
|
|
11
|
+
res?: Response;
|
|
12
|
+
message?: string;
|
|
13
|
+
cause?: unknown;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* `HTTPException` must be used when a fatal error such as authentication failure occurs.
|
|
17
|
+
*
|
|
18
|
+
*
|
|
19
|
+
* @param {StatusCode} status - status code of HTTPException
|
|
20
|
+
* @param {HTTPExceptionOptions} options - options of HTTPException
|
|
21
|
+
* @param {HTTPExceptionOptions["res"]} options.res - response of options of HTTPException
|
|
22
|
+
* @param {HTTPExceptionOptions["message"]} options.message - message of options of HTTPException
|
|
23
|
+
* @param {HTTPExceptionOptions["cause"]} options.cause - cause of options of HTTPException
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { HTTPException } from 'acrylblends/http-exception'
|
|
28
|
+
*
|
|
29
|
+
* // ...
|
|
30
|
+
*
|
|
31
|
+
* app.post('/auth', async (c, next) => {
|
|
32
|
+
* // authentication
|
|
33
|
+
* if (authorized === false) {
|
|
34
|
+
* throw new HTTPException(401, { message: 'Custom error message' })
|
|
35
|
+
* }
|
|
36
|
+
* await next()
|
|
37
|
+
* })
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
declare class HTTPException extends Error {
|
|
41
|
+
readonly res?: Response;
|
|
42
|
+
readonly status: ContentfulStatusCode;
|
|
43
|
+
/**
|
|
44
|
+
* Creates an instance of `HTTPException`.
|
|
45
|
+
* @param status - HTTP status code for the exception. Defaults to 500.
|
|
46
|
+
* @param options - Additional options for the exception.
|
|
47
|
+
*/
|
|
48
|
+
constructor(status?: ContentfulStatusCode, options?: HTTPExceptionOptions);
|
|
49
|
+
/**
|
|
50
|
+
* Returns the response object associated with the exception.
|
|
51
|
+
* If a response object is not provided, a new response is created with the error message and status code.
|
|
52
|
+
* @returns The response object.
|
|
53
|
+
*/
|
|
54
|
+
getResponse(): Response;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { HTTPException };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region ../../plugins/acryl-router/src/core/http-exception.ts
|
|
2
|
+
/**
|
|
3
|
+
* `HTTPException` must be used when a fatal error such as authentication failure occurs.
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* @param {StatusCode} status - status code of HTTPException
|
|
7
|
+
* @param {HTTPExceptionOptions} options - options of HTTPException
|
|
8
|
+
* @param {HTTPExceptionOptions["res"]} options.res - response of options of HTTPException
|
|
9
|
+
* @param {HTTPExceptionOptions["message"]} options.message - message of options of HTTPException
|
|
10
|
+
* @param {HTTPExceptionOptions["cause"]} options.cause - cause of options of HTTPException
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { HTTPException } from 'acrylblends/http-exception'
|
|
15
|
+
*
|
|
16
|
+
* // ...
|
|
17
|
+
*
|
|
18
|
+
* app.post('/auth', async (c, next) => {
|
|
19
|
+
* // authentication
|
|
20
|
+
* if (authorized === false) {
|
|
21
|
+
* throw new HTTPException(401, { message: 'Custom error message' })
|
|
22
|
+
* }
|
|
23
|
+
* await next()
|
|
24
|
+
* })
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
var HTTPException = class extends Error {
|
|
28
|
+
res;
|
|
29
|
+
status;
|
|
30
|
+
/**
|
|
31
|
+
* Creates an instance of `HTTPException`.
|
|
32
|
+
* @param status - HTTP status code for the exception. Defaults to 500.
|
|
33
|
+
* @param options - Additional options for the exception.
|
|
34
|
+
*/
|
|
35
|
+
constructor(status = 500, options) {
|
|
36
|
+
super(options?.message, { cause: options?.cause });
|
|
37
|
+
this.res = options?.res;
|
|
38
|
+
this.status = status;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Returns the response object associated with the exception.
|
|
42
|
+
* If a response object is not provided, a new response is created with the error message and status code.
|
|
43
|
+
* @returns The response object.
|
|
44
|
+
*/
|
|
45
|
+
getResponse() {
|
|
46
|
+
if (this.res) return new Response(this.res.body, {
|
|
47
|
+
status: this.status,
|
|
48
|
+
headers: this.res.headers
|
|
49
|
+
});
|
|
50
|
+
return new Response(this.message, { status: this.status });
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
//#endregion
|
|
54
|
+
export { HTTPException };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region ../../plugins/acryl-router/src/core/utils/http-status.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* @module
|
|
4
|
+
* HTTP Status utility.
|
|
5
|
+
*/
|
|
6
|
+
type InfoStatusCode = 100 | 101 | 102 | 103;
|
|
7
|
+
type SuccessStatusCode = 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226;
|
|
8
|
+
type DeprecatedStatusCode = 305 | 306;
|
|
9
|
+
type RedirectStatusCode = 300 | 301 | 302 | 303 | 304 | DeprecatedStatusCode | 307 | 308;
|
|
10
|
+
type ClientErrorStatusCode = 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451;
|
|
11
|
+
type ServerErrorStatusCode = 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511;
|
|
12
|
+
/**
|
|
13
|
+
* `UnofficialStatusCode` can be used to specify an unofficial status code.
|
|
14
|
+
* @example
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* app.get('/unknown', (c) => {
|
|
18
|
+
* return c.text("Unknown Error", 520 as UnofficialStatusCode)
|
|
19
|
+
* })
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
type UnofficialStatusCode = -1;
|
|
23
|
+
/**
|
|
24
|
+
* @deprecated
|
|
25
|
+
* Use `UnofficialStatusCode` instead.
|
|
26
|
+
*/
|
|
27
|
+
type UnOfficalStatusCode = UnofficialStatusCode;
|
|
28
|
+
/**
|
|
29
|
+
* If you want to use an unofficial status, use `UnofficialStatusCode`.
|
|
30
|
+
*/
|
|
31
|
+
type StatusCode = InfoStatusCode | SuccessStatusCode | RedirectStatusCode | ClientErrorStatusCode | ServerErrorStatusCode | UnofficialStatusCode;
|
|
32
|
+
type ContentlessStatusCode = 101 | 204 | 205 | 304;
|
|
33
|
+
type ContentfulStatusCode = Exclude<StatusCode, ContentlessStatusCode>;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { InfoStatusCode as a, StatusCode as c, UnofficialStatusCode as d, DeprecatedStatusCode as i, SuccessStatusCode as l, ContentfulStatusCode as n, RedirectStatusCode as o, ContentlessStatusCode as r, ServerErrorStatusCode as s, ClientErrorStatusCode as t, UnOfficalStatusCode as u };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { A as Input, J as Schema, _ as Env, h as BlankSchema, o as AcrylRequest, p as BlankEnv } from "./context-Bm7rI-oK.js";
|
|
2
|
+
import { t as Acryl } from "./app-CmAYW1Al.js";
|
|
3
|
+
|
|
4
|
+
//#region ../../plugins/acryl-router/src/deprecated.d.ts
|
|
5
|
+
/** @deprecated Use `Acryl` (`new Acryl()`); `App` is the 0.4 name and goes away in the next release. */
|
|
6
|
+
declare const App: typeof Acryl;
|
|
7
|
+
/** @deprecated Use `Acryl`; `App` is the 0.4 name and goes away in the next release. */
|
|
8
|
+
type App<E extends Env = BlankEnv, S extends Schema = BlankSchema, BasePath extends string = '/'> = Acryl<E, S, BasePath>;
|
|
9
|
+
/** @deprecated Use `AcrylRequest`; `AppRequest` is the 0.4 name and goes away in the next release. */
|
|
10
|
+
type AppRequest<P extends string = '/', I extends Input['out'] = {}> = AcrylRequest<P, I>;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { AppRequest as n, App as t };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { I as MiddlewareHandler, X as TypedResponse, t as Context } from "./context-Bm7rI-oK.js";
|
|
2
|
+
import { c as StatusCode } from "./http-status-DaAwGAFL.js";
|
|
3
|
+
import { r as CloseEvent, t as BinaryType, v as MessageEvent } from "./types-CwrQjlaM.js";
|
|
4
|
+
|
|
5
|
+
//#region ../../plugins/acryl-router/src/core/helper/websocket/index.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* WebSocket Event Listeners type
|
|
8
|
+
*/
|
|
9
|
+
interface WSEvents<T = unknown> {
|
|
10
|
+
onOpen?: (evt: Event, ws: WSContext<T>) => void;
|
|
11
|
+
onMessage?: (evt: MessageEvent<WSMessageReceive>, ws: WSContext<T>) => void;
|
|
12
|
+
onClose?: (evt: CloseEvent, ws: WSContext<T>) => void;
|
|
13
|
+
onError?: (evt: Event, ws: WSContext<T>) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Upgrade WebSocket Type
|
|
17
|
+
*/
|
|
18
|
+
interface UpgradeWebSocket<T = unknown, U = any, _WSEvents = WSEvents<T>> {
|
|
19
|
+
(createEvents: (c: Context) => _WSEvents | Promise<_WSEvents>, options?: U): MiddlewareHandler<any, string, {
|
|
20
|
+
outputFormat: 'ws';
|
|
21
|
+
}>;
|
|
22
|
+
(c: Context, events: _WSEvents, options?: U): Promise<Response & TypedResponse<{}, StatusCode, 'ws'>>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* ReadyState for WebSocket
|
|
26
|
+
*/
|
|
27
|
+
type WSReadyState = 0 | 1 | 2 | 3;
|
|
28
|
+
/**
|
|
29
|
+
* An argument for WSContext class
|
|
30
|
+
*/
|
|
31
|
+
interface WSContextInit<T = unknown> {
|
|
32
|
+
send(data: string | ArrayBuffer | Uint8Array<ArrayBuffer>, options: SendOptions): void;
|
|
33
|
+
close(code?: number, reason?: string): void;
|
|
34
|
+
raw?: T;
|
|
35
|
+
readyState: WSReadyState;
|
|
36
|
+
url?: string | URL | null;
|
|
37
|
+
protocol?: string | null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Options for sending message
|
|
41
|
+
*/
|
|
42
|
+
interface SendOptions {
|
|
43
|
+
compress?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A context for controlling WebSockets
|
|
47
|
+
*/
|
|
48
|
+
declare class WSContext<T = unknown> {
|
|
49
|
+
#private;
|
|
50
|
+
constructor(init: WSContextInit<T>);
|
|
51
|
+
send(source: string | ArrayBuffer | Uint8Array<ArrayBuffer>, options?: SendOptions): void;
|
|
52
|
+
raw?: T;
|
|
53
|
+
binaryType: BinaryType;
|
|
54
|
+
get readyState(): WSReadyState;
|
|
55
|
+
url: URL | null;
|
|
56
|
+
protocol: string | null;
|
|
57
|
+
close(code?: number, reason?: string): void;
|
|
58
|
+
}
|
|
59
|
+
type WSMessageReceive = string | Blob | ArrayBufferLike;
|
|
60
|
+
declare const createWSMessageEvent: (source: WSMessageReceive) => MessageEvent<WSMessageReceive>;
|
|
61
|
+
interface WebSocketHelperDefineContext {}
|
|
62
|
+
type WebSocketHelperDefineHandler<T, U> = (c: Context, events: WSEvents<T>, options?: U) => Promise<Response | void> | Response | void;
|
|
63
|
+
/**
|
|
64
|
+
* Create a WebSocket adapter/helper
|
|
65
|
+
*/
|
|
66
|
+
declare const defineWebSocketHelper: <T = unknown, U = any>(handler: WebSocketHelperDefineHandler<T, U>) => UpgradeWebSocket<T, U>;
|
|
67
|
+
//#endregion
|
|
68
|
+
export { WSEvents as a, WebSocketHelperDefineContext as c, defineWebSocketHelper as d, WSContextInit as i, WebSocketHelperDefineHandler as l, UpgradeWebSocket as n, WSMessageReceive as o, WSContext as r, WSReadyState as s, SendOptions as t, createWSMessageEvent as u };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { n as ContentfulStatusCode, s as ServerErrorStatusCode, t as ClientErrorStatusCode } from "./http-status-DaAwGAFL.js";
|
|
2
|
+
import { T as UnionToIntersection } from "./types-CwrQjlaM.js";
|
|
3
|
+
import { t as Acryl } from "./app-CmAYW1Al.js";
|
|
4
|
+
import { a as ClientResponse, i as ClientRequestOptions, n as Client, s as FilterClientResponseByStatusCode } from "./types-CHesD1KG.js";
|
|
5
|
+
|
|
6
|
+
//#region ../../plugins/acryl-router/src/core/client/client.d.ts
|
|
7
|
+
declare const hc: <T extends Acryl<any, any, any>, Prefix extends string = string>(baseUrl: Prefix, options?: ClientRequestOptions) => UnionToIntersection<Client<T, Prefix>>;
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region ../../plugins/acryl-router/src/core/client/fetch-result-please.d.ts
|
|
10
|
+
declare class DetailedError extends Error {
|
|
11
|
+
/**
|
|
12
|
+
* Additional `message` that will be logged AND returned to client
|
|
13
|
+
*/
|
|
14
|
+
detail?: any;
|
|
15
|
+
/**
|
|
16
|
+
* Additional `code` that will be logged AND returned to client
|
|
17
|
+
*/
|
|
18
|
+
code?: any;
|
|
19
|
+
/**
|
|
20
|
+
* Additional value that will be logged AND NOT returned to client
|
|
21
|
+
*/
|
|
22
|
+
log?: any;
|
|
23
|
+
/**
|
|
24
|
+
* Optionally set the status code to return, in a web server context
|
|
25
|
+
*/
|
|
26
|
+
statusCode?: any;
|
|
27
|
+
constructor(message: string, options?: {
|
|
28
|
+
detail?: any;
|
|
29
|
+
code?: any;
|
|
30
|
+
statusCode?: number;
|
|
31
|
+
log?: any;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region ../../plugins/acryl-router/src/core/client/utils.d.ts
|
|
36
|
+
/**
|
|
37
|
+
* Shortcut to get a consumable response from `hc`'s fetch calls (Response), with types inference.
|
|
38
|
+
*
|
|
39
|
+
* Smartly parse the response data, throwing a structured error if the response is not `ok`. ({@link DetailedError})
|
|
40
|
+
*
|
|
41
|
+
* @example const result = await parseResponse(client.posts.$get())
|
|
42
|
+
*/
|
|
43
|
+
declare function parseResponse<T extends ClientResponse<any>>(fetchRes: T | Promise<T>): Promise<FilterClientResponseByStatusCode<T, Exclude<ContentfulStatusCode, ClientErrorStatusCode | ServerErrorStatusCode>> extends never ? undefined : FilterClientResponseByStatusCode<T, Exclude<ContentfulStatusCode, ClientErrorStatusCode | ServerErrorStatusCode>> extends ClientResponse<infer RT, infer _, infer RF> ? RF extends 'json' ? RT : RT extends string ? RT : string : undefined>;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { DetailedError as n, hc as r, parseResponse as t };
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { A as Input, B as NotFoundResponse, D as Handler, I as MiddlewareHandler, J as Schema, R as Next, X as TypedResponse, Y as ToSchema, Z as ValidationTargets, _ as Env, a as ExecutionContext, n as ContextRenderer, o as AcrylRequest, r as ContextVariableMap, t as Context, v as ErrorHandler, z as NotFoundHandler } from "./context-Bm7rI-oK.js";
|
|
2
|
+
import { t as Acryl } from "./app-CmAYW1Al.js";
|
|
3
|
+
import { c as InferRequestType, i as ClientRequestOptions, l as InferResponseType } from "./types-CHesD1KG.js";
|
|
4
|
+
import { n as AppRequest, t as App } from "./index-B-3F4wt2.js";
|
|
5
|
+
export { Acryl, type AcrylRequest, App, type AppRequest, type ClientRequestOptions, Context, type ContextRenderer, type ContextVariableMap, type Env, type ErrorHandler, type ExecutionContext, type Handler, type InferRequestType, type InferResponseType, type Input, type MiddlewareHandler, type Next, type NotFoundHandler, type NotFoundResponse, type Schema, type ToSchema, type TypedResponse, type ValidationTargets };
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { t as Context } from "./context-DDO0cfuP.js";
|
|
2
|
+
import { t as Acryl } from "./app-BM0rTCp7.js";
|
|
3
|
+
//#region ../../plugins/acryl-router/src/core/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* @module
|
|
6
|
+
*
|
|
7
|
+
* Acryl - Web Framework built on Web Standards
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Acryl } from 'acrylblends'
|
|
12
|
+
* const app = new Acryl()
|
|
13
|
+
*
|
|
14
|
+
* app.get('/', (c) => c.text('Acryl!'))
|
|
15
|
+
*
|
|
16
|
+
* export default app
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region ../../plugins/acryl-router/src/deprecated.ts
|
|
21
|
+
/**
|
|
22
|
+
* The 0.4 names, kept for one release so code written against them keeps working: `App` is now `Acryl` and `AppRequest` is now `AcrylRequest`,
|
|
23
|
+
* the upstream names with the project renamed. Not part of the ported core; both the plugin's root and the public package's root export these.
|
|
24
|
+
*/
|
|
25
|
+
/** @deprecated Use `Acryl` (`new Acryl()`); `App` is the 0.4 name and goes away in the next release. */
|
|
26
|
+
const App = Acryl;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { Acryl, App, Context };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { I as MiddlewareHandler, t as Context } from "./context-Bm7rI-oK.js";
|
|
2
|
+
import { r as GetConnInfo, t as AddressType } from "./types-CDO6I3B0.js";
|
|
3
|
+
|
|
4
|
+
//#region ../../plugins/acryl-router/src/core/middleware/ip-restriction/index.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Function to get IP Address
|
|
7
|
+
*/
|
|
8
|
+
type GetIPAddr = GetConnInfo | ((c: Context) => string);
|
|
9
|
+
type IPRestrictionRule = string | ((addr: {
|
|
10
|
+
addr: string;
|
|
11
|
+
type: AddressType;
|
|
12
|
+
}) => boolean);
|
|
13
|
+
/**
|
|
14
|
+
* Rules for IP Restriction Middleware
|
|
15
|
+
*/
|
|
16
|
+
interface IPRestrictionRules {
|
|
17
|
+
denyList?: IPRestrictionRule[];
|
|
18
|
+
allowList?: IPRestrictionRule[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* IP Restriction Middleware for Acryl.
|
|
22
|
+
*
|
|
23
|
+
*
|
|
24
|
+
* @param {GetConnInfo | ((c: Context) => string)} getIP - A function to retrieve the client IP address. Use `getConnInfo` from the appropriate runtime adapter.
|
|
25
|
+
* @param {IPRestrictionRules} rules - An object with optional `denyList` and `allowList` arrays of IP rules. Each rule can be a static IP, a CIDR range, or a custom function.
|
|
26
|
+
* @param {(remote: { addr: string; type: AddressType }, c: Context) => Response | Promise<Response>} [onError] - Optional custom handler invoked when a request is blocked. Defaults to returning a 403 Forbidden response.
|
|
27
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { Acryl } from 'acrylblends'
|
|
32
|
+
* import { ipRestriction } from 'acrylblends/ip-restriction'
|
|
33
|
+
* import { getConnInfo } from 'acrylblends/cloudflare-workers'
|
|
34
|
+
*
|
|
35
|
+
* const app = new Acryl()
|
|
36
|
+
*
|
|
37
|
+
* app.use(
|
|
38
|
+
* '*',
|
|
39
|
+
* ipRestriction(getConnInfo, {
|
|
40
|
+
* // Block a specific IP and an entire subnet
|
|
41
|
+
* denyList: ['192.168.0.5', '10.0.0.0/8'],
|
|
42
|
+
* // Only allow requests from localhost and a private range
|
|
43
|
+
* allowList: ['127.0.0.1', '::1', '192.168.1.0/24'],
|
|
44
|
+
* })
|
|
45
|
+
* )
|
|
46
|
+
*
|
|
47
|
+
* // With a custom error handler
|
|
48
|
+
* app.use(
|
|
49
|
+
* '/admin/*',
|
|
50
|
+
* ipRestriction(
|
|
51
|
+
* getConnInfo,
|
|
52
|
+
* { allowList: ['203.0.113.0/24'] },
|
|
53
|
+
* (remote, c) => c.text(`Access denied for ${remote.addr}`, 403)
|
|
54
|
+
* )
|
|
55
|
+
* )
|
|
56
|
+
*
|
|
57
|
+
* app.get('/', (c) => c.text('Hello!'))
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare const ipRestriction: (getIP: GetIPAddr, {
|
|
61
|
+
denyList,
|
|
62
|
+
allowList
|
|
63
|
+
}: IPRestrictionRules, onError?: (remote: {
|
|
64
|
+
addr: string;
|
|
65
|
+
type: AddressType;
|
|
66
|
+
}, c: Context) => Response | Promise<Response>) => MiddlewareHandler;
|
|
67
|
+
//#endregion
|
|
68
|
+
export { IPRestrictionRule, IPRestrictionRules, ipRestriction };
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { HTTPException } from "./http-exception.js";
|
|
2
|
+
import { convertIPv4MappedIPv6ToIPv4, convertIPv4ToBinary, convertIPv6BinaryToString, convertIPv6ToBinary, distinctRemoteAddr, isIPv4MappedIPv6 } from "./utils/ipaddr.js";
|
|
3
|
+
//#region ../../plugins/acryl-router/src/core/middleware/ip-restriction/index.ts
|
|
4
|
+
const IS_CIDR_NOTATION_REGEX = /\/[^/]*$/;
|
|
5
|
+
const parseCidrPrefix = (rule, prefix, max) => {
|
|
6
|
+
if (!/^[0-9]{1,3}$/.test(prefix)) throw new TypeError(`Invalid rule: ${rule}`);
|
|
7
|
+
const parsedPrefix = parseInt(prefix);
|
|
8
|
+
if (parsedPrefix > max) throw new TypeError(`Invalid rule: ${rule}`);
|
|
9
|
+
return parsedPrefix;
|
|
10
|
+
};
|
|
11
|
+
const buildMatcher = (rules) => {
|
|
12
|
+
const functionRules = [];
|
|
13
|
+
const staticRules = /* @__PURE__ */ new Set();
|
|
14
|
+
const staticIPv4Rules = /* @__PURE__ */ new Set();
|
|
15
|
+
const staticIPv6Rules = /* @__PURE__ */ new Set();
|
|
16
|
+
const cidrRules = [];
|
|
17
|
+
const registerStaticRule = (rule) => {
|
|
18
|
+
const type = distinctRemoteAddr(rule);
|
|
19
|
+
if (type === void 0) throw new TypeError(`Invalid rule: ${rule}`);
|
|
20
|
+
if (type === "IPv4") {
|
|
21
|
+
const ipv4binary = convertIPv4ToBinary(rule);
|
|
22
|
+
staticRules.add(rule);
|
|
23
|
+
staticRules.add(`::ffff:${rule}`);
|
|
24
|
+
staticIPv4Rules.add(ipv4binary);
|
|
25
|
+
staticIPv6Rules.add(65535n << 32n | ipv4binary);
|
|
26
|
+
} else {
|
|
27
|
+
const ipv6binary = convertIPv6ToBinary(rule);
|
|
28
|
+
const ipv6Addr = convertIPv6BinaryToString(ipv6binary);
|
|
29
|
+
staticRules.add(ipv6Addr);
|
|
30
|
+
staticIPv6Rules.add(ipv6binary);
|
|
31
|
+
if (isIPv4MappedIPv6(ipv6binary)) {
|
|
32
|
+
staticRules.add(ipv6Addr.substring(7));
|
|
33
|
+
staticIPv4Rules.add(convertIPv4MappedIPv6ToIPv4(ipv6binary));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
for (let rule of rules) if (rule === "*") return () => true;
|
|
38
|
+
else if (typeof rule === "function") functionRules.push(rule);
|
|
39
|
+
else {
|
|
40
|
+
if (IS_CIDR_NOTATION_REGEX.test(rule)) {
|
|
41
|
+
const separatedRule = rule.split("/");
|
|
42
|
+
const addrStr = separatedRule[0];
|
|
43
|
+
const type = distinctRemoteAddr(addrStr);
|
|
44
|
+
if (type === void 0) throw new TypeError(`Invalid rule: ${rule}`);
|
|
45
|
+
let isIPv4 = type === "IPv4";
|
|
46
|
+
let prefix = parseCidrPrefix(rule, separatedRule[1], isIPv4 ? 32 : 128);
|
|
47
|
+
if (isIPv4 ? prefix === 32 : prefix === 128) rule = addrStr;
|
|
48
|
+
else {
|
|
49
|
+
let addr = (isIPv4 ? convertIPv4ToBinary : convertIPv6ToBinary)(addrStr);
|
|
50
|
+
if (type === "IPv6" && isIPv4MappedIPv6(addr) && prefix >= 96) {
|
|
51
|
+
isIPv4 = true;
|
|
52
|
+
addr = convertIPv4MappedIPv6ToIPv4(addr);
|
|
53
|
+
prefix -= 96;
|
|
54
|
+
}
|
|
55
|
+
const mask = (1n << BigInt(prefix)) - 1n << BigInt((isIPv4 ? 32 : 128) - prefix);
|
|
56
|
+
cidrRules.push([
|
|
57
|
+
isIPv4,
|
|
58
|
+
addr & mask,
|
|
59
|
+
mask
|
|
60
|
+
]);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
registerStaticRule(rule);
|
|
65
|
+
}
|
|
66
|
+
return (remote) => {
|
|
67
|
+
if (staticRules.has(remote.addr)) return true;
|
|
68
|
+
const remoteAddr = remote.binaryAddr ||= (remote.isIPv4 ? convertIPv4ToBinary : convertIPv6ToBinary)(remote.addr);
|
|
69
|
+
const remoteIPv4Addr = remote.isIPv4 || isIPv4MappedIPv6(remoteAddr) ? remote.isIPv4 ? remoteAddr : convertIPv4MappedIPv6ToIPv4(remoteAddr) : void 0;
|
|
70
|
+
if ((remote.isIPv4 ? staticIPv4Rules : staticIPv6Rules).has(remoteAddr)) return true;
|
|
71
|
+
for (const [isIPv4, addr, mask] of cidrRules) {
|
|
72
|
+
if (isIPv4) {
|
|
73
|
+
if (remoteIPv4Addr === void 0) continue;
|
|
74
|
+
if ((remoteIPv4Addr & mask) === addr) return true;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (remote.isIPv4) continue;
|
|
78
|
+
if ((remoteAddr & mask) === addr) return true;
|
|
79
|
+
}
|
|
80
|
+
for (const rule of functionRules) if (rule({
|
|
81
|
+
addr: remote.addr,
|
|
82
|
+
type: remote.type
|
|
83
|
+
})) return true;
|
|
84
|
+
return false;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* IP Restriction Middleware for Acryl.
|
|
89
|
+
*
|
|
90
|
+
*
|
|
91
|
+
* @param {GetConnInfo | ((c: Context) => string)} getIP - A function to retrieve the client IP address. Use `getConnInfo` from the appropriate runtime adapter.
|
|
92
|
+
* @param {IPRestrictionRules} rules - An object with optional `denyList` and `allowList` arrays of IP rules. Each rule can be a static IP, a CIDR range, or a custom function.
|
|
93
|
+
* @param {(remote: { addr: string; type: AddressType }, c: Context) => Response | Promise<Response>} [onError] - Optional custom handler invoked when a request is blocked. Defaults to returning a 403 Forbidden response.
|
|
94
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```ts
|
|
98
|
+
* import { Acryl } from 'acrylblends'
|
|
99
|
+
* import { ipRestriction } from 'acrylblends/ip-restriction'
|
|
100
|
+
* import { getConnInfo } from 'acrylblends/cloudflare-workers'
|
|
101
|
+
*
|
|
102
|
+
* const app = new Acryl()
|
|
103
|
+
*
|
|
104
|
+
* app.use(
|
|
105
|
+
* '*',
|
|
106
|
+
* ipRestriction(getConnInfo, {
|
|
107
|
+
* // Block a specific IP and an entire subnet
|
|
108
|
+
* denyList: ['192.168.0.5', '10.0.0.0/8'],
|
|
109
|
+
* // Only allow requests from localhost and a private range
|
|
110
|
+
* allowList: ['127.0.0.1', '::1', '192.168.1.0/24'],
|
|
111
|
+
* })
|
|
112
|
+
* )
|
|
113
|
+
*
|
|
114
|
+
* // With a custom error handler
|
|
115
|
+
* app.use(
|
|
116
|
+
* '/admin/*',
|
|
117
|
+
* ipRestriction(
|
|
118
|
+
* getConnInfo,
|
|
119
|
+
* { allowList: ['203.0.113.0/24'] },
|
|
120
|
+
* (remote, c) => c.text(`Access denied for ${remote.addr}`, 403)
|
|
121
|
+
* )
|
|
122
|
+
* )
|
|
123
|
+
*
|
|
124
|
+
* app.get('/', (c) => c.text('Hello!'))
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
const ipRestriction = (getIP, { denyList = [], allowList = [] }, onError) => {
|
|
128
|
+
const allowLength = allowList.length;
|
|
129
|
+
const denyMatcher = buildMatcher(denyList);
|
|
130
|
+
const allowMatcher = buildMatcher(allowList);
|
|
131
|
+
const blockError = (c) => new HTTPException(403, { res: c.text("Forbidden", { status: 403 }) });
|
|
132
|
+
return async function ipRestriction(c, next) {
|
|
133
|
+
const connInfo = getIP(c);
|
|
134
|
+
const addr = typeof connInfo === "string" ? connInfo : connInfo.remote.address;
|
|
135
|
+
if (!addr) throw blockError(c);
|
|
136
|
+
const type = typeof connInfo !== "string" && connInfo.remote.addressType || distinctRemoteAddr(addr);
|
|
137
|
+
const remoteData = {
|
|
138
|
+
addr,
|
|
139
|
+
type,
|
|
140
|
+
isIPv4: type === "IPv4"
|
|
141
|
+
};
|
|
142
|
+
try {
|
|
143
|
+
if (denyMatcher(remoteData)) {
|
|
144
|
+
if (onError) return onError({
|
|
145
|
+
addr,
|
|
146
|
+
type
|
|
147
|
+
}, c);
|
|
148
|
+
throw blockError(c);
|
|
149
|
+
}
|
|
150
|
+
if (allowMatcher(remoteData)) return await next();
|
|
151
|
+
} catch (e) {
|
|
152
|
+
if (e instanceof TypeError && e.code === "ERR_INVALID_IP_ADDRESS") throw blockError(c);
|
|
153
|
+
throw e;
|
|
154
|
+
}
|
|
155
|
+
if (allowLength === 0) return await next();
|
|
156
|
+
else {
|
|
157
|
+
if (onError) return await onError({
|
|
158
|
+
addr,
|
|
159
|
+
type
|
|
160
|
+
}, c);
|
|
161
|
+
throw blockError(c);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
//#endregion
|
|
166
|
+
export { ipRestriction };
|
package/lib/jwk.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { I as MiddlewareHandler, t as Context } from "./context-Bm7rI-oK.js";
|
|
2
|
+
import { n as BufferSource } from "./types-CwrQjlaM.js";
|
|
3
|
+
import { i as CookiePrefixOptions } from "./cookie-ClMaKDQf.js";
|
|
4
|
+
import { i as AcrylJsonWebKey, n as VerifyOptions, s as AsymmetricAlgorithm } from "./jwt-Dg493Tai.js";
|
|
5
|
+
|
|
6
|
+
//#region ../../plugins/acryl-router/src/core/middleware/jwk/jwk.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* JWK Auth Middleware for Acryl.
|
|
9
|
+
*
|
|
10
|
+
*
|
|
11
|
+
* @param {object} options - The options for the JWK middleware.
|
|
12
|
+
* @param {AcrylJsonWebKey[] | ((ctx: Context) => Promise<AcrylJsonWebKey[]> | AcrylJsonWebKey[])} [options.keys] - The public keys used for JWK verification, or a function that returns them.
|
|
13
|
+
* @param {string | ((ctx: Context) => Promise<string> | string)} [options.jwks_uri] - If set to a URI string or a function that returns a URI string, attempt to fetch JWKs from it. The response must be a JSON object containing a `keys` array, which will be merged with the `keys` option.
|
|
14
|
+
* @param {boolean} [options.allow_anon] - If set to `true`, the middleware allows requests without a token to proceed without authentication.
|
|
15
|
+
* @param {string} [options.cookie] - If set, the middleware attempts to retrieve the token from a cookie with these options (optionally signed) only if no token is found in the header.
|
|
16
|
+
* @param {string} [options.headerName='Authorization'] - The name of the header to look for the JWT token. Default is 'Authorization'.
|
|
17
|
+
* @param {string} [options.realm] - The protection space described by the `realm` parameter of the returned `WWW-Authenticate` challenge header. Defaults to the request URL.
|
|
18
|
+
* @param {AsymmetricAlgorithm[]} options.alg - An array of allowed asymmetric algorithms for JWT verification. Only tokens signed with these algorithms will be accepted.
|
|
19
|
+
* @param {RequestInit} [init] - Optional init options for the `fetch` request when retrieving JWKS from a URI.
|
|
20
|
+
* @param {VerifyOptions} [options.verification] - Additional options for JWK payload verification.
|
|
21
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const app = new Acryl()
|
|
26
|
+
*
|
|
27
|
+
* app.use("/auth/*", jwk({
|
|
28
|
+
* jwks_uri: (c) => `https://${c.env.authServer}/.well-known/jwks.json`,
|
|
29
|
+
* headerName: 'x-custom-auth-header', // Optional, default is 'Authorization'
|
|
30
|
+
* }))
|
|
31
|
+
*
|
|
32
|
+
* app.get('/auth/page', (c) => {
|
|
33
|
+
* return c.text('You are authorized')
|
|
34
|
+
* })
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
declare const jwk: (options: {
|
|
38
|
+
keys?: AcrylJsonWebKey[] | ((ctx: Context) => Promise<AcrylJsonWebKey[]> | AcrylJsonWebKey[]);
|
|
39
|
+
jwks_uri?: string | ((ctx: Context) => Promise<string> | string);
|
|
40
|
+
allow_anon?: boolean;
|
|
41
|
+
cookie?: string | {
|
|
42
|
+
key: string;
|
|
43
|
+
secret?: string | BufferSource;
|
|
44
|
+
prefixOptions?: CookiePrefixOptions;
|
|
45
|
+
};
|
|
46
|
+
headerName?: string;
|
|
47
|
+
alg: AsymmetricAlgorithm[];
|
|
48
|
+
realm?: string;
|
|
49
|
+
verification?: VerifyOptions;
|
|
50
|
+
}, init?: RequestInit) => MiddlewareHandler;
|
|
51
|
+
//#endregion
|
|
52
|
+
export { jwk };
|