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
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* Method Not Allowed Middleware for
|
|
3
|
+
* Method Not Allowed Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Context } from '../../context.ts'
|
|
7
7
|
import { basePath, matchedRoutes } from '../../helper/route/index.ts'
|
|
8
|
-
import type {
|
|
8
|
+
import type { Acryl } from '../../app.ts'
|
|
9
9
|
import { METHOD_NAME_ALL } from '../../router.ts'
|
|
10
10
|
import { TrieRouter } from '../../router/trie-router/index.ts'
|
|
11
11
|
import type { Env, MiddlewareHandler } from '../../types.ts'
|
|
@@ -17,24 +17,24 @@ type MethodNotAllowedHandler<E extends Env> = (
|
|
|
17
17
|
|
|
18
18
|
type MethodNotAllowedOptions<E extends Env> = {
|
|
19
19
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
-
app:
|
|
20
|
+
app: Acryl<E, any, any>
|
|
21
21
|
onMethodNotAllowed?: MethodNotAllowedHandler<E>
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* Method Not Allowed Middleware for
|
|
25
|
+
* Method Not Allowed Middleware for Acryl.
|
|
26
26
|
*
|
|
27
27
|
* Returns a `405 Method Not Allowed` response with an `Allow` header when the request path
|
|
28
28
|
* matches a registered route but the request method is not supported.
|
|
29
29
|
*
|
|
30
30
|
* @param {MethodNotAllowedOptions} options - The options for the middleware.
|
|
31
|
-
* @param {
|
|
31
|
+
* @param {Acryl} options.app - The Acryl instance used by the application.
|
|
32
32
|
* @param {MethodNotAllowedHandler} [options.onMethodNotAllowed] - Generates the response, including its `Allow` header.
|
|
33
33
|
* @returns {MiddlewareHandler} The middleware handler function.
|
|
34
34
|
*
|
|
35
35
|
* @example
|
|
36
36
|
* ```ts
|
|
37
|
-
* const app = new
|
|
37
|
+
* const app = new Acryl()
|
|
38
38
|
*
|
|
39
39
|
* app.use(methodNotAllowed({ app }))
|
|
40
40
|
*
|
|
@@ -77,7 +77,7 @@ export const methodNotAllowed = <E extends Env = Env>(
|
|
|
77
77
|
const methodsByPath = new Map<string, Set<string>>()
|
|
78
78
|
|
|
79
79
|
for (const route of options.app.routes) {
|
|
80
|
-
//
|
|
80
|
+
// Acryl does not distinguish middleware registered with `app.use()` from handlers
|
|
81
81
|
// registered with `app.all()`, so `ALL` routes cannot contribute to the Allow header.
|
|
82
82
|
if (route.method === METHOD_NAME_ALL || route.method === 'HEAD') {
|
|
83
83
|
continue
|
|
@@ -86,7 +86,7 @@ export const methodNotAllowed = <E extends Env = Env>(
|
|
|
86
86
|
const methods = methodsByPath.get(route.path) ?? new Set<string>()
|
|
87
87
|
methods.add(route.method)
|
|
88
88
|
|
|
89
|
-
//
|
|
89
|
+
// Acryl dispatches HEAD requests to GET routes.
|
|
90
90
|
if (route.method === 'GET') {
|
|
91
91
|
methods.add('HEAD')
|
|
92
92
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Acryl } from '../../app.ts'
|
|
2
2
|
import { methodOverride } from './index.ts'
|
|
3
3
|
|
|
4
4
|
describe('Method Override Middleware', () => {
|
|
5
5
|
describe('Form', () => {
|
|
6
|
-
const app = new
|
|
6
|
+
const app = new Acryl()
|
|
7
7
|
app.use('/posts/*', methodOverride({ app }))
|
|
8
8
|
app.use('/posts-custom/*', methodOverride({ app, form: 'custom-input-name' }))
|
|
9
9
|
app.on(['post', 'delete'], ['/posts', '/posts-custom'], async (c) => {
|
|
@@ -126,7 +126,7 @@ describe('Method Override Middleware', () => {
|
|
|
126
126
|
})
|
|
127
127
|
|
|
128
128
|
describe('Header', () => {
|
|
129
|
-
const app = new
|
|
129
|
+
const app = new Acryl()
|
|
130
130
|
app.use('/posts/*', methodOverride({ app, header: 'X-METHOD-OVERRIDE' }))
|
|
131
131
|
app.on(['get', 'post', 'delete'], '/posts', async (c) => {
|
|
132
132
|
return c.json({
|
|
@@ -165,7 +165,7 @@ describe('Method Override Middleware', () => {
|
|
|
165
165
|
})
|
|
166
166
|
|
|
167
167
|
describe('Query', () => {
|
|
168
|
-
const app = new
|
|
168
|
+
const app = new Acryl()
|
|
169
169
|
app.use('/posts/*', methodOverride({ app, query: '_method' }))
|
|
170
170
|
app.on(['get', 'post', 'delete'], '/posts', async (c) => {
|
|
171
171
|
return c.json({
|
|
@@ -186,7 +186,7 @@ describe('Method Override Middleware', () => {
|
|
|
186
186
|
})
|
|
187
187
|
|
|
188
188
|
it('Should override POST to DELETE when the request has a body', async () => {
|
|
189
|
-
const app = new
|
|
189
|
+
const app = new Acryl()
|
|
190
190
|
app.use('/posts/*', methodOverride({ app, query: '_method' }))
|
|
191
191
|
app.on(['post', 'delete'], '/posts', async (c) => {
|
|
192
192
|
return c.json({
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* Method Override Middleware for
|
|
3
|
+
* Method Override Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Context, ExecutionContext } from '../../context.ts'
|
|
7
|
-
import type {
|
|
7
|
+
import type { Acryl } from '../../app.ts'
|
|
8
8
|
import type { MiddlewareHandler } from '../../types.ts'
|
|
9
9
|
import { parseBody } from '../../utils/body.ts'
|
|
10
10
|
|
|
11
11
|
type MethodOverrideOptions = {
|
|
12
12
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
-
app:
|
|
13
|
+
app: Acryl<any, any, any>
|
|
14
14
|
} & (
|
|
15
15
|
| {
|
|
16
16
|
// Default is 'form' and the value is `_method`
|
|
@@ -33,11 +33,11 @@ type MethodOverrideOptions = {
|
|
|
33
33
|
const DEFAULT_METHOD_FORM_NAME = '_method'
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
|
-
* Method Override Middleware for
|
|
36
|
+
* Method Override Middleware for Acryl.
|
|
37
37
|
*
|
|
38
38
|
*
|
|
39
39
|
* @param {MethodOverrideOptions} options - The options for the method override middleware.
|
|
40
|
-
* @param {
|
|
40
|
+
* @param {Acryl} options.app - The instance of Acryl is used in your application.
|
|
41
41
|
* @param {string} [options.form=_method] - Form key with a value containing the method name.
|
|
42
42
|
* @param {string} [options.header] - Header name with a value containing the method name.
|
|
43
43
|
* @param {string} [options.query] - Query parameter key with a value containing the method name.
|
|
@@ -45,7 +45,7 @@ const DEFAULT_METHOD_FORM_NAME = '_method'
|
|
|
45
45
|
*
|
|
46
46
|
* @example
|
|
47
47
|
* ```ts
|
|
48
|
-
* const app = new
|
|
48
|
+
* const app = new Acryl()
|
|
49
49
|
*
|
|
50
50
|
* // If no options are specified, the value of `_method` in the form,
|
|
51
51
|
* // e.g. DELETE, is used as the method.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { poweredBy } from './index.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { Acryl } from '../../app.ts'
|
|
3
3
|
|
|
4
4
|
describe('Powered by Middleware', () => {
|
|
5
|
-
const app = new
|
|
5
|
+
const app = new Acryl()
|
|
6
6
|
|
|
7
7
|
app.use('/poweredBy/*', poweredBy())
|
|
8
8
|
app.get('/poweredBy', (c) => c.text('root'))
|
|
@@ -18,14 +18,14 @@ describe('Powered by Middleware', () => {
|
|
|
18
18
|
const res = await app.request('http://localhost/poweredBy')
|
|
19
19
|
expect(res).not.toBeNull()
|
|
20
20
|
expect(res.status).toBe(200)
|
|
21
|
-
expect(res.headers.get('X-Powered-By')).toBe('
|
|
21
|
+
expect(res.headers.get('X-Powered-By')).toBe('Acryl')
|
|
22
22
|
})
|
|
23
23
|
|
|
24
24
|
it('Should not return duplicate values', async () => {
|
|
25
25
|
const res = await app.request('http://localhost/poweredBy2')
|
|
26
26
|
expect(res).not.toBeNull()
|
|
27
27
|
expect(res.status).toBe(200)
|
|
28
|
-
expect(res.headers.get('X-Powered-By')).toBe('
|
|
28
|
+
expect(res.headers.get('X-Powered-By')).toBe('Acryl')
|
|
29
29
|
})
|
|
30
30
|
|
|
31
31
|
it('Should return custom serverName', async () => {
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* Powered By Middleware for
|
|
3
|
+
* Powered By Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
import type { MiddlewareHandler } from '../../types.ts'
|
|
6
6
|
|
|
7
7
|
type PoweredByOptions = {
|
|
8
8
|
/**
|
|
9
9
|
* The value for X-Powered-By header.
|
|
10
|
-
* @default
|
|
10
|
+
* @default Acryl
|
|
11
11
|
*/
|
|
12
12
|
serverName?: string
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* Powered By Middleware for
|
|
16
|
+
* Powered By Middleware for Acryl.
|
|
17
17
|
*
|
|
18
18
|
* @param options - The options for the Powered By Middleware.
|
|
19
19
|
* @returns {MiddlewareHandler} The middleware handler function.
|
|
20
20
|
*
|
|
21
21
|
* @example
|
|
22
22
|
* ```ts
|
|
23
|
-
* import { poweredBy } from '
|
|
23
|
+
* import { poweredBy } from 'acrylblends/powered-by'
|
|
24
24
|
*
|
|
25
|
-
* const app = new
|
|
25
|
+
* const app = new Acryl()
|
|
26
26
|
*
|
|
27
27
|
* app.use(poweredBy()) // With options: poweredBy({ serverName: "My Server" })
|
|
28
28
|
* ```
|
|
@@ -30,6 +30,6 @@ type PoweredByOptions = {
|
|
|
30
30
|
export const poweredBy = (options?: PoweredByOptions): MiddlewareHandler => {
|
|
31
31
|
return async function poweredBy(c, next) {
|
|
32
32
|
await next()
|
|
33
|
-
c.res.headers.set('X-Powered-By', options?.serverName ?? '
|
|
33
|
+
c.res.headers.set('X-Powered-By', options?.serverName ?? 'Acryl')
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
1
|
import { prettyJSON } from './index.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { Acryl } from '../../app.ts'
|
|
3
3
|
|
|
4
4
|
describe('JSON pretty by Middleware', () => {
|
|
5
5
|
it('Should return pretty JSON output', async () => {
|
|
6
|
-
const app = new
|
|
6
|
+
const app = new Acryl()
|
|
7
7
|
app.use('*', prettyJSON())
|
|
8
8
|
app.get('/', (c) => {
|
|
9
|
-
return c.json({ message: '
|
|
9
|
+
return c.json({ message: 'Acryl!' })
|
|
10
10
|
})
|
|
11
11
|
|
|
12
12
|
const res = await app.request('http://localhost/?pretty')
|
|
13
13
|
expect(res).not.toBeNull()
|
|
14
14
|
expect(res.status).toBe(200)
|
|
15
15
|
expect(await res.text()).toBe(`{
|
|
16
|
-
"message": "
|
|
16
|
+
"message": "Acryl!"
|
|
17
17
|
}`)
|
|
18
18
|
})
|
|
19
19
|
|
|
20
20
|
it('Should return pretty JSON output with 4 spaces', async () => {
|
|
21
|
-
const app = new
|
|
21
|
+
const app = new Acryl()
|
|
22
22
|
app.use('*', prettyJSON({ space: 4 }))
|
|
23
23
|
app.get('/', (c) => {
|
|
24
|
-
return c.json({ message: '
|
|
24
|
+
return c.json({ message: 'Acryl!' })
|
|
25
25
|
})
|
|
26
26
|
|
|
27
27
|
const res = await app.request('http://localhost/?pretty')
|
|
28
28
|
expect(res).not.toBeNull()
|
|
29
29
|
expect(res.status).toBe(200)
|
|
30
30
|
expect(await res.text()).toBe(`{
|
|
31
|
-
"message": "
|
|
31
|
+
"message": "Acryl!"
|
|
32
32
|
}`)
|
|
33
33
|
})
|
|
34
34
|
|
|
35
35
|
it('Should return pretty JSON output when middleware received custom query', async () => {
|
|
36
36
|
const targetQuery = 'format'
|
|
37
37
|
|
|
38
|
-
const app = new
|
|
38
|
+
const app = new Acryl()
|
|
39
39
|
app.use(
|
|
40
40
|
'*',
|
|
41
41
|
prettyJSON({
|
|
@@ -44,38 +44,38 @@ describe('JSON pretty by Middleware', () => {
|
|
|
44
44
|
)
|
|
45
45
|
app.get('/', (c) =>
|
|
46
46
|
c.json({
|
|
47
|
-
message: '
|
|
47
|
+
message: 'Acryl!',
|
|
48
48
|
})
|
|
49
49
|
)
|
|
50
50
|
|
|
51
51
|
const prettyText = await (await app.request(`?${targetQuery}`)).text()
|
|
52
52
|
expect(prettyText).toBe(`{
|
|
53
|
-
"message": "
|
|
53
|
+
"message": "Acryl!"
|
|
54
54
|
}`)
|
|
55
55
|
const nonPrettyText = await (await app.request('?pretty')).text()
|
|
56
|
-
expect(nonPrettyText).toBe('{"message":"
|
|
56
|
+
expect(nonPrettyText).toBe('{"message":"Acryl!"}')
|
|
57
57
|
})
|
|
58
58
|
|
|
59
59
|
it('Should force pretty JSON output when force option is true', async () => {
|
|
60
|
-
const app = new
|
|
60
|
+
const app = new Acryl()
|
|
61
61
|
app.use('*', prettyJSON({ force: true }))
|
|
62
62
|
app.get('/', (c) => {
|
|
63
|
-
return c.json({ message: '
|
|
63
|
+
return c.json({ message: 'Acryl!' })
|
|
64
64
|
})
|
|
65
65
|
|
|
66
66
|
const resWithoutQuery = await (await app.request('http://localhost/')).text()
|
|
67
67
|
expect(resWithoutQuery).toBe(`{
|
|
68
|
-
"message": "
|
|
68
|
+
"message": "Acryl!"
|
|
69
69
|
}`)
|
|
70
70
|
|
|
71
71
|
const resWithQuery = await (await app.request('http://localhost/?pretty')).text()
|
|
72
72
|
expect(resWithQuery).toBe(`{
|
|
73
|
-
"message": "
|
|
73
|
+
"message": "Acryl!"
|
|
74
74
|
}`)
|
|
75
75
|
})
|
|
76
76
|
|
|
77
77
|
it('Should return pretty JSON output for structured JSON content-types (+json)', async () => {
|
|
78
|
-
const app = new
|
|
78
|
+
const app = new Acryl()
|
|
79
79
|
app.use('*', prettyJSON({ force: true }))
|
|
80
80
|
app.get('/problem', (c) => {
|
|
81
81
|
return c.newResponse(JSON.stringify({ type: 'about:blank', title: 'Bad Request' }), 400, {
|
|
@@ -104,24 +104,24 @@ describe('JSON pretty by Middleware', () => {
|
|
|
104
104
|
})
|
|
105
105
|
|
|
106
106
|
it('Should not touch responses with non-JSON content-types', async () => {
|
|
107
|
-
const app = new
|
|
107
|
+
const app = new Acryl()
|
|
108
108
|
app.use('*', prettyJSON({ force: true }))
|
|
109
|
-
app.get('/text', (c) => c.text('{"message":"
|
|
109
|
+
app.get('/text', (c) => c.text('{"message":"Acryl!"}'))
|
|
110
110
|
app.get('/json-seq', (c) => {
|
|
111
|
-
return c.body('{"message":"
|
|
111
|
+
return c.body('{"message":"Acryl!"}', 200, {
|
|
112
112
|
'Content-Type': 'application/json-seq',
|
|
113
113
|
})
|
|
114
114
|
})
|
|
115
115
|
|
|
116
116
|
const textRes = await app.request('http://localhost/text')
|
|
117
|
-
expect(await textRes.text()).toBe('{"message":"
|
|
117
|
+
expect(await textRes.text()).toBe('{"message":"Acryl!"}')
|
|
118
118
|
|
|
119
119
|
const jsonSeqRes = await app.request('http://localhost/json-seq')
|
|
120
|
-
expect(await jsonSeqRes.text()).toBe('{"message":"
|
|
120
|
+
expect(await jsonSeqRes.text()).toBe('{"message":"Acryl!"}')
|
|
121
121
|
})
|
|
122
122
|
|
|
123
123
|
it('Should not break 204 responses with a JSON content-type', async () => {
|
|
124
|
-
const app = new
|
|
124
|
+
const app = new Acryl()
|
|
125
125
|
app.use('*', prettyJSON({ force: true }))
|
|
126
126
|
app.delete('/x', (c) => {
|
|
127
127
|
c.header('Content-Type', 'application/json')
|
|
@@ -134,7 +134,7 @@ describe('JSON pretty by Middleware', () => {
|
|
|
134
134
|
})
|
|
135
135
|
|
|
136
136
|
it('Should not break 304 responses with a JSON content-type', async () => {
|
|
137
|
-
const app = new
|
|
137
|
+
const app = new Acryl()
|
|
138
138
|
app.use('*', prettyJSON({ force: true }))
|
|
139
139
|
app.get('/x', (c) => {
|
|
140
140
|
c.header('Content-Type', 'application/json')
|
|
@@ -147,7 +147,7 @@ describe('JSON pretty by Middleware', () => {
|
|
|
147
147
|
})
|
|
148
148
|
|
|
149
149
|
it('Should not break empty responses with a JSON content-type', async () => {
|
|
150
|
-
const app = new
|
|
150
|
+
const app = new Acryl()
|
|
151
151
|
app.use('*', prettyJSON())
|
|
152
152
|
app.get('/x', () => new Response('', { headers: { 'Content-Type': 'application/json' } }))
|
|
153
153
|
|
|
@@ -157,7 +157,7 @@ describe('JSON pretty by Middleware', () => {
|
|
|
157
157
|
})
|
|
158
158
|
|
|
159
159
|
it('Should pass through a response with an invalid JSON body unchanged', async () => {
|
|
160
|
-
const app = new
|
|
160
|
+
const app = new Acryl()
|
|
161
161
|
app.use('*', prettyJSON({ force: true }))
|
|
162
162
|
app.get(
|
|
163
163
|
'/x',
|
|
@@ -182,13 +182,13 @@ describe('JSON pretty by Middleware', () => {
|
|
|
182
182
|
})
|
|
183
183
|
|
|
184
184
|
it('Should pass through a response whose body was already consumed by another middleware', async () => {
|
|
185
|
-
const app = new
|
|
185
|
+
const app = new Acryl()
|
|
186
186
|
app.use('*', prettyJSON({ force: true }))
|
|
187
187
|
app.use('*', async (c, next) => {
|
|
188
188
|
await next()
|
|
189
189
|
await c.res.text()
|
|
190
190
|
})
|
|
191
|
-
app.get('/x', (c) => c.json({ message: '
|
|
191
|
+
app.get('/x', (c) => c.json({ message: 'Acryl!' }))
|
|
192
192
|
|
|
193
193
|
// The other middleware has read the body, so the bytes are no longer available;
|
|
194
194
|
// pretty JSON must not turn this into a 500 and must leave the response as is.
|
|
@@ -199,19 +199,19 @@ describe('JSON pretty by Middleware', () => {
|
|
|
199
199
|
})
|
|
200
200
|
|
|
201
201
|
it('Should remove a stale Content-Length when the body is prettified', async () => {
|
|
202
|
-
const app = new
|
|
202
|
+
const app = new Acryl()
|
|
203
203
|
app.use('*', prettyJSON({ force: true }))
|
|
204
204
|
app.get(
|
|
205
205
|
'/x',
|
|
206
206
|
() =>
|
|
207
|
-
new Response('{"message":"
|
|
207
|
+
new Response('{"message":"Acryl!"}', {
|
|
208
208
|
headers: { 'Content-Type': 'application/json', 'Content-Length': '19' },
|
|
209
209
|
})
|
|
210
210
|
)
|
|
211
211
|
|
|
212
212
|
const res = await app.request('http://localhost/x')
|
|
213
213
|
expect(await res.text()).toBe(`{
|
|
214
|
-
"message": "
|
|
214
|
+
"message": "Acryl!"
|
|
215
215
|
}`)
|
|
216
216
|
expect(res.headers.get('Content-Length')).toBeNull()
|
|
217
217
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* Pretty JSON Middleware for
|
|
3
|
+
* Pretty JSON Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { MiddlewareHandler } from '../../types.ts'
|
|
@@ -28,7 +28,7 @@ interface PrettyOptions {
|
|
|
28
28
|
const jsonContentTypeRegex = /^application\/(?:[a-z0-9._-]+\+)?json(?=$|[;\s])/i
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
* Pretty JSON Middleware for
|
|
31
|
+
* Pretty JSON Middleware for Acryl.
|
|
32
32
|
*
|
|
33
33
|
*
|
|
34
34
|
* @param options - The options for the pretty JSON middleware.
|
|
@@ -36,11 +36,11 @@ const jsonContentTypeRegex = /^application\/(?:[a-z0-9._-]+\+)?json(?=$|[;\s])/i
|
|
|
36
36
|
*
|
|
37
37
|
* @example
|
|
38
38
|
* ```ts
|
|
39
|
-
* const app = new
|
|
39
|
+
* const app = new Acryl()
|
|
40
40
|
*
|
|
41
41
|
* app.use(prettyJSON()) // With options: prettyJSON({ space: 4 })
|
|
42
42
|
* app.get('/', (c) => {
|
|
43
|
-
* return c.json({ message: '
|
|
43
|
+
* return c.json({ message: 'Acryl!' })
|
|
44
44
|
* })
|
|
45
45
|
* ```
|
|
46
46
|
*/
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { requestId } from './index.ts'
|
|
2
2
|
import type { Context } from '../../context.ts'
|
|
3
|
-
import {
|
|
3
|
+
import { Acryl } from '../../app.ts'
|
|
4
4
|
|
|
5
5
|
const regexUUIDv4 = /([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/
|
|
6
6
|
|
|
7
7
|
describe('Request ID Middleware', () => {
|
|
8
|
-
const app = new
|
|
8
|
+
const app = new Acryl()
|
|
9
9
|
app.use('*', requestId())
|
|
10
10
|
app.get('/requestId', (c) => c.text(c.get('requestId') ?? 'No Request ID'))
|
|
11
11
|
|
|
@@ -57,17 +57,17 @@ describe('Request ID Middleware', () => {
|
|
|
57
57
|
|
|
58
58
|
describe('Request ID Middleware with custom generator', () => {
|
|
59
59
|
function generateWord() {
|
|
60
|
-
return '
|
|
60
|
+
return 'AcrylIsWebFramework'
|
|
61
61
|
}
|
|
62
62
|
function generateDoubleRequestId(c: Context) {
|
|
63
|
-
const
|
|
63
|
+
const acrylId = c.req.header('Acryl-Request-Id')
|
|
64
64
|
const ohnoId = c.req.header('Ohno-Request-Id')
|
|
65
|
-
if (
|
|
66
|
-
return
|
|
65
|
+
if (acrylId && ohnoId) {
|
|
66
|
+
return acrylId + ohnoId
|
|
67
67
|
}
|
|
68
68
|
return crypto.randomUUID()
|
|
69
69
|
}
|
|
70
|
-
const app = new
|
|
70
|
+
const app = new Acryl()
|
|
71
71
|
app.use('/word', requestId({ generator: generateWord }))
|
|
72
72
|
app.use('/doubleRequestId', requestId({ generator: generateDoubleRequestId }))
|
|
73
73
|
app.get('/word', (c) => c.text(c.get('requestId') ?? 'No Request ID'))
|
|
@@ -76,14 +76,14 @@ describe('Request ID Middleware with custom generator', () => {
|
|
|
76
76
|
const res = await app.request('http://localhost/word')
|
|
77
77
|
expect(res).not.toBeNull()
|
|
78
78
|
expect(res.status).toBe(200)
|
|
79
|
-
expect(res.headers.get('X-Request-Id')).toBe('
|
|
80
|
-
expect(await res.text()).toBe('
|
|
79
|
+
expect(res.headers.get('X-Request-Id')).toBe('AcrylIsWebFramework')
|
|
80
|
+
expect(await res.text()).toBe('AcrylIsWebFramework')
|
|
81
81
|
})
|
|
82
82
|
|
|
83
83
|
it('Should return complex request id', async () => {
|
|
84
84
|
const res = await app.request('http://localhost/doubleRequestId', {
|
|
85
85
|
headers: {
|
|
86
|
-
'
|
|
86
|
+
'Acryl-Request-Id': 'Hello',
|
|
87
87
|
'Ohno-Request-Id': 'World',
|
|
88
88
|
},
|
|
89
89
|
})
|
|
@@ -98,7 +98,7 @@ describe('Request ID Middleware with limit length', () => {
|
|
|
98
98
|
const charactersOf255 = 'h'.repeat(255)
|
|
99
99
|
const charactersOf256 = 'h'.repeat(256)
|
|
100
100
|
|
|
101
|
-
const app = new
|
|
101
|
+
const app = new Acryl()
|
|
102
102
|
app.use('/requestId', requestId())
|
|
103
103
|
app.use('/limit256', requestId({ limitLength: 256 }))
|
|
104
104
|
app.get('/requestId', (c) => c.text(c.get('requestId') ?? 'No Request ID'))
|
|
@@ -140,8 +140,8 @@ describe('Request ID Middleware with limit length', () => {
|
|
|
140
140
|
})
|
|
141
141
|
|
|
142
142
|
describe('Request ID Middleware with custom header', () => {
|
|
143
|
-
const app = new
|
|
144
|
-
app.use('/requestId', requestId({ headerName: '
|
|
143
|
+
const app = new Acryl()
|
|
144
|
+
app.use('/requestId', requestId({ headerName: 'Acryl-Request-Id' }))
|
|
145
145
|
app.get('/emptyId', requestId({ headerName: '' }))
|
|
146
146
|
app.get('/requestId', (c) => c.text(c.get('requestId') ?? 'No Request ID'))
|
|
147
147
|
app.get('/emptyId', (c) => c.text(c.get('requestId') ?? 'No Request ID'))
|
|
@@ -149,12 +149,12 @@ describe('Request ID Middleware with custom header', () => {
|
|
|
149
149
|
it('Should return custom request id', async () => {
|
|
150
150
|
const res = await app.request('http://localhost/requestId', {
|
|
151
151
|
headers: {
|
|
152
|
-
'
|
|
152
|
+
'Acryl-Request-Id': 'acryl-is-hot',
|
|
153
153
|
},
|
|
154
154
|
})
|
|
155
155
|
expect(res).not.toBeNull()
|
|
156
156
|
expect(res.status).toBe(200)
|
|
157
|
-
expect(res.headers.get('
|
|
157
|
+
expect(res.headers.get('Acryl-Request-Id')).toBe('acryl-is-hot')
|
|
158
158
|
expect(await res.text()).toBe('acryl-is-hot')
|
|
159
159
|
})
|
|
160
160
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* Request ID Middleware for
|
|
3
|
+
* Request ID Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Context } from '../../context.ts'
|
|
@@ -17,7 +17,7 @@ export type RequestIdOptions = {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* Request ID Middleware for
|
|
20
|
+
* Request ID Middleware for Acryl.
|
|
21
21
|
*
|
|
22
22
|
* @param {object} options - Options for Request ID middleware.
|
|
23
23
|
* @param {number} [options.limitLength=255] - The maximum length of request id.
|
|
@@ -29,7 +29,7 @@ export type RequestIdOptions = {
|
|
|
29
29
|
* @example
|
|
30
30
|
* ```ts
|
|
31
31
|
* type Variables = RequestIdVariables
|
|
32
|
-
* const app = new
|
|
32
|
+
* const app = new Acryl<{Variables: Variables}>()
|
|
33
33
|
*
|
|
34
34
|
* app.use(requestId())
|
|
35
35
|
* app.get('/', (c) => {
|