acrylblends 0.4.1 → 0.5.1
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/README.md +325 -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} +13 -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 +60 -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,9 +1,9 @@
|
|
|
1
1
|
import { appendTrailingSlash, trimTrailingSlash } from './index.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { Acryl } from '../../app.ts'
|
|
3
3
|
|
|
4
4
|
describe('Resolve trailing slash', () => {
|
|
5
5
|
describe('trimTrailingSlash middleware', () => {
|
|
6
|
-
const app = new
|
|
6
|
+
const app = new Acryl({ strict: true })
|
|
7
7
|
app.use('*', trimTrailingSlash())
|
|
8
8
|
|
|
9
9
|
app.get('/', async (c) => {
|
|
@@ -88,7 +88,7 @@ describe('Resolve trailing slash', () => {
|
|
|
88
88
|
})
|
|
89
89
|
|
|
90
90
|
describe('trimTrailingSlash middleware with alwaysRedirect option', () => {
|
|
91
|
-
const app = new
|
|
91
|
+
const app = new Acryl()
|
|
92
92
|
app.use('*', trimTrailingSlash({ alwaysRedirect: true }))
|
|
93
93
|
|
|
94
94
|
app.get('/', async (c) => {
|
|
@@ -155,7 +155,7 @@ describe('Resolve trailing slash', () => {
|
|
|
155
155
|
})
|
|
156
156
|
|
|
157
157
|
describe('appendTrailingSlash middleware', () => {
|
|
158
|
-
const app = new
|
|
158
|
+
const app = new Acryl({ strict: true })
|
|
159
159
|
app.use('*', appendTrailingSlash())
|
|
160
160
|
|
|
161
161
|
app.get('/', async (c) => {
|
|
@@ -257,7 +257,7 @@ describe('Resolve trailing slash', () => {
|
|
|
257
257
|
|
|
258
258
|
describe('appendTrailingSlash middleware with skip option', () => {
|
|
259
259
|
const hasExtension = (path: string): boolean => /\.\w+$/.test(path.split('/').at(-1) ?? '')
|
|
260
|
-
const app = new
|
|
260
|
+
const app = new Acryl({ strict: true })
|
|
261
261
|
app.use('*', appendTrailingSlash({ skip: hasExtension }))
|
|
262
262
|
|
|
263
263
|
app.get('/page/', (c) => c.text('ok'))
|
|
@@ -279,7 +279,7 @@ describe('Resolve trailing slash', () => {
|
|
|
279
279
|
|
|
280
280
|
describe('appendTrailingSlash middleware with alwaysRedirect and skip options', () => {
|
|
281
281
|
const hasExtension = (path: string): boolean => /\.\w+$/.test(path.split('/').at(-1) ?? '')
|
|
282
|
-
const app = new
|
|
282
|
+
const app = new Acryl()
|
|
283
283
|
app.use('*', appendTrailingSlash({ alwaysRedirect: true, skip: hasExtension }))
|
|
284
284
|
|
|
285
285
|
app.get('/', (c) => c.text('ok'))
|
|
@@ -313,7 +313,7 @@ describe('Resolve trailing slash', () => {
|
|
|
313
313
|
})
|
|
314
314
|
|
|
315
315
|
describe('appendTrailingSlash middleware with alwaysRedirect option', () => {
|
|
316
|
-
const app = new
|
|
316
|
+
const app = new Acryl()
|
|
317
317
|
app.use('*', appendTrailingSlash({ alwaysRedirect: true }))
|
|
318
318
|
|
|
319
319
|
app.get('/', async (c) => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* Trailing Slash Middleware for
|
|
3
|
+
* Trailing Slash Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { MiddlewareHandler } from '../../types.ts'
|
|
@@ -17,7 +17,7 @@ type TrimTrailingSlashOptions = {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* Trailing Slash Middleware for
|
|
20
|
+
* Trailing Slash Middleware for Acryl.
|
|
21
21
|
*
|
|
22
22
|
*
|
|
23
23
|
* @param {TrimTrailingSlashOptions} options - The options for the middleware.
|
|
@@ -25,7 +25,7 @@ type TrimTrailingSlashOptions = {
|
|
|
25
25
|
*
|
|
26
26
|
* @example
|
|
27
27
|
* ```ts
|
|
28
|
-
* const app = new
|
|
28
|
+
* const app = new Acryl()
|
|
29
29
|
*
|
|
30
30
|
* app.use(trimTrailingSlash())
|
|
31
31
|
* app.get('/about/me/', (c) => c.text('With Trailing Slash'))
|
|
@@ -34,7 +34,7 @@ type TrimTrailingSlashOptions = {
|
|
|
34
34
|
* @example
|
|
35
35
|
* ```ts
|
|
36
36
|
* // With alwaysRedirect option for wildcard routes
|
|
37
|
-
* const app = new
|
|
37
|
+
* const app = new Acryl()
|
|
38
38
|
*
|
|
39
39
|
* app.use(trimTrailingSlash({ alwaysRedirect: true }))
|
|
40
40
|
* app.get('/my-path/*', (c) => c.text('Wildcard route'))
|
|
@@ -100,7 +100,7 @@ type AppendTrailingSlashOptions = {
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
/**
|
|
103
|
-
* Append trailing slash middleware for
|
|
103
|
+
* Append trailing slash middleware for Acryl.
|
|
104
104
|
* Append a trailing slash to the URL if it doesn't have one. For example, `/path/to/page` will be redirected to `/path/to/page/`.
|
|
105
105
|
*
|
|
106
106
|
*
|
|
@@ -109,7 +109,7 @@ type AppendTrailingSlashOptions = {
|
|
|
109
109
|
*
|
|
110
110
|
* @example
|
|
111
111
|
* ```ts
|
|
112
|
-
* const app = new
|
|
112
|
+
* const app = new Acryl()
|
|
113
113
|
*
|
|
114
114
|
* app.use(appendTrailingSlash())
|
|
115
115
|
* ```
|
|
@@ -117,7 +117,7 @@ type AppendTrailingSlashOptions = {
|
|
|
117
117
|
* @example
|
|
118
118
|
* ```ts
|
|
119
119
|
* // With alwaysRedirect option for wildcard routes
|
|
120
|
-
* const app = new
|
|
120
|
+
* const app = new Acryl()
|
|
121
121
|
*
|
|
122
122
|
* app.use(appendTrailingSlash({ alwaysRedirect: true }))
|
|
123
123
|
* app.get('/my-path/*', (c) => c.text('Wildcard route'))
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HTTPException } from './http-exception.ts'
|
|
2
|
-
import { cloneRawRequest,
|
|
2
|
+
import { cloneRawRequest, AcrylRequest } from './request.ts'
|
|
3
3
|
import type { RouterRoute } from './types.ts'
|
|
4
4
|
|
|
5
5
|
type RecursiveRecord<K extends string, T> = {
|
|
@@ -9,7 +9,7 @@ type RecursiveRecord<K extends string, T> = {
|
|
|
9
9
|
describe('Query', () => {
|
|
10
10
|
test('req.query() and req.queries()', () => {
|
|
11
11
|
const rawRequest = new Request('http://localhost?page=2&tag=A&tag=B')
|
|
12
|
-
const req = new
|
|
12
|
+
const req = new AcrylRequest(rawRequest)
|
|
13
13
|
|
|
14
14
|
const page = req.query('page')
|
|
15
15
|
expect(page).not.toBeUndefined()
|
|
@@ -28,7 +28,7 @@ describe('Query', () => {
|
|
|
28
28
|
|
|
29
29
|
test('decode special chars', () => {
|
|
30
30
|
const rawRequest = new Request('http://localhost?mail=framework%40acryl.dev&tag=%401&tag=%402')
|
|
31
|
-
const req = new
|
|
31
|
+
const req = new AcrylRequest(rawRequest)
|
|
32
32
|
|
|
33
33
|
const mail = req.query('mail')
|
|
34
34
|
expect(mail).toBe('framework@acryl.dev')
|
|
@@ -40,7 +40,7 @@ describe('Query', () => {
|
|
|
40
40
|
|
|
41
41
|
describe('Param', () => {
|
|
42
42
|
test('req.param() on an unmatched request', () => {
|
|
43
|
-
const req = new
|
|
43
|
+
const req = new AcrylRequest(new Request('http://localhost/'))
|
|
44
44
|
|
|
45
45
|
expect(req.param('id')).toBeUndefined()
|
|
46
46
|
expect(req.param()).toEqual({})
|
|
@@ -49,7 +49,7 @@ describe('Param', () => {
|
|
|
49
49
|
test('req.param() should return empty string for zero-length match', () => {
|
|
50
50
|
// Simulate a route like '/:remaining{.*}' matching '/'
|
|
51
51
|
const rawRequest = new Request('http://localhost/')
|
|
52
|
-
const req = new
|
|
52
|
+
const req = new AcrylRequest<'/:remaining{.*}'>(rawRequest, '/', [
|
|
53
53
|
[[[undefined, {} as RouterRoute], { remaining: 0 }]],
|
|
54
54
|
[''], // ParamStash with empty string for remaining
|
|
55
55
|
])
|
|
@@ -63,7 +63,7 @@ describe('Param', () => {
|
|
|
63
63
|
})
|
|
64
64
|
test('req.param() with ParamStash', () => {
|
|
65
65
|
const rawRequest = new Request('http://localhost?page=2&tag=A&tag=B')
|
|
66
|
-
const req = new
|
|
66
|
+
const req = new AcrylRequest<'/:id/:name'>(rawRequest, '/123/key', [
|
|
67
67
|
[
|
|
68
68
|
[[undefined, {} as RouterRoute], { id: 0 }],
|
|
69
69
|
[[undefined, {} as RouterRoute], { id: 0, name: 1 }],
|
|
@@ -81,7 +81,7 @@ describe('Param', () => {
|
|
|
81
81
|
|
|
82
82
|
test('req.param() without ParamStash', () => {
|
|
83
83
|
const rawRequest = new Request('http://localhost?page=2&tag=A&tag=B')
|
|
84
|
-
const req = new
|
|
84
|
+
const req = new AcrylRequest<'/:id/:name'>(rawRequest, '/123/key', [
|
|
85
85
|
[
|
|
86
86
|
[[undefined, {} as RouterRoute], { id: '123' }],
|
|
87
87
|
[[undefined, {} as RouterRoute], { id: '456', name: 'key' }],
|
|
@@ -98,7 +98,7 @@ describe('Param', () => {
|
|
|
98
98
|
|
|
99
99
|
test('req.param() returns empty string for missing param', () => {
|
|
100
100
|
const rawRequest = new Request('http://localhost')
|
|
101
|
-
const req = new
|
|
101
|
+
const req = new AcrylRequest<'/:remaining'>(rawRequest, '/', [
|
|
102
102
|
[[[undefined, {} as RouterRoute], { remaining: 0 }]],
|
|
103
103
|
[''],
|
|
104
104
|
])
|
|
@@ -107,7 +107,7 @@ describe('Param', () => {
|
|
|
107
107
|
|
|
108
108
|
test('req.param() without argument returns object with empty string for missing param', () => {
|
|
109
109
|
const rawRequest = new Request('http://localhost')
|
|
110
|
-
const req = new
|
|
110
|
+
const req = new AcrylRequest<'/:remaining'>(rawRequest, '/', [
|
|
111
111
|
[[[undefined, {} as RouterRoute], { remaining: 0 }]],
|
|
112
112
|
[''],
|
|
113
113
|
])
|
|
@@ -119,7 +119,7 @@ describe('Param', () => {
|
|
|
119
119
|
// When middleware uses Context without an explicit path type, P defaults to any.
|
|
120
120
|
// param(key) should return string | undefined, not string.
|
|
121
121
|
const rawRequest = new Request('http://localhost/users/123')
|
|
122
|
-
const req = new
|
|
122
|
+
const req = new AcrylRequest<any>(rawRequest, '/users/123', [
|
|
123
123
|
[[[undefined, {} as RouterRoute], { id: '123' }]],
|
|
124
124
|
])
|
|
125
125
|
expectTypeOf(req.param('id')).toEqualTypeOf<string | undefined>()
|
|
@@ -128,7 +128,7 @@ describe('Param', () => {
|
|
|
128
128
|
it('param() returns string when P is a known route string', () => {
|
|
129
129
|
// When P is a concrete route, named params should still return string (non-optional).
|
|
130
130
|
const rawRequest = new Request('http://localhost/123')
|
|
131
|
-
const req = new
|
|
131
|
+
const req = new AcrylRequest<'/:id'>(rawRequest, '/123', [
|
|
132
132
|
[[[undefined, {} as RouterRoute], { id: '123' }]],
|
|
133
133
|
])
|
|
134
134
|
expectTypeOf(req.param('id')).toEqualTypeOf<string>()
|
|
@@ -141,7 +141,7 @@ describe('matchedRoutes', () => {
|
|
|
141
141
|
const handlerA = () => {}
|
|
142
142
|
const handlerB = () => {}
|
|
143
143
|
const rawRequest = new Request('http://localhost?page=2&tag=A&tag=B')
|
|
144
|
-
const req = new
|
|
144
|
+
const req = new AcrylRequest<'/:id/:name'>(rawRequest, '/123/key', [
|
|
145
145
|
[
|
|
146
146
|
[
|
|
147
147
|
[handlerA, { basePath: '/', handler: handlerA, method: 'GET', path: '/:id' }],
|
|
@@ -166,7 +166,7 @@ describe('routePath', () => {
|
|
|
166
166
|
const handlerA = () => {}
|
|
167
167
|
const handlerB = () => {}
|
|
168
168
|
const rawRequest = new Request('http://localhost?page=2&tag=A&tag=B')
|
|
169
|
-
const req = new
|
|
169
|
+
const req = new AcrylRequest<'/:id/:name'>(rawRequest, '/123/key', [
|
|
170
170
|
[
|
|
171
171
|
[
|
|
172
172
|
[handlerA, { basePath: '/', handler: handlerA, method: 'GET', path: '/:id' }],
|
|
@@ -198,14 +198,14 @@ describe('req.addValidatedData() and req.data()', () => {
|
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
test('add data - json', () => {
|
|
201
|
-
const req = new
|
|
201
|
+
const req = new AcrylRequest<'/', { json: typeof payload }>(rawRequest)
|
|
202
202
|
req.addValidatedData('json', payload)
|
|
203
203
|
const data = req.valid('json')
|
|
204
204
|
expect(data).toEqual(payload)
|
|
205
205
|
})
|
|
206
206
|
|
|
207
207
|
test('replace data - json', () => {
|
|
208
|
-
const req = new
|
|
208
|
+
const req = new AcrylRequest<'/', { json: typeof payload }>(rawRequest)
|
|
209
209
|
req.addValidatedData('json', payload)
|
|
210
210
|
req.addValidatedData('json', {
|
|
211
211
|
tag: ['sport', 'music'],
|
|
@@ -225,13 +225,13 @@ describe('req.addValidatedData() and req.data()', () => {
|
|
|
225
225
|
|
|
226
226
|
describe('headers', () => {
|
|
227
227
|
test('empty string is a valid header value', () => {
|
|
228
|
-
const req = new
|
|
228
|
+
const req = new AcrylRequest(new Request('http://localhost', { headers: { foo: '' } }))
|
|
229
229
|
const foo = req.header('foo')
|
|
230
230
|
expect(foo).toEqual('')
|
|
231
231
|
})
|
|
232
232
|
|
|
233
233
|
test('Keys of the arguments for req.header() are not case-sensitive', () => {
|
|
234
|
-
const req = new
|
|
234
|
+
const req = new AcrylRequest(
|
|
235
235
|
new Request('http://localhost', {
|
|
236
236
|
headers: {
|
|
237
237
|
'Content-Type': 'application/json',
|
|
@@ -245,7 +245,7 @@ describe('headers', () => {
|
|
|
245
245
|
})
|
|
246
246
|
|
|
247
247
|
test('req.header() is not affected by a `__proto__` header name', () => {
|
|
248
|
-
const req = new
|
|
248
|
+
const req = new AcrylRequest(new Request('http://localhost', { headers: { __proto__: 'evil' } }))
|
|
249
249
|
const headers = req.header()
|
|
250
250
|
expect(Object.getPrototypeOf(headers)).toBeNull()
|
|
251
251
|
})
|
|
@@ -257,7 +257,7 @@ const buffer = new TextEncoder().encode('{"foo":"bar"}').buffer
|
|
|
257
257
|
|
|
258
258
|
describe('Body methods with caching', () => {
|
|
259
259
|
test('req.text()', async () => {
|
|
260
|
-
const req = new
|
|
260
|
+
const req = new AcrylRequest(
|
|
261
261
|
new Request('http://localhost', {
|
|
262
262
|
method: 'POST',
|
|
263
263
|
body: text,
|
|
@@ -275,7 +275,7 @@ describe('Body methods with caching', () => {
|
|
|
275
275
|
})
|
|
276
276
|
|
|
277
277
|
test('req.json()', async () => {
|
|
278
|
-
const req = new
|
|
278
|
+
const req = new AcrylRequest(
|
|
279
279
|
new Request('http://localhost', {
|
|
280
280
|
method: 'POST',
|
|
281
281
|
body: '{"foo":"bar"}',
|
|
@@ -294,7 +294,7 @@ describe('Body methods with caching', () => {
|
|
|
294
294
|
|
|
295
295
|
test('req.json() should keep the content as is', async () => {
|
|
296
296
|
const text = '{ "foo" : "bar" }'
|
|
297
|
-
const req = new
|
|
297
|
+
const req = new AcrylRequest(
|
|
298
298
|
new Request('http://localhost', {
|
|
299
299
|
method: 'POST',
|
|
300
300
|
body: text,
|
|
@@ -306,7 +306,7 @@ describe('Body methods with caching', () => {
|
|
|
306
306
|
|
|
307
307
|
test('req.arrayBuffer()', async () => {
|
|
308
308
|
const buffer = new TextEncoder().encode('{"foo":"bar"}').buffer
|
|
309
|
-
const req = new
|
|
309
|
+
const req = new AcrylRequest(
|
|
310
310
|
new Request('http://localhost', {
|
|
311
311
|
method: 'POST',
|
|
312
312
|
body: buffer,
|
|
@@ -325,7 +325,7 @@ describe('Body methods with caching', () => {
|
|
|
325
325
|
|
|
326
326
|
test('req.bytes()', async () => {
|
|
327
327
|
const bytes = new TextEncoder().encode('{"foo":"bar"}')
|
|
328
|
-
const req = new
|
|
328
|
+
const req = new AcrylRequest(
|
|
329
329
|
new Request('http://localhost', {
|
|
330
330
|
method: 'POST',
|
|
331
331
|
body: bytes,
|
|
@@ -348,7 +348,7 @@ describe('Body methods with caching', () => {
|
|
|
348
348
|
const blob = new Blob(['{"foo":"bar"}'], {
|
|
349
349
|
type: 'application/json',
|
|
350
350
|
})
|
|
351
|
-
const req = new
|
|
351
|
+
const req = new AcrylRequest(
|
|
352
352
|
new Request('http://localhost', {
|
|
353
353
|
method: 'POST',
|
|
354
354
|
body: blob,
|
|
@@ -364,7 +364,7 @@ describe('Body methods with caching', () => {
|
|
|
364
364
|
test('req.formData()', async () => {
|
|
365
365
|
const data = new FormData()
|
|
366
366
|
data.append('foo', 'bar')
|
|
367
|
-
const req = new
|
|
367
|
+
const req = new AcrylRequest(
|
|
368
368
|
new Request('http://localhost', {
|
|
369
369
|
method: 'POST',
|
|
370
370
|
body: data,
|
|
@@ -383,7 +383,7 @@ describe('Body methods with caching', () => {
|
|
|
383
383
|
|
|
384
384
|
for (const first of ['text', 'arrayBuffer', 'bytes', 'blob'] as const) {
|
|
385
385
|
test(`req.formData() after req.${first}()`, async () => {
|
|
386
|
-
const req = new
|
|
386
|
+
const req = new AcrylRequest(
|
|
387
387
|
new Request('http://localhost', {
|
|
388
388
|
method: 'POST',
|
|
389
389
|
headers: { 'Content-Type': urlencoded },
|
|
@@ -404,7 +404,7 @@ describe('Body methods with caching', () => {
|
|
|
404
404
|
'Content-Disposition: form-data; name="foo"\r\n\r\n' +
|
|
405
405
|
'bar\r\n' +
|
|
406
406
|
`--${boundary}--\r\n`
|
|
407
|
-
const req = new
|
|
407
|
+
const req = new AcrylRequest(
|
|
408
408
|
new Request('http://localhost', {
|
|
409
409
|
method: 'POST',
|
|
410
410
|
headers: { 'Content-Type': `multipart/form-data; boundary=${boundary}` },
|
|
@@ -416,7 +416,7 @@ describe('Body methods with caching', () => {
|
|
|
416
416
|
})
|
|
417
417
|
|
|
418
418
|
test('the cached representation is still returned unchanged', async () => {
|
|
419
|
-
const req = new
|
|
419
|
+
const req = new AcrylRequest(
|
|
420
420
|
new Request('http://localhost', {
|
|
421
421
|
method: 'POST',
|
|
422
422
|
headers: { 'Content-Type': urlencoded },
|
|
@@ -433,7 +433,7 @@ describe('Body methods with caching', () => {
|
|
|
433
433
|
it('should parse form data', async () => {
|
|
434
434
|
const data = new FormData()
|
|
435
435
|
data.append('foo', 'bar')
|
|
436
|
-
const req = new
|
|
436
|
+
const req = new AcrylRequest(
|
|
437
437
|
new Request('http://localhost', {
|
|
438
438
|
method: 'POST',
|
|
439
439
|
body: data,
|
|
@@ -450,7 +450,7 @@ describe('Body methods with caching', () => {
|
|
|
450
450
|
const data = new FormData()
|
|
451
451
|
data.append('foo', 'bar')
|
|
452
452
|
data.append('file', new File(['hello'], 't.txt', { type: 'text/plain' }))
|
|
453
|
-
const req = new
|
|
453
|
+
const req = new AcrylRequest(
|
|
454
454
|
new Request('http://localhost', {
|
|
455
455
|
method: 'POST',
|
|
456
456
|
body: data,
|
|
@@ -464,7 +464,7 @@ describe('Body methods with caching', () => {
|
|
|
464
464
|
|
|
465
465
|
describe('should not break body methods after parseBody() with non-form content-type', () => {
|
|
466
466
|
const createReq = () =>
|
|
467
|
-
new
|
|
467
|
+
new AcrylRequest(
|
|
468
468
|
new Request('http://localhost', {
|
|
469
469
|
method: 'POST',
|
|
470
470
|
body: JSON.stringify({ event: 'push' }),
|
|
@@ -511,11 +511,11 @@ describe('Body methods with caching', () => {
|
|
|
511
511
|
})
|
|
512
512
|
|
|
513
513
|
describe('Return type', () => {
|
|
514
|
-
let req:
|
|
514
|
+
let req: AcrylRequest
|
|
515
515
|
beforeEach(() => {
|
|
516
516
|
const data = new FormData()
|
|
517
517
|
data.append('foo', 'bar')
|
|
518
|
-
req = new
|
|
518
|
+
req = new AcrylRequest(
|
|
519
519
|
new Request('http://localhost', {
|
|
520
520
|
method: 'POST',
|
|
521
521
|
body: data,
|
|
@@ -559,7 +559,7 @@ describe('Body methods with caching', () => {
|
|
|
559
559
|
|
|
560
560
|
describe('cloneRawRequest', () => {
|
|
561
561
|
test('clones unconsumed request object', async () => {
|
|
562
|
-
const req = new
|
|
562
|
+
const req = new AcrylRequest(
|
|
563
563
|
new Request('http://localhost', {
|
|
564
564
|
method: 'POST',
|
|
565
565
|
headers: {
|
|
@@ -596,7 +596,7 @@ describe('cloneRawRequest', () => {
|
|
|
596
596
|
})
|
|
597
597
|
|
|
598
598
|
test('clones consumed request object', async () => {
|
|
599
|
-
const req = new
|
|
599
|
+
const req = new AcrylRequest(
|
|
600
600
|
new Request('http://localhost', {
|
|
601
601
|
method: 'POST',
|
|
602
602
|
headers: {
|
|
@@ -625,7 +625,7 @@ describe('cloneRawRequest', () => {
|
|
|
625
625
|
const data = new FormData()
|
|
626
626
|
data.append('foo', 'bar')
|
|
627
627
|
data.append('file', new File(['hello'], 't.txt', { type: 'text/plain' }))
|
|
628
|
-
const req = new
|
|
628
|
+
const req = new AcrylRequest(
|
|
629
629
|
new Request('http://localhost', {
|
|
630
630
|
method: 'POST',
|
|
631
631
|
body: data,
|
|
@@ -655,7 +655,7 @@ describe('cloneRawRequest', () => {
|
|
|
655
655
|
`--${boundary}--`,
|
|
656
656
|
'',
|
|
657
657
|
].join('\r\n')
|
|
658
|
-
const req = new
|
|
658
|
+
const req = new AcrylRequest(
|
|
659
659
|
new Request('http://localhost', {
|
|
660
660
|
method: 'POST',
|
|
661
661
|
headers: {
|
|
@@ -674,7 +674,7 @@ describe('cloneRawRequest', () => {
|
|
|
674
674
|
})
|
|
675
675
|
|
|
676
676
|
test('clones request when external code populated bodyCache.json', async () => {
|
|
677
|
-
const req = new
|
|
677
|
+
const req = new AcrylRequest(
|
|
678
678
|
new Request('http://localhost', {
|
|
679
679
|
method: 'POST',
|
|
680
680
|
headers: {
|
|
@@ -692,7 +692,7 @@ describe('cloneRawRequest', () => {
|
|
|
692
692
|
})
|
|
693
693
|
|
|
694
694
|
test('clones GET request without body', async () => {
|
|
695
|
-
const req = new
|
|
695
|
+
const req = new AcrylRequest(
|
|
696
696
|
new Request('http://localhost', {
|
|
697
697
|
method: 'GET',
|
|
698
698
|
headers: {
|
|
@@ -716,8 +716,8 @@ describe('cloneRawRequest', () => {
|
|
|
716
716
|
expect(req.raw, 'cloned request should contain the same properties').toMatchObject(clonedReq)
|
|
717
717
|
})
|
|
718
718
|
|
|
719
|
-
test('clones request when raw body was consumed directly without
|
|
720
|
-
const req = new
|
|
719
|
+
test('clones request when raw body was consumed directly without AcrylRequest methods', async () => {
|
|
720
|
+
const req = new AcrylRequest(
|
|
721
721
|
new Request('http://localhost', {
|
|
722
722
|
method: 'POST',
|
|
723
723
|
headers: {
|
|
@@ -727,7 +727,7 @@ describe('cloneRawRequest', () => {
|
|
|
727
727
|
})
|
|
728
728
|
)
|
|
729
729
|
|
|
730
|
-
// Consume the raw request body directly, bypassing
|
|
730
|
+
// Consume the raw request body directly, bypassing AcrylRequest methods
|
|
731
731
|
// This means bodyCache will be empty
|
|
732
732
|
await req.raw.text()
|
|
733
733
|
|
|
@@ -31,7 +31,7 @@ type RequiredRequestInit = Required<Omit<RequestInit, OptionalRequestInitPropert
|
|
|
31
31
|
[Key in OptionalRequestInitProperties]?: RequestInit[Key]
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export class
|
|
34
|
+
export class AcrylRequest<P extends string = '/', I extends Input['out'] = {}> {
|
|
35
35
|
/**
|
|
36
36
|
* `.raw` can get the raw Request object.
|
|
37
37
|
*
|
|
@@ -430,7 +430,7 @@ export class AppRequest<P extends string = '/', I extends Input['out'] = {}> {
|
|
|
430
430
|
}
|
|
431
431
|
|
|
432
432
|
/**
|
|
433
|
-
* Clones a
|
|
433
|
+
* Clones a AcrylRequest's underlying raw Request object.
|
|
434
434
|
*
|
|
435
435
|
* This utility handles both consumed and unconsumed request bodies:
|
|
436
436
|
* - If the request body hasn't been consumed, it uses the native `clone()` method
|
|
@@ -440,10 +440,10 @@ export class AppRequest<P extends string = '/', I extends Input['out'] = {}> {
|
|
|
440
440
|
* - Process the same request body multiple times
|
|
441
441
|
* - Pass requests to external services after validation
|
|
442
442
|
*
|
|
443
|
-
* @param req - The
|
|
443
|
+
* @param req - The AcrylRequest object to clone
|
|
444
444
|
* @returns A Promise that resolves to a new Request object with the same properties
|
|
445
445
|
* @throws {HTTPException} If the request body was consumed directly via `req.raw`
|
|
446
|
-
* without using
|
|
446
|
+
* without using AcrylRequest methods (e.g., `req.json()`, `req.text()`), making it
|
|
447
447
|
* impossible to reconstruct the body from cache
|
|
448
448
|
*
|
|
449
449
|
* @example
|
|
@@ -460,7 +460,7 @@ export class AppRequest<P extends string = '/', I extends Input['out'] = {}> {
|
|
|
460
460
|
* )
|
|
461
461
|
* ```
|
|
462
462
|
*/
|
|
463
|
-
export const cloneRawRequest = async (req:
|
|
463
|
+
export const cloneRawRequest = async (req: AcrylRequest): Promise<Request> => {
|
|
464
464
|
if (!req.raw.bodyUsed) {
|
|
465
465
|
return req.raw.clone()
|
|
466
466
|
}
|
|
@@ -469,7 +469,7 @@ export const cloneRawRequest = async (req: AppRequest): Promise<Request> => {
|
|
|
469
469
|
if (!cacheKey) {
|
|
470
470
|
throw new HTTPException(500, {
|
|
471
471
|
message:
|
|
472
|
-
'Cannot clone request: body was already consumed and not cached. Please use
|
|
472
|
+
'Cannot clone request: body was already consumed and not cached. Please use AcrylRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.',
|
|
473
473
|
})
|
|
474
474
|
}
|
|
475
475
|
|