acrylblends 0.4.1 → 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/docs/framework/README.md +51 -51
- package/docs/framework/UPSTREAM.md +1 -1
- 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 → api/summary.md} +19 -17
- 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/{getting-started.md → cordis/acryl-in-a-cordis-app.md} +16 -16
- package/docs/framework/{concepts.md → cordis/concepts.md} +2 -2
- package/docs/framework/cordis/middleware.md +8 -0
- package/docs/framework/{migration-from-0-3.md → cordis/migration-from-0-3.md} +16 -13
- package/docs/framework/cordis/migration-from-0-4.md +14 -0
- package/docs/framework/{migration-from-dsh-webserver.md → cordis/migration-from-dsh-webserver.md} +7 -7
- package/docs/framework/{routing.md → cordis/mounting.md} +5 -108
- package/docs/framework/{node-server.md → cordis/node-server.md} +4 -4
- package/docs/framework/{surfaces.md → cordis/surfaces.md} +2 -2
- package/docs/framework/cordis/transport-and-cancellation.md +57 -0
- package/docs/framework/{validation.md → cordis/validation.md} +9 -9
- 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 +3 -3
- 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 +312 -14
- package/plugins/acryl-inspect/src/service.ts +2 -2
- 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/service.ts +10 -10
- 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 +4 -4
- 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 +23 -23
- 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 +2 -2
- package/plugins/extensions/resolve.ts +70 -10
- package/plugins/openai/prompt.ts +5 -5
- package/shared/AGENTS.core.md +16 -9
- 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/src/routes.ts +2 -2
- package/templates/todo/src/todo.ts +2 -2
- package/templates/todo/upstream.json +2 -2
- package/docs/framework/context.md +0 -129
- package/docs/framework/helpers.md +0 -118
- package/docs/framework/middleware.md +0 -154
- package/docs/framework/request.md +0 -106
- /package/docs/framework/{plugin-lifecycle.md → cordis/plugin-lifecycle.md} +0 -0
|
@@ -2,11 +2,11 @@ import { HttpResponse, http } from 'msw'
|
|
|
2
2
|
import { setupServer } from 'msw/node'
|
|
3
3
|
import { jwk } from './index.ts'
|
|
4
4
|
import { setSignedCookie } from '../../helper/cookie/index.ts'
|
|
5
|
-
import {
|
|
5
|
+
import { Acryl } from '../../app.ts'
|
|
6
6
|
import { HTTPException } from '../../http-exception.ts'
|
|
7
7
|
import { encodeBase64Url } from '../../utils/encode.ts'
|
|
8
8
|
import { Jwt } from '../../utils/jwt/index.ts'
|
|
9
|
-
import type {
|
|
9
|
+
import type { AcrylJsonWebKey } from '../../utils/jwt/jws.ts'
|
|
10
10
|
import { signing } from '../../utils/jwt/jws.ts'
|
|
11
11
|
import { verifyWithJwks } from '../../utils/jwt/jwt.ts'
|
|
12
12
|
import type { JWTPayload } from '../../utils/jwt/types.ts'
|
|
@@ -50,7 +50,7 @@ describe('JWK', () => {
|
|
|
50
50
|
handlerExecuted = false
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
-
const app = new
|
|
53
|
+
const app = new Acryl()
|
|
54
54
|
|
|
55
55
|
app.use('/backend-auth-or-anon/*', jwk({ keys: verify_keys, allow_anon: true, alg: ['RS256'] }))
|
|
56
56
|
|
|
@@ -117,7 +117,7 @@ describe('JWK', () => {
|
|
|
117
117
|
handlerExecuted = false
|
|
118
118
|
})
|
|
119
119
|
|
|
120
|
-
const app = new
|
|
120
|
+
const app = new Acryl()
|
|
121
121
|
|
|
122
122
|
app.use('/auth-with-keys/*', jwk({ keys: verify_keys, alg: ['RS256'] }))
|
|
123
123
|
app.use('/auth-with-keys-unicode/*', jwk({ keys: verify_keys, alg: ['RS256'] }))
|
|
@@ -301,7 +301,7 @@ describe('JWK', () => {
|
|
|
301
301
|
encodeBase64Url(utf8Encoder.encode(JSON.stringify(part)).buffer).replace(/=/g, '')
|
|
302
302
|
const encodeSignaturePart = (buf: ArrayBufferLike): string =>
|
|
303
303
|
encodeBase64Url(buf).replace(/=/g, '')
|
|
304
|
-
const jwtSignWithoutHeader = async (payload: JWTPayload, privateKey:
|
|
304
|
+
const jwtSignWithoutHeader = async (payload: JWTPayload, privateKey: AcrylJsonWebKey) => {
|
|
305
305
|
const encodedPayload = encodeJwtPart(payload)
|
|
306
306
|
const signaturePart = await signing(
|
|
307
307
|
privateKey,
|
|
@@ -328,7 +328,7 @@ describe('JWK', () => {
|
|
|
328
328
|
encodeBase64Url(utf8Encoder.encode(JSON.stringify(part)).buffer).replace(/=/g, '')
|
|
329
329
|
const encodeSignaturePart = (buf: ArrayBufferLike): string =>
|
|
330
330
|
encodeBase64Url(buf).replace(/=/g, '')
|
|
331
|
-
const jwtSignWithoutKid = async (payload: JWTPayload, privateKey:
|
|
331
|
+
const jwtSignWithoutKid = async (payload: JWTPayload, privateKey: AcrylJsonWebKey) => {
|
|
332
332
|
const encodedPayload = encodeJwtPart(payload)
|
|
333
333
|
const encodedHeader = encodeJwtPart({ alg: privateKey.alg, typ: 'JWT' })
|
|
334
334
|
const partialToken = `${encodedHeader}.${encodedPayload}`
|
|
@@ -490,7 +490,7 @@ describe('JWK', () => {
|
|
|
490
490
|
handlerExecuted = false
|
|
491
491
|
})
|
|
492
492
|
|
|
493
|
-
const app = new
|
|
493
|
+
const app = new Acryl()
|
|
494
494
|
|
|
495
495
|
app.use(
|
|
496
496
|
'/auth-with-keys/*',
|
|
@@ -587,7 +587,7 @@ describe('JWK', () => {
|
|
|
587
587
|
handlerExecuted = false
|
|
588
588
|
})
|
|
589
589
|
|
|
590
|
-
const app = new
|
|
590
|
+
const app = new Acryl()
|
|
591
591
|
|
|
592
592
|
app.use('/auth-with-keys/*', jwk({ keys: verify_keys, cookie: 'access_token', alg: ['RS256'] }))
|
|
593
593
|
app.use(
|
|
@@ -734,7 +734,7 @@ describe('JWK', () => {
|
|
|
734
734
|
handlerExecuted = false
|
|
735
735
|
})
|
|
736
736
|
|
|
737
|
-
const app = new
|
|
737
|
+
const app = new Acryl()
|
|
738
738
|
const test_secret = 'Shhh'
|
|
739
739
|
|
|
740
740
|
app.use(
|
|
@@ -826,7 +826,7 @@ describe('JWK', () => {
|
|
|
826
826
|
})
|
|
827
827
|
|
|
828
828
|
describe('Error handling with `cause`', () => {
|
|
829
|
-
const app = new
|
|
829
|
+
const app = new Acryl()
|
|
830
830
|
|
|
831
831
|
app.use('/auth-with-keys/*', jwk({ keys: verify_keys, alg: ['RS256'] }))
|
|
832
832
|
app.get('/auth-with-keys/*', (c) => c.text('Authorized'))
|
|
@@ -866,7 +866,7 @@ describe('JWK', () => {
|
|
|
866
866
|
return Date.now() / 1000 - 100
|
|
867
867
|
}
|
|
868
868
|
|
|
869
|
-
const app = new
|
|
869
|
+
const app = new Acryl()
|
|
870
870
|
|
|
871
871
|
app.use('/auth-with-keys-default/*', jwk({ keys: verify_keys, alg: ['RS256'] }))
|
|
872
872
|
app.use(
|
|
@@ -989,7 +989,7 @@ describe('JWK', () => {
|
|
|
989
989
|
handlerExecuted = false
|
|
990
990
|
})
|
|
991
991
|
|
|
992
|
-
const app = new
|
|
992
|
+
const app = new Acryl()
|
|
993
993
|
|
|
994
994
|
// Only allow RS256
|
|
995
995
|
app.use('/auth-whitelist-rs256/*', jwk({ keys: verify_keys, alg: ['RS256'] }))
|
|
@@ -1079,7 +1079,7 @@ describe('JWK', () => {
|
|
|
1079
1079
|
})
|
|
1080
1080
|
describe('WWW-Authenticate realm', () => {
|
|
1081
1081
|
it('Should default to the request URL', async () => {
|
|
1082
|
-
const app = new
|
|
1082
|
+
const app = new Acryl()
|
|
1083
1083
|
app.use('/auth/*', jwk({ keys: verify_keys, alg: ['RS256'] }))
|
|
1084
1084
|
app.get('/auth/*', (c) => c.text('ok'))
|
|
1085
1085
|
|
|
@@ -1092,7 +1092,7 @@ describe('JWK', () => {
|
|
|
1092
1092
|
})
|
|
1093
1093
|
|
|
1094
1094
|
it('Should use the configured realm', async () => {
|
|
1095
|
-
const app = new
|
|
1095
|
+
const app = new Acryl()
|
|
1096
1096
|
app.use('/auth/*', jwk({ keys: verify_keys, alg: ['RS256'], realm: 'my-api' }))
|
|
1097
1097
|
app.get('/auth/*', (c) => c.text('ok'))
|
|
1098
1098
|
|
|
@@ -1105,7 +1105,7 @@ describe('JWK', () => {
|
|
|
1105
1105
|
})
|
|
1106
1106
|
|
|
1107
1107
|
it('Should use the configured realm for an invalid token', async () => {
|
|
1108
|
-
const app = new
|
|
1108
|
+
const app = new Acryl()
|
|
1109
1109
|
app.use('/auth/*', jwk({ keys: verify_keys, alg: ['RS256'], realm: 'my-api' }))
|
|
1110
1110
|
app.get('/auth/*', (c) => c.text('ok'))
|
|
1111
1111
|
|
|
@@ -1120,7 +1120,7 @@ describe('JWK', () => {
|
|
|
1120
1120
|
})
|
|
1121
1121
|
|
|
1122
1122
|
it('Should escape double quotes in the realm', async () => {
|
|
1123
|
-
const app = new
|
|
1123
|
+
const app = new Acryl()
|
|
1124
1124
|
app.use('/auth/*', jwk({ keys: verify_keys, alg: ['RS256'], realm: 'my "quoted" api' }))
|
|
1125
1125
|
app.get('/auth/*', (c) => c.text('ok'))
|
|
1126
1126
|
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* JWK Auth Middleware for
|
|
3
|
+
* JWK Auth Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Context } from '../../context.ts'
|
|
7
7
|
import { getCookie, getSignedCookie } from '../../helper/cookie/index.ts'
|
|
8
8
|
import { HTTPException } from '../../http-exception.ts'
|
|
9
9
|
import type { MiddlewareHandler } from '../../types.ts'
|
|
10
|
+
import type { BufferSource } from '../../utils/types.ts'
|
|
10
11
|
import type { CookiePrefixOptions } from '../../utils/cookie.ts'
|
|
11
12
|
import { Jwt } from '../../utils/jwt/index.ts'
|
|
12
13
|
import '../../context.ts'
|
|
13
14
|
import type { AsymmetricAlgorithm } from '../../utils/jwt/jwa.ts'
|
|
14
|
-
import type {
|
|
15
|
+
import type { AcrylJsonWebKey } from '../../utils/jwt/jws.ts'
|
|
15
16
|
import type { VerifyOptions } from '../../utils/jwt/jwt.ts'
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
|
-
* JWK Auth Middleware for
|
|
19
|
+
* JWK Auth Middleware for Acryl.
|
|
19
20
|
*
|
|
20
21
|
*
|
|
21
22
|
* @param {object} options - The options for the JWK middleware.
|
|
22
|
-
* @param {
|
|
23
|
+
* @param {AcrylJsonWebKey[] | ((ctx: Context) => Promise<AcrylJsonWebKey[]> | AcrylJsonWebKey[])} [options.keys] - The public keys used for JWK verification, or a function that returns them.
|
|
23
24
|
* @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.
|
|
24
25
|
* @param {boolean} [options.allow_anon] - If set to `true`, the middleware allows requests without a token to proceed without authentication.
|
|
25
26
|
* @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.
|
|
@@ -32,7 +33,7 @@ import type { VerifyOptions } from '../../utils/jwt/jwt.ts'
|
|
|
32
33
|
*
|
|
33
34
|
* @example
|
|
34
35
|
* ```ts
|
|
35
|
-
* const app = new
|
|
36
|
+
* const app = new Acryl()
|
|
36
37
|
*
|
|
37
38
|
* app.use("/auth/*", jwk({
|
|
38
39
|
* jwks_uri: (c) => `https://${c.env.authServer}/.well-known/jwks.json`,
|
|
@@ -47,7 +48,7 @@ import type { VerifyOptions } from '../../utils/jwt/jwt.ts'
|
|
|
47
48
|
|
|
48
49
|
export const jwk = (
|
|
49
50
|
options: {
|
|
50
|
-
keys?:
|
|
51
|
+
keys?: AcrylJsonWebKey[] | ((ctx: Context) => Promise<AcrylJsonWebKey[]> | AcrylJsonWebKey[])
|
|
51
52
|
jwks_uri?: string | ((ctx: Context) => Promise<string> | string)
|
|
52
53
|
allow_anon?: boolean
|
|
53
54
|
cookie?:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, expectTypeOf } from 'vitest'
|
|
2
2
|
import { jwt } from './index.ts'
|
|
3
3
|
import type { JwtVariables } from './index.ts'
|
|
4
|
-
import {
|
|
4
|
+
import { Acryl } from '../../app.ts'
|
|
5
5
|
import { HTTPException } from '../../http-exception.ts'
|
|
6
6
|
|
|
7
7
|
describe('JWT', () => {
|
|
@@ -12,7 +12,7 @@ describe('JWT', () => {
|
|
|
12
12
|
handlerExecuted = false
|
|
13
13
|
})
|
|
14
14
|
|
|
15
|
-
const app = new
|
|
15
|
+
const app = new Acryl()
|
|
16
16
|
|
|
17
17
|
app.use('/auth/*', jwt({ secret: 'a-secret', alg: 'HS256' }))
|
|
18
18
|
app.use('/auth-unicode/*', jwt({ secret: 'a-secret', alg: 'HS256' }))
|
|
@@ -159,7 +159,7 @@ describe('JWT', () => {
|
|
|
159
159
|
handlerExecuted = false
|
|
160
160
|
})
|
|
161
161
|
|
|
162
|
-
const app = new
|
|
162
|
+
const app = new Acryl()
|
|
163
163
|
|
|
164
164
|
app.use(
|
|
165
165
|
'/auth/*',
|
|
@@ -352,7 +352,7 @@ describe('JWT', () => {
|
|
|
352
352
|
handlerExecuted = false
|
|
353
353
|
})
|
|
354
354
|
|
|
355
|
-
const app = new
|
|
355
|
+
const app = new Acryl()
|
|
356
356
|
|
|
357
357
|
app.use('/auth/*', jwt({ secret: 'a-secret', alg: 'HS256', cookie: 'access_token' }))
|
|
358
358
|
app.use('/auth-unicode/*', jwt({ secret: 'a-secret', alg: 'HS256', cookie: 'access_token' }))
|
|
@@ -441,7 +441,7 @@ describe('JWT', () => {
|
|
|
441
441
|
})
|
|
442
442
|
|
|
443
443
|
describe('Error handling with `cause`', () => {
|
|
444
|
-
const app = new
|
|
444
|
+
const app = new Acryl()
|
|
445
445
|
|
|
446
446
|
app.use('/auth/*', jwt({ secret: 'a-secret', alg: 'HS256' }))
|
|
447
447
|
app.get('/auth/*', (c) => c.text('Authorized'))
|
|
@@ -473,7 +473,7 @@ describe('JWT', () => {
|
|
|
473
473
|
handlerExecuted = false
|
|
474
474
|
})
|
|
475
475
|
|
|
476
|
-
const app = new
|
|
476
|
+
const app = new Acryl()
|
|
477
477
|
|
|
478
478
|
app.use(
|
|
479
479
|
'/auth/*',
|
|
@@ -526,7 +526,7 @@ describe('JWT', () => {
|
|
|
526
526
|
handlerExecuted = false
|
|
527
527
|
})
|
|
528
528
|
|
|
529
|
-
const app = new
|
|
529
|
+
const app = new Acryl()
|
|
530
530
|
|
|
531
531
|
app.use(
|
|
532
532
|
'/auth/*',
|
|
@@ -578,7 +578,7 @@ describe('JWT', () => {
|
|
|
578
578
|
handlerExecuted = false
|
|
579
579
|
})
|
|
580
580
|
|
|
581
|
-
const app = new
|
|
581
|
+
const app = new Acryl()
|
|
582
582
|
|
|
583
583
|
app.use(
|
|
584
584
|
'/auth/*',
|
|
@@ -630,7 +630,7 @@ describe('JWT', () => {
|
|
|
630
630
|
handlerExecuted = false
|
|
631
631
|
})
|
|
632
632
|
|
|
633
|
-
const app = new
|
|
633
|
+
const app = new Acryl()
|
|
634
634
|
|
|
635
635
|
app.use(
|
|
636
636
|
'/auth/*',
|
|
@@ -683,7 +683,7 @@ describe('JWT', () => {
|
|
|
683
683
|
})
|
|
684
684
|
|
|
685
685
|
it('Should reject tokens with mismatched algorithm', async () => {
|
|
686
|
-
const app = new
|
|
686
|
+
const app = new Acryl()
|
|
687
687
|
|
|
688
688
|
// Configure middleware to expect RS256
|
|
689
689
|
app.use('/auth/*', jwt({ secret: 'a-secret', alg: 'RS256' }))
|
|
@@ -725,7 +725,7 @@ describe('JWT', () => {
|
|
|
725
725
|
isAdmin: boolean
|
|
726
726
|
}
|
|
727
727
|
|
|
728
|
-
const app = new
|
|
728
|
+
const app = new Acryl<{ Variables: JwtVariables<User> }>()
|
|
729
729
|
|
|
730
730
|
app.get('/', (c) => {
|
|
731
731
|
const payload = c.var.jwtPayload
|
|
@@ -735,7 +735,7 @@ describe('JWT', () => {
|
|
|
735
735
|
})
|
|
736
736
|
|
|
737
737
|
it('Should infer unknown when JwtVariables is used without type parameter in Variables', () => {
|
|
738
|
-
const app = new
|
|
738
|
+
const app = new Acryl<{ Variables: JwtVariables }>()
|
|
739
739
|
|
|
740
740
|
app.get('/', (c) => {
|
|
741
741
|
const payload = c.var.jwtPayload
|
|
@@ -746,7 +746,7 @@ describe('JWT', () => {
|
|
|
746
746
|
})
|
|
747
747
|
describe('WWW-Authenticate realm', () => {
|
|
748
748
|
it('Should default to the request URL', async () => {
|
|
749
|
-
const app = new
|
|
749
|
+
const app = new Acryl()
|
|
750
750
|
app.use('/auth/*', jwt({ secret: 'a-secret', alg: 'HS256' }))
|
|
751
751
|
app.get('/auth/*', (c) => c.text('ok'))
|
|
752
752
|
|
|
@@ -759,7 +759,7 @@ describe('JWT', () => {
|
|
|
759
759
|
})
|
|
760
760
|
|
|
761
761
|
it('Should use the configured realm', async () => {
|
|
762
|
-
const app = new
|
|
762
|
+
const app = new Acryl()
|
|
763
763
|
app.use('/auth/*', jwt({ secret: 'a-secret', alg: 'HS256', realm: 'my-api' }))
|
|
764
764
|
app.get('/auth/*', (c) => c.text('ok'))
|
|
765
765
|
|
|
@@ -772,7 +772,7 @@ describe('JWT', () => {
|
|
|
772
772
|
})
|
|
773
773
|
|
|
774
774
|
it('Should use the configured realm for an invalid token', async () => {
|
|
775
|
-
const app = new
|
|
775
|
+
const app = new Acryl()
|
|
776
776
|
app.use('/auth/*', jwt({ secret: 'a-secret', alg: 'HS256', realm: 'my-api' }))
|
|
777
777
|
app.get('/auth/*', (c) => c.text('ok'))
|
|
778
778
|
|
|
@@ -787,7 +787,7 @@ describe('JWT', () => {
|
|
|
787
787
|
})
|
|
788
788
|
|
|
789
789
|
it('Should escape double quotes in the realm', async () => {
|
|
790
|
-
const app = new
|
|
790
|
+
const app = new Acryl()
|
|
791
791
|
app.use('/auth/*', jwt({ secret: 'a-secret', alg: 'HS256', realm: 'my "quoted" api' }))
|
|
792
792
|
app.get('/auth/*', (c) => c.text('ok'))
|
|
793
793
|
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* JWT Auth Middleware for
|
|
3
|
+
* JWT Auth Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Context } from '../../context.ts'
|
|
7
7
|
import { getCookie, getSignedCookie } from '../../helper/cookie/index.ts'
|
|
8
8
|
import { HTTPException } from '../../http-exception.ts'
|
|
9
9
|
import type { MiddlewareHandler } from '../../types.ts'
|
|
10
|
+
import type { BufferSource } from '../../utils/types.ts'
|
|
10
11
|
import type { CookiePrefixOptions } from '../../utils/cookie.ts'
|
|
11
12
|
import { Jwt } from '../../utils/jwt/index.ts'
|
|
12
13
|
import '../../context.ts'
|
|
@@ -20,7 +21,7 @@ export type JwtVariables<T = any> = {
|
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
|
-
* JWT Auth Middleware for
|
|
24
|
+
* JWT Auth Middleware for Acryl.
|
|
24
25
|
*
|
|
25
26
|
*
|
|
26
27
|
* @param {object} options - The options for the JWT middleware.
|
|
@@ -34,7 +35,7 @@ export type JwtVariables<T = any> = {
|
|
|
34
35
|
*
|
|
35
36
|
* @example
|
|
36
37
|
* ```ts
|
|
37
|
-
* const app = new
|
|
38
|
+
* const app = new Acryl()
|
|
38
39
|
*
|
|
39
40
|
* app.use(
|
|
40
41
|
* '/auth/*',
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { languageDetector } from './index.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { Acryl } from '../../app.ts'
|
|
3
3
|
import { DEFAULT_OPTIONS, detectors, normalizeLanguage } from './language.ts'
|
|
4
4
|
|
|
5
5
|
describe('languageDetector', () => {
|
|
6
6
|
const createTestApp = (options = {}) => {
|
|
7
|
-
const app = new
|
|
7
|
+
const app = new Acryl()
|
|
8
8
|
|
|
9
9
|
app.use('/*', languageDetector(options))
|
|
10
10
|
|
|
@@ -292,7 +292,7 @@ describe('languageDetector', () => {
|
|
|
292
292
|
})
|
|
293
293
|
|
|
294
294
|
it('should detect language from original URL when getPath modifies the path', async () => {
|
|
295
|
-
const app = new
|
|
295
|
+
const app = new Acryl({
|
|
296
296
|
getPath: (req) => {
|
|
297
297
|
const url = new URL(req.url)
|
|
298
298
|
let pathname = url.pathname
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* Language module for
|
|
3
|
+
* Language module for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
import type { Context } from '../../context.ts'
|
|
6
6
|
import { setCookie, getCookie } from '../../helper/cookie/index.ts'
|
|
@@ -274,12 +274,12 @@ const detectLanguage = (c: Context, options: DetectorOptions): string => {
|
|
|
274
274
|
/**
|
|
275
275
|
* Language detector middleware factory
|
|
276
276
|
* @param userOptions Configuration options for the language detector
|
|
277
|
-
* @returns
|
|
277
|
+
* @returns Acryl middleware function
|
|
278
278
|
*
|
|
279
279
|
* @example
|
|
280
280
|
* ```ts
|
|
281
281
|
* type Variables = LanguageVariables
|
|
282
|
-
* const app = new
|
|
282
|
+
* const app = new Acryl<{ Variables: Variables }>()
|
|
283
283
|
*
|
|
284
284
|
* app.use(
|
|
285
285
|
* languageDetector({
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { logger } from './index.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { Acryl } from '../../app.ts'
|
|
3
3
|
|
|
4
4
|
describe('Logger by Middleware', () => {
|
|
5
|
-
let app:
|
|
5
|
+
let app: Acryl
|
|
6
6
|
let log: string
|
|
7
7
|
|
|
8
8
|
beforeEach(() => {
|
|
@@ -10,7 +10,7 @@ describe('Logger by Middleware', () => {
|
|
|
10
10
|
return new Promise((resolve) => setTimeout(resolve, time))
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
app = new
|
|
13
|
+
app = new Acryl()
|
|
14
14
|
|
|
15
15
|
const logFn = (str: string) => {
|
|
16
16
|
log = str
|
|
@@ -127,7 +127,7 @@ describe('Logger by Middleware', () => {
|
|
|
127
127
|
})
|
|
128
128
|
|
|
129
129
|
describe('Logger by Middleware in NO_COLOR', () => {
|
|
130
|
-
let app:
|
|
130
|
+
let app: Acryl
|
|
131
131
|
let log: string
|
|
132
132
|
|
|
133
133
|
beforeEach(() => {
|
|
@@ -136,7 +136,7 @@ describe('Logger by Middleware in NO_COLOR', () => {
|
|
|
136
136
|
return new Promise((resolve) => setTimeout(resolve, time))
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
app = new
|
|
139
|
+
app = new Acryl()
|
|
140
140
|
|
|
141
141
|
const logFn = (str: string) => {
|
|
142
142
|
log = str
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* Logger Middleware for
|
|
3
|
+
* Logger Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { MiddlewareHandler } from '../../types.ts'
|
|
@@ -64,7 +64,7 @@ async function log(
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
|
-
* Logger Middleware for
|
|
67
|
+
* Logger Middleware for Acryl.
|
|
68
68
|
*
|
|
69
69
|
*
|
|
70
70
|
* @param {PrintFunc} [fn=console.log] - Optional function for customized logging behavior.
|
|
@@ -72,10 +72,10 @@ async function log(
|
|
|
72
72
|
*
|
|
73
73
|
* @example
|
|
74
74
|
* ```ts
|
|
75
|
-
* const app = new
|
|
75
|
+
* const app = new Acryl()
|
|
76
76
|
*
|
|
77
77
|
* app.use(logger())
|
|
78
|
-
* app.get('/', (c) => c.text('Hello
|
|
78
|
+
* app.get('/', (c) => c.text('Hello Acryl!'))
|
|
79
79
|
* ```
|
|
80
80
|
*/
|
|
81
81
|
export const logger = (fn: PrintFunc = console.log): MiddlewareHandler => {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { methodNotAllowed } from './index.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { Acryl } from '../../app.ts'
|
|
3
3
|
|
|
4
4
|
describe('Method Not Allowed Middleware', () => {
|
|
5
5
|
it('infers the environment from the app', () => {
|
|
6
|
-
const app = new
|
|
6
|
+
const app = new Acryl<{ Variables: { requestId: string } }>()
|
|
7
7
|
const middleware = methodNotAllowed({
|
|
8
8
|
app,
|
|
9
9
|
onMethodNotAllowed: (c) => c.text(c.var.requestId, 405),
|
|
@@ -13,7 +13,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
13
13
|
})
|
|
14
14
|
|
|
15
15
|
it('returns 405 with every allowed method for an existing path', async () => {
|
|
16
|
-
const app = new
|
|
16
|
+
const app = new Acryl()
|
|
17
17
|
app.use(methodNotAllowed({ app }))
|
|
18
18
|
app.get('/resource', (c) => c.text('GET'))
|
|
19
19
|
app.post('/resource', (c) => c.text('POST'))
|
|
@@ -31,7 +31,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
31
31
|
})
|
|
32
32
|
|
|
33
33
|
it('does not affect an allowed method', async () => {
|
|
34
|
-
const app = new
|
|
34
|
+
const app = new Acryl()
|
|
35
35
|
app.use(methodNotAllowed({ app }))
|
|
36
36
|
app.get('/resource', (c) => c.text('GET'))
|
|
37
37
|
|
|
@@ -43,7 +43,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
43
43
|
})
|
|
44
44
|
|
|
45
45
|
it('returns 404 when the path does not exist', async () => {
|
|
46
|
-
const app = new
|
|
46
|
+
const app = new Acryl()
|
|
47
47
|
app.use(methodNotAllowed({ app }))
|
|
48
48
|
app.get('/resource', (c) => c.text('GET'))
|
|
49
49
|
|
|
@@ -54,7 +54,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
54
54
|
})
|
|
55
55
|
|
|
56
56
|
it('matches parameterized and overlapping routes without duplicate methods', async () => {
|
|
57
|
-
const app = new
|
|
57
|
+
const app = new Acryl()
|
|
58
58
|
app.use(methodNotAllowed({ app }))
|
|
59
59
|
app.get('/users/:id', (_c, next) => next())
|
|
60
60
|
app.get('/users/me', (c) => c.text('me'))
|
|
@@ -67,7 +67,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
67
67
|
})
|
|
68
68
|
|
|
69
69
|
it('preserves an intentional 404 from a handler registered for the request method', async () => {
|
|
70
|
-
const app = new
|
|
70
|
+
const app = new Acryl()
|
|
71
71
|
app.use(methodNotAllowed({ app }))
|
|
72
72
|
app.get('/users/:id', (c) => c.notFound())
|
|
73
73
|
app.post('/users/:id', (c) => c.text('Created'))
|
|
@@ -79,7 +79,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
79
79
|
})
|
|
80
80
|
|
|
81
81
|
it('preserves an intentional 404 for HEAD when a GET route is registered', async () => {
|
|
82
|
-
const app = new
|
|
82
|
+
const app = new Acryl()
|
|
83
83
|
app.use(methodNotAllowed({ app }))
|
|
84
84
|
app.get('/users/:id', (c) => c.notFound())
|
|
85
85
|
app.post('/users/:id', (c) => c.text('Created'))
|
|
@@ -91,7 +91,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
91
91
|
})
|
|
92
92
|
|
|
93
93
|
it('preserves a 404 returned by the error handler', async () => {
|
|
94
|
-
const app = new
|
|
94
|
+
const app = new Acryl()
|
|
95
95
|
app.onError((_error, c) => c.text('Handled error', 404))
|
|
96
96
|
app.use(methodNotAllowed({ app }))
|
|
97
97
|
app.use('/resource', () => {
|
|
@@ -107,7 +107,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
107
107
|
})
|
|
108
108
|
|
|
109
109
|
it('returns 405 for HEAD when the path does not support GET', async () => {
|
|
110
|
-
const app = new
|
|
110
|
+
const app = new Acryl()
|
|
111
111
|
app.use(methodNotAllowed({ app }))
|
|
112
112
|
app.post('/resource', (c) => c.text('POST'))
|
|
113
113
|
|
|
@@ -118,8 +118,8 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
118
118
|
expect(await res.text()).toBe('')
|
|
119
119
|
})
|
|
120
120
|
|
|
121
|
-
it('does not advertise explicit HEAD routes that
|
|
122
|
-
const app = new
|
|
121
|
+
it('does not advertise explicit HEAD routes that Acryl cannot dispatch', async () => {
|
|
122
|
+
const app = new Acryl()
|
|
123
123
|
app.use(methodNotAllowed({ app }))
|
|
124
124
|
app.on('HEAD', '/resource', (c) => c.text('HEAD'))
|
|
125
125
|
|
|
@@ -133,7 +133,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
133
133
|
})
|
|
134
134
|
|
|
135
135
|
it('supports custom methods', async () => {
|
|
136
|
-
const app = new
|
|
136
|
+
const app = new Acryl()
|
|
137
137
|
app.use(methodNotAllowed({ app }))
|
|
138
138
|
app.on('PURGE', '/cache', (c) => c.text('Purged'))
|
|
139
139
|
|
|
@@ -144,7 +144,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
144
144
|
})
|
|
145
145
|
|
|
146
146
|
it('compares request methods case-sensitively', async () => {
|
|
147
|
-
const app = new
|
|
147
|
+
const app = new Acryl()
|
|
148
148
|
app.use(methodNotAllowed({ app }))
|
|
149
149
|
app.patch('/item', (c) => c.text('PATCH'))
|
|
150
150
|
|
|
@@ -157,11 +157,11 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
157
157
|
})
|
|
158
158
|
|
|
159
159
|
it('works with routes mounted using app.route()', async () => {
|
|
160
|
-
const api = new
|
|
160
|
+
const api = new Acryl()
|
|
161
161
|
api.get('/resource', (c) => c.text('GET'))
|
|
162
162
|
api.post('/resource', (c) => c.text('POST'))
|
|
163
163
|
|
|
164
|
-
const app = new
|
|
164
|
+
const app = new Acryl()
|
|
165
165
|
app.use(methodNotAllowed({ app }))
|
|
166
166
|
app.route('/api', api)
|
|
167
167
|
|
|
@@ -172,12 +172,12 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
172
172
|
})
|
|
173
173
|
|
|
174
174
|
it('works when installed in an app mounted using app.route()', async () => {
|
|
175
|
-
const api = new
|
|
175
|
+
const api = new Acryl().basePath('/v1')
|
|
176
176
|
api.use(methodNotAllowed({ app: api }))
|
|
177
177
|
api.get('/resource', (c) => c.text('GET'))
|
|
178
178
|
api.post('/resource', (c) => c.text('POST'))
|
|
179
179
|
|
|
180
|
-
const app = new
|
|
180
|
+
const app = new Acryl()
|
|
181
181
|
app.route('/api', api)
|
|
182
182
|
|
|
183
183
|
const res = await app.request('/api/v1/resource', { method: 'DELETE' })
|
|
@@ -187,7 +187,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
187
187
|
})
|
|
188
188
|
|
|
189
189
|
it('ignores ALL routes when collecting allowed methods', async () => {
|
|
190
|
-
const app = new
|
|
190
|
+
const app = new Acryl()
|
|
191
191
|
app.use(methodNotAllowed({ app }))
|
|
192
192
|
app.all('/resource', (_c, next) => next())
|
|
193
193
|
|
|
@@ -198,7 +198,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
198
198
|
})
|
|
199
199
|
|
|
200
200
|
it('does not invoke the error handler for a 405 response', async () => {
|
|
201
|
-
const app = new
|
|
201
|
+
const app = new Acryl()
|
|
202
202
|
const onError = vi.fn(() => new Response('error', { status: 500 }))
|
|
203
203
|
app.onError(onError)
|
|
204
204
|
app.use(methodNotAllowed({ app }))
|
|
@@ -211,7 +211,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
211
211
|
})
|
|
212
212
|
|
|
213
213
|
it('preserves downstream headers and lets outer middleware observe the final status', async () => {
|
|
214
|
-
const app = new
|
|
214
|
+
const app = new Acryl()
|
|
215
215
|
let observedStatus: number | undefined
|
|
216
216
|
|
|
217
217
|
app.use(async (c, next) => {
|
|
@@ -233,7 +233,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
233
233
|
})
|
|
234
234
|
|
|
235
235
|
it('replaces stale representation headers from the not-found response', async () => {
|
|
236
|
-
const app = new
|
|
236
|
+
const app = new Acryl()
|
|
237
237
|
app.use(methodNotAllowed({ app }))
|
|
238
238
|
app.get('/resource', (c) => c.text('GET'))
|
|
239
239
|
app.post('/resource', (c) => c.text('POST'))
|
|
@@ -253,7 +253,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
253
253
|
})
|
|
254
254
|
|
|
255
255
|
it('supports a custom method-not-allowed response', async () => {
|
|
256
|
-
const app = new
|
|
256
|
+
const app = new Acryl()
|
|
257
257
|
app.use(
|
|
258
258
|
methodNotAllowed({
|
|
259
259
|
app,
|
|
@@ -278,7 +278,7 @@ describe('Method Not Allowed Middleware', () => {
|
|
|
278
278
|
})
|
|
279
279
|
|
|
280
280
|
it('leaves a non-404 custom not-found response unchanged', async () => {
|
|
281
|
-
const app = new
|
|
281
|
+
const app = new Acryl()
|
|
282
282
|
app.use(methodNotAllowed({ app }))
|
|
283
283
|
app.get('/resource', (c) => c.text('GET'))
|
|
284
284
|
app.notFound((c) => c.text('Missing', 410))
|