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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Acryl } from '../../../acryl-router/src/index.ts'
|
|
2
2
|
import type * as fs from 'node:fs'
|
|
3
3
|
import {
|
|
4
4
|
chmodSync,
|
|
@@ -26,7 +26,7 @@ vi.mock('node:fs', async (importOriginal) => {
|
|
|
26
26
|
})
|
|
27
27
|
|
|
28
28
|
describe('Serve Static Middleware', () => {
|
|
29
|
-
const app = new
|
|
29
|
+
const app = new Acryl<{
|
|
30
30
|
Variables: {
|
|
31
31
|
path: string
|
|
32
32
|
}
|
|
@@ -99,7 +99,7 @@ describe('Serve Static Middleware', () => {
|
|
|
99
99
|
const rewriteRequestPath = vi.fn((path: string) => path)
|
|
100
100
|
const onFound = vi.fn()
|
|
101
101
|
const onNotFound = vi.fn()
|
|
102
|
-
const app = new
|
|
102
|
+
const app = new Acryl().use(
|
|
103
103
|
'/static/*',
|
|
104
104
|
serveStatic({ root: './tests/adapter/assets', rewriteRequestPath, onFound, onNotFound })
|
|
105
105
|
)
|
|
@@ -136,7 +136,7 @@ describe('Serve Static Middleware', () => {
|
|
|
136
136
|
it('Should return index.html', async () => {
|
|
137
137
|
const res = await requestServer(server, { method: 'GET', path: '/static/' })
|
|
138
138
|
expect(res.status).toBe(200)
|
|
139
|
-
expect(await res.text()).toBe('<h1>Hello
|
|
139
|
+
expect(await res.text()).toBe('<h1>Hello Acryl</h1>')
|
|
140
140
|
expect(res.headers.get('content-type')).toBe('text/html; charset=utf-8')
|
|
141
141
|
expect(res.headers.get('x-custom')).toMatch(
|
|
142
142
|
/Found the file at tests[\/\\]adapter[\/\\]assets[\/\\]static[\/\\]index\.html$/
|
|
@@ -146,7 +146,7 @@ describe('Serve Static Middleware', () => {
|
|
|
146
146
|
it('Should return acryl.html', async () => {
|
|
147
147
|
const res = await requestServer(server, { method: 'GET', path: '/static/acryl.html' })
|
|
148
148
|
expect(res.status).toBe(200)
|
|
149
|
-
expect(await res.text()).toBe('<h1>This is
|
|
149
|
+
expect(await res.text()).toBe('<h1>This is Acryl.html</h1>')
|
|
150
150
|
expect(res.headers.get('content-type')).toBe('text/html; charset=utf-8')
|
|
151
151
|
})
|
|
152
152
|
|
|
@@ -421,7 +421,7 @@ describe('Serve Static Middleware', () => {
|
|
|
421
421
|
|
|
422
422
|
const res = await requestServer(server, { method: 'GET', path: '/static/symlink.html' })
|
|
423
423
|
expect(res.status).toBe(200)
|
|
424
|
-
expect(await res.text()).toBe('<h1>Hello
|
|
424
|
+
expect(await res.text()).toBe('<h1>Hello Acryl</h1>')
|
|
425
425
|
} finally {
|
|
426
426
|
rmSync(symlinkPath, { force: true })
|
|
427
427
|
}
|
|
@@ -514,7 +514,7 @@ describe('Serve Static Middleware', () => {
|
|
|
514
514
|
]
|
|
515
515
|
rootPaths.forEach((root) => {
|
|
516
516
|
describe(root, () => {
|
|
517
|
-
const app = new
|
|
517
|
+
const app = new Acryl()
|
|
518
518
|
const server = createAdaptorServer(app)
|
|
519
519
|
app.use('/static/*', serveStatic({ root }))
|
|
520
520
|
app.use('/favicon.ico', serveStatic({ path: root + path.sep + 'favicon.ico' }))
|
|
@@ -523,7 +523,7 @@ describe('Serve Static Middleware', () => {
|
|
|
523
523
|
const res = await requestServer(server, { method: 'GET', path: '/static' })
|
|
524
524
|
expect(res.status).toBe(200)
|
|
525
525
|
expect(res.headers.get('content-type')).toBe('text/html; charset=utf-8')
|
|
526
|
-
expect(await res.text()).toBe('<h1>Hello
|
|
526
|
+
expect(await res.text()).toBe('<h1>Hello Acryl</h1>')
|
|
527
527
|
})
|
|
528
528
|
|
|
529
529
|
it('Should return correct headers and data for text', async () => {
|
|
@@ -551,7 +551,7 @@ describe('Serve Static Middleware', () => {
|
|
|
551
551
|
rootPaths.forEach((root) => {
|
|
552
552
|
optionPaths.forEach((optionPath) => {
|
|
553
553
|
describe(`${root} + ${optionPath}`, () => {
|
|
554
|
-
const app = new
|
|
554
|
+
const app = new Acryl()
|
|
555
555
|
const server = createAdaptorServer(app)
|
|
556
556
|
|
|
557
557
|
app.use(
|
|
@@ -573,7 +573,7 @@ describe('Serve Static Middleware', () => {
|
|
|
573
573
|
})
|
|
574
574
|
|
|
575
575
|
describe('Path traversal security tests', () => {
|
|
576
|
-
const app = new
|
|
576
|
+
const app = new Acryl()
|
|
577
577
|
const server = createAdaptorServer(app)
|
|
578
578
|
app.use('/static/*', serveStatic({ root: './tests/adapter/assets' }))
|
|
579
579
|
|
|
@@ -613,7 +613,7 @@ describe('Serve Static Middleware', () => {
|
|
|
613
613
|
})
|
|
614
614
|
|
|
615
615
|
describe('Path mismatch security tests', () => {
|
|
616
|
-
const app = new
|
|
616
|
+
const app = new Acryl()
|
|
617
617
|
const server = createAdaptorServer(app)
|
|
618
618
|
|
|
619
619
|
app.use('/static/admin/*', async (c, next) => {
|
|
@@ -673,7 +673,7 @@ describe('Serve Static Middleware', () => {
|
|
|
673
673
|
['/static/%E7%82%8E.txt', 'static/炎.txt'],
|
|
674
674
|
['/static/hello%20world.txt', 'static/hello world.txt'],
|
|
675
675
|
])('Should decode URI strings - %s', async (url, filePath) => {
|
|
676
|
-
const fileApp = new
|
|
676
|
+
const fileApp = new Acryl().use('/static/*', serveStatic({ root }))
|
|
677
677
|
const res = await requestServer(createAdaptorServer(fileApp), {
|
|
678
678
|
method: 'GET',
|
|
679
679
|
path: url,
|
|
@@ -688,7 +688,7 @@ describe('Serve Static Middleware', () => {
|
|
|
688
688
|
async (url) => {
|
|
689
689
|
const onNotFound = vi.fn()
|
|
690
690
|
const rewriteRequestPath = vi.fn((filePath: string) => filePath)
|
|
691
|
-
const fileApp = new
|
|
691
|
+
const fileApp = new Acryl().use(
|
|
692
692
|
'/static/*',
|
|
693
693
|
serveStatic({ root, onNotFound, rewriteRequestPath })
|
|
694
694
|
)
|
|
@@ -706,7 +706,7 @@ describe('Serve Static Middleware', () => {
|
|
|
706
706
|
['/static/100%25/hello.txt', 'static/100%/hello.txt'],
|
|
707
707
|
['/static/%2Fadmin/secret.txt', 'static/%2Fadmin/secret.txt'],
|
|
708
708
|
])('Should allow percent signs when opted in - %s', async (url, filePath) => {
|
|
709
|
-
const fileApp = new
|
|
709
|
+
const fileApp = new Acryl().use('/static/*', serveStatic({ root, allowPercentInPath: true }))
|
|
710
710
|
|
|
711
711
|
const res = await requestServer(createAdaptorServer(fileApp), { method: 'GET', path: url })
|
|
712
712
|
|
|
@@ -715,7 +715,7 @@ describe('Serve Static Middleware', () => {
|
|
|
715
715
|
})
|
|
716
716
|
|
|
717
717
|
it('Should not bypass authentication through a second decode', async () => {
|
|
718
|
-
const protectedApp = new
|
|
718
|
+
const protectedApp = new Acryl()
|
|
719
719
|
const rewriteRequestPath = vi.fn((filePath: string) => filePath)
|
|
720
720
|
protectedApp.use('/static/admin/*', async (c) => c.text('Unauthorized', 401))
|
|
721
721
|
protectedApp.use('/static/*', serveStatic({ root: './tests/adapter/assets', rewriteRequestPath }))
|
|
@@ -737,7 +737,7 @@ describe('Serve Static Middleware', () => {
|
|
|
737
737
|
})
|
|
738
738
|
|
|
739
739
|
it('Should pass the routed path and context to onNotFound, then continue', async () => {
|
|
740
|
-
const fileApp = new
|
|
740
|
+
const fileApp = new Acryl()
|
|
741
741
|
let hookPath: string | undefined
|
|
742
742
|
let contextPath: string | undefined
|
|
743
743
|
fileApp.use(
|
|
@@ -765,7 +765,7 @@ describe('Serve Static Middleware', () => {
|
|
|
765
765
|
it.each(['/static/%2e%2e%5C100%.txt', '/static//100%.txt', '/static/%5C100%.txt'])(
|
|
766
766
|
'Should retain path validation when opted in: %s',
|
|
767
767
|
async (requestPath) => {
|
|
768
|
-
const fileApp = new
|
|
768
|
+
const fileApp = new Acryl()
|
|
769
769
|
const rewriteRequestPath = vi.fn((requestPath: string) => requestPath)
|
|
770
770
|
const onNotFound = vi.fn()
|
|
771
771
|
fileApp.use(
|
|
@@ -783,7 +783,7 @@ describe('Serve Static Middleware', () => {
|
|
|
783
783
|
)
|
|
784
784
|
|
|
785
785
|
it('Should preserve the fixed path option for percent filenames', async () => {
|
|
786
|
-
const fileApp = new
|
|
786
|
+
const fileApp = new Acryl()
|
|
787
787
|
fileApp.use('/static/*', serveStatic({ root, path: 'static/100%.txt' }))
|
|
788
788
|
const res = await requestServer(createAdaptorServer(fileApp), {
|
|
789
789
|
method: 'GET',
|
|
@@ -814,7 +814,7 @@ describe('Serve Static Middleware', () => {
|
|
|
814
814
|
;(process.platform === 'win32' ? it.skip : it)(
|
|
815
815
|
'Should handle read permission errors gracefully',
|
|
816
816
|
async () => {
|
|
817
|
-
const app = new
|
|
817
|
+
const app = new Acryl()
|
|
818
818
|
app.use('/static/*', serveStatic({ root: './tests/adapter/assets' }))
|
|
819
819
|
const server = createAdaptorServer(app)
|
|
820
820
|
await expect(
|
|
@@ -829,7 +829,7 @@ describe('Serve Static Middleware with wrong path', () => {
|
|
|
829
829
|
it('Should show an error when the path is wrong', async () => {
|
|
830
830
|
const logSpy = vi.spyOn(console, 'error')
|
|
831
831
|
|
|
832
|
-
const app = new
|
|
832
|
+
const app = new Acryl<{
|
|
833
833
|
Variables: {
|
|
834
834
|
path: string
|
|
835
835
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Acryl } from '../../../acryl-router/src/index.ts'
|
|
2
2
|
import { bodyLimit } from '../../../acryl-router/src/middleware/index.ts'
|
|
3
3
|
import fs from 'node:fs'
|
|
4
4
|
import { request as requestHTTP } from 'node:http'
|
|
@@ -19,7 +19,7 @@ import { app } from './app.ts'
|
|
|
19
19
|
const nodeVersionV20OrLater = parseInt(process.version.slice(1).split('.')[0]) >= 20
|
|
20
20
|
|
|
21
21
|
const createBodyLimitApp = () => {
|
|
22
|
-
const app = new
|
|
22
|
+
const app = new Acryl()
|
|
23
23
|
|
|
24
24
|
app.post(
|
|
25
25
|
'/',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Acryl } from '../../../acryl-router/src/index.ts'
|
|
2
2
|
import { basicAuth } from '../../../acryl-router/src/middleware/index.ts'
|
|
3
3
|
import { compress } from '../../../acryl-router/src/middleware/index.ts'
|
|
4
4
|
import { etag } from '../../../acryl-router/src/middleware/index.ts'
|
|
@@ -46,11 +46,11 @@ describe('Basic', () => {
|
|
|
46
46
|
const res = await requestServer(server, {
|
|
47
47
|
method: 'GET',
|
|
48
48
|
path: '/user-agent',
|
|
49
|
-
headers: { 'user-agent': '
|
|
49
|
+
headers: { 'user-agent': 'Acryl' },
|
|
50
50
|
})
|
|
51
51
|
expect(res.status).toBe(200)
|
|
52
52
|
expect(res.headers.get('content-type')).toMatch('text/plain')
|
|
53
|
-
expect(await res.text()).toBe('
|
|
53
|
+
expect(await res.text()).toBe('Acryl')
|
|
54
54
|
})
|
|
55
55
|
|
|
56
56
|
it('Should return 302 response - POST /posts', async () => {
|
|
@@ -142,7 +142,7 @@ describe.each([
|
|
|
142
142
|
])('Caller-owned response headers over $protocol', ({ serverOptions, request }) => {
|
|
143
143
|
it('should allow reusing the headers passed to c.body()', async () => {
|
|
144
144
|
const headers = { 'content-type': 'text/plain' }
|
|
145
|
-
const testApp = new
|
|
145
|
+
const testApp = new Acryl()
|
|
146
146
|
testApp.get('/', (c) => c.body(new Uint8Array([104, 105]), 200, headers))
|
|
147
147
|
const server = createAdaptorServer({ fetch: testApp.fetch, ...serverOptions })
|
|
148
148
|
|
|
@@ -166,7 +166,7 @@ describe.each([
|
|
|
166
166
|
}
|
|
167
167
|
const bodies = ['hi', 'hello', '']
|
|
168
168
|
let index = 0
|
|
169
|
-
const testApp = new
|
|
169
|
+
const testApp = new Acryl()
|
|
170
170
|
testApp.get('/', () => new Response(makeBody(bodies[index++]), { headers }))
|
|
171
171
|
const server = createAdaptorServer({ fetch: testApp.fetch, ...serverOptions })
|
|
172
172
|
|
|
@@ -186,10 +186,11 @@ describe('various response body types', () => {
|
|
|
186
186
|
const largeText = 'a'.repeat(1024 * 1024 * 10)
|
|
187
187
|
let server: ServerType
|
|
188
188
|
let resolveReadableStreamPromise: () => void
|
|
189
|
+
let resolveReadableStreamFirstChunkPromise: () => void
|
|
189
190
|
let resolveEventStreamPromise: () => void
|
|
190
191
|
let resolveEventStreamWithoutTransferEncodingPromise: () => void
|
|
191
192
|
beforeAll(() => {
|
|
192
|
-
const app = new
|
|
193
|
+
const app = new Acryl()
|
|
193
194
|
app.use('*', async (c, next) => {
|
|
194
195
|
await next()
|
|
195
196
|
|
|
@@ -223,11 +224,17 @@ describe('various response body types', () => {
|
|
|
223
224
|
const readableStreamPromise = new Promise<void>((resolve) => {
|
|
224
225
|
resolveReadableStreamPromise = resolve
|
|
225
226
|
})
|
|
227
|
+
const readableStreamFirstChunkPromise = new Promise<void>((resolve) => {
|
|
228
|
+
resolveReadableStreamFirstChunkPromise = resolve
|
|
229
|
+
})
|
|
226
230
|
app.get('/readable-stream', () => {
|
|
227
231
|
const stream = new ReadableStream({
|
|
228
232
|
async start(controller) {
|
|
229
233
|
await readableStreamPromise
|
|
230
234
|
controller.enqueue('Hello!')
|
|
235
|
+
// The second chunk waits until the client has the first, so the two arrive as two reads on every platform (TCP may join
|
|
236
|
+
// two back-to-back writes into one read, as it does on Windows).
|
|
237
|
+
await readableStreamFirstChunkPromise
|
|
231
238
|
controller.enqueue(' Node!')
|
|
232
239
|
controller.close()
|
|
233
240
|
},
|
|
@@ -286,34 +293,34 @@ describe('various response body types', () => {
|
|
|
286
293
|
})
|
|
287
294
|
})
|
|
288
295
|
app.get('/buffer', () => {
|
|
289
|
-
const response = new Response(Buffer.from('Hello
|
|
296
|
+
const response = new Response(Buffer.from('Hello Acryl!'), {
|
|
290
297
|
headers: { 'content-type': 'text/plain' },
|
|
291
298
|
})
|
|
292
299
|
return response
|
|
293
300
|
})
|
|
294
301
|
app.get('/text-with-content-length-object', () => {
|
|
295
|
-
const response = new Response('Hello
|
|
296
|
-
headers: { 'content-type': 'text/plain', 'content-length': '
|
|
302
|
+
const response = new Response('Hello Acryl!', {
|
|
303
|
+
headers: { 'content-type': 'text/plain', 'content-length': '00012' },
|
|
297
304
|
})
|
|
298
305
|
return response
|
|
299
306
|
})
|
|
300
307
|
app.get('/text-with-content-length-headers', () => {
|
|
301
|
-
const response = new Response('Hello
|
|
302
|
-
headers: new Headers({ 'content-type': 'text/plain', 'content-length': '
|
|
308
|
+
const response = new Response('Hello Acryl!', {
|
|
309
|
+
headers: new Headers({ 'content-type': 'text/plain', 'content-length': '00012' }),
|
|
303
310
|
})
|
|
304
311
|
return response
|
|
305
312
|
})
|
|
306
313
|
app.get('/text-with-content-length-array', () => {
|
|
307
|
-
const response = new Response('Hello
|
|
314
|
+
const response = new Response('Hello Acryl!', {
|
|
308
315
|
headers: [
|
|
309
316
|
['content-type', 'text/plain'],
|
|
310
|
-
['content-length', '
|
|
317
|
+
['content-length', '00012'],
|
|
311
318
|
],
|
|
312
319
|
})
|
|
313
320
|
return response
|
|
314
321
|
})
|
|
315
322
|
app.get('/text-with-set-cookie-array', () => {
|
|
316
|
-
const response = new Response('Hello
|
|
323
|
+
const response = new Response('Hello Acryl!', {
|
|
317
324
|
headers: [
|
|
318
325
|
['content-type', 'text/plain'],
|
|
319
326
|
['set-cookie', 'a=1'],
|
|
@@ -325,7 +332,7 @@ describe('various response body types', () => {
|
|
|
325
332
|
|
|
326
333
|
app.use('/etag/*', etag())
|
|
327
334
|
app.get('/etag/buffer', () => {
|
|
328
|
-
const response = new Response(Buffer.from('Hello
|
|
335
|
+
const response = new Response(Buffer.from('Hello Acryl!'), {
|
|
329
336
|
headers: { 'content-type': 'text/plain' },
|
|
330
337
|
})
|
|
331
338
|
return response
|
|
@@ -376,6 +383,9 @@ describe('various response body types', () => {
|
|
|
376
383
|
expect(headers.get('transfer-encoding')).toBe('chunked')
|
|
377
384
|
resolveReadableStreamPromise()
|
|
378
385
|
},
|
|
386
|
+
onChunk: (_chunk, index) => {
|
|
387
|
+
if (index === 0) resolveReadableStreamFirstChunkPromise()
|
|
388
|
+
},
|
|
379
389
|
}
|
|
380
390
|
)
|
|
381
391
|
expect(res.status).toBe(200)
|
|
@@ -442,8 +452,8 @@ describe('various response body types', () => {
|
|
|
442
452
|
const res = await requestServer(server, { method: 'GET', path: '/buffer' })
|
|
443
453
|
expect(res.status).toBe(200)
|
|
444
454
|
expect(res.headers.get('content-type')).toMatch('text/plain')
|
|
445
|
-
expect(res.headers.get('content-length')).toMatch('
|
|
446
|
-
expect(await res.text()).toBe('Hello
|
|
455
|
+
expect(res.headers.get('content-length')).toMatch('12')
|
|
456
|
+
expect(await res.text()).toBe('Hello Acryl!')
|
|
447
457
|
})
|
|
448
458
|
|
|
449
459
|
it('Should return 200 response - GET /text-with-content-length-object', async () => {
|
|
@@ -453,8 +463,8 @@ describe('various response body types', () => {
|
|
|
453
463
|
})
|
|
454
464
|
expect(res.status).toBe(200)
|
|
455
465
|
expect(res.headers.get('content-type')).toMatch('text/plain')
|
|
456
|
-
expect(res.headers.get('content-length')).toBe('
|
|
457
|
-
expect(await res.text()).toBe('Hello
|
|
466
|
+
expect(res.headers.get('content-length')).toBe('00012')
|
|
467
|
+
expect(await res.text()).toBe('Hello Acryl!')
|
|
458
468
|
})
|
|
459
469
|
|
|
460
470
|
it('Should return 200 response - GET /text-with-content-length-headers', async () => {
|
|
@@ -464,8 +474,8 @@ describe('various response body types', () => {
|
|
|
464
474
|
})
|
|
465
475
|
expect(res.status).toBe(200)
|
|
466
476
|
expect(res.headers.get('content-type')).toMatch('text/plain')
|
|
467
|
-
expect(res.headers.get('content-length')).toBe('
|
|
468
|
-
expect(await res.text()).toBe('Hello
|
|
477
|
+
expect(res.headers.get('content-length')).toBe('00012')
|
|
478
|
+
expect(await res.text()).toBe('Hello Acryl!')
|
|
469
479
|
})
|
|
470
480
|
|
|
471
481
|
it('Should return 200 response - GET /text-with-content-length-array', async () => {
|
|
@@ -475,8 +485,8 @@ describe('various response body types', () => {
|
|
|
475
485
|
})
|
|
476
486
|
expect(res.status).toBe(200)
|
|
477
487
|
expect(res.headers.get('content-type')).toMatch('text/plain')
|
|
478
|
-
expect(res.headers.get('content-length')).toBe('
|
|
479
|
-
expect(await res.text()).toBe('Hello
|
|
488
|
+
expect(res.headers.get('content-length')).toBe('00012')
|
|
489
|
+
expect(await res.text()).toBe('Hello Acryl!')
|
|
480
490
|
})
|
|
481
491
|
|
|
482
492
|
it('Should return 200 response - GET /text-with-set-cookie-array', async () => {
|
|
@@ -487,16 +497,16 @@ describe('various response body types', () => {
|
|
|
487
497
|
expect(res.status).toBe(200)
|
|
488
498
|
expect(res.headers.get('content-type')).toMatch('text/plain')
|
|
489
499
|
expect(res.headers.getSetCookie()).toEqual(['a=1', 'b=2'])
|
|
490
|
-
expect(await res.text()).toBe('Hello
|
|
500
|
+
expect(await res.text()).toBe('Hello Acryl!')
|
|
491
501
|
})
|
|
492
502
|
|
|
493
503
|
it('Should return 200 response - GET /etag/buffer', async () => {
|
|
494
504
|
const res = await requestServer(server, { method: 'GET', path: '/etag/buffer' })
|
|
495
505
|
expect(res.status).toBe(200)
|
|
496
506
|
expect(res.headers.get('content-type')).toMatch('text/plain')
|
|
497
|
-
expect(res.headers.get('etag')).toMatch('"
|
|
498
|
-
expect(res.headers.get('content-length')).toMatch('
|
|
499
|
-
expect(await res.text()).toBe('Hello
|
|
507
|
+
expect(res.headers.get('etag')).toMatch('"687f9e1bf5c0384d6b9cb63d0f6f0ba1803b2669"')
|
|
508
|
+
expect(res.headers.get('content-length')).toMatch('12')
|
|
509
|
+
expect(await res.text()).toBe('Hello Acryl!')
|
|
500
510
|
})
|
|
501
511
|
}
|
|
502
512
|
|
|
@@ -511,14 +521,14 @@ describe('various response body types', () => {
|
|
|
511
521
|
|
|
512
522
|
describe('Routing', () => {
|
|
513
523
|
describe('Nested Route', () => {
|
|
514
|
-
const book = new
|
|
524
|
+
const book = new Acryl()
|
|
515
525
|
book.get('/', (c) => c.text('get /book'))
|
|
516
526
|
book.get('/:id', (c) => {
|
|
517
527
|
return c.text('get /book/' + c.req.param('id'))
|
|
518
528
|
})
|
|
519
529
|
book.post('/', (c) => c.text('post /book'))
|
|
520
530
|
|
|
521
|
-
const app = new
|
|
531
|
+
const app = new Acryl()
|
|
522
532
|
app.route('/book', book)
|
|
523
533
|
|
|
524
534
|
const server = createAdaptorServer(app)
|
|
@@ -539,7 +549,7 @@ describe('Routing', () => {
|
|
|
539
549
|
})
|
|
540
550
|
|
|
541
551
|
describe('Chained route', () => {
|
|
542
|
-
const app = new
|
|
552
|
+
const app = new Acryl()
|
|
543
553
|
|
|
544
554
|
app
|
|
545
555
|
.get('/chained/:abc', (c) => {
|
|
@@ -568,7 +578,7 @@ describe('Routing', () => {
|
|
|
568
578
|
})
|
|
569
579
|
|
|
570
580
|
describe('Request body', () => {
|
|
571
|
-
const app = new
|
|
581
|
+
const app = new Acryl()
|
|
572
582
|
app.post('/json', async (c) => {
|
|
573
583
|
const data = await c.req.json()
|
|
574
584
|
return c.json(data)
|
|
@@ -604,7 +614,7 @@ describe('Request body', () => {
|
|
|
604
614
|
|
|
605
615
|
describe('Response body', () => {
|
|
606
616
|
describe('Cached Response', () => {
|
|
607
|
-
const app = new
|
|
617
|
+
const app = new Acryl()
|
|
608
618
|
app.get('/json', (c) => {
|
|
609
619
|
return c.json({ foo: 'bar' })
|
|
610
620
|
})
|
|
@@ -649,7 +659,7 @@ describe('Response body', () => {
|
|
|
649
659
|
})
|
|
650
660
|
|
|
651
661
|
describe('Fallback to global.Response', () => {
|
|
652
|
-
const app = new
|
|
662
|
+
const app = new Acryl()
|
|
653
663
|
|
|
654
664
|
app.get('/json-blob', async () => {
|
|
655
665
|
return new Response(new Blob([JSON.stringify({ foo: 'blob' })]), {
|
|
@@ -682,7 +692,7 @@ describe('Response body', () => {
|
|
|
682
692
|
})
|
|
683
693
|
|
|
684
694
|
describe('Middleware', () => {
|
|
685
|
-
const app = new
|
|
695
|
+
const app = new Acryl<{ Variables: { foo: string } }>()
|
|
686
696
|
app.use('*', poweredBy())
|
|
687
697
|
app.use('*', async (c, next) => {
|
|
688
698
|
c.set('foo', 'bar')
|
|
@@ -695,13 +705,13 @@ describe('Middleware', () => {
|
|
|
695
705
|
it('Should have correct header values', async () => {
|
|
696
706
|
const res = await requestServer(server, { method: 'GET', path: '/' })
|
|
697
707
|
expect(res.status).toBe(200)
|
|
698
|
-
expect(res.headers.get('x-powered-by')).toBe('
|
|
708
|
+
expect(res.headers.get('x-powered-by')).toBe('Acryl')
|
|
699
709
|
expect(res.headers.get('foo')).toBe('bar')
|
|
700
710
|
})
|
|
701
711
|
})
|
|
702
712
|
|
|
703
713
|
describe('Error handling', () => {
|
|
704
|
-
const app = new
|
|
714
|
+
const app = new Acryl()
|
|
705
715
|
app.notFound((c) => {
|
|
706
716
|
return c.text('Custom NotFound', 404)
|
|
707
717
|
})
|
|
@@ -732,7 +742,7 @@ describe('Error handling', () => {
|
|
|
732
742
|
})
|
|
733
743
|
|
|
734
744
|
describe('Basic Auth Middleware', () => {
|
|
735
|
-
const app = new
|
|
745
|
+
const app = new Acryl()
|
|
736
746
|
const username = 'acryl-user-a'
|
|
737
747
|
const password = 'acryl-password-a'
|
|
738
748
|
const unicodePassword = '炎'
|
|
@@ -788,7 +798,7 @@ describe('Basic Auth Middleware', () => {
|
|
|
788
798
|
})
|
|
789
799
|
|
|
790
800
|
describe('Stream and non-stream response', () => {
|
|
791
|
-
const app = new
|
|
801
|
+
const app = new Acryl()
|
|
792
802
|
|
|
793
803
|
app.get('/json', (c) => c.json({ foo: 'bar' }))
|
|
794
804
|
app.get('/text', (c) => c.text('Hello!'))
|
|
@@ -873,7 +883,7 @@ describe('Stream and non-stream response', () => {
|
|
|
873
883
|
})
|
|
874
884
|
|
|
875
885
|
describe('SSL', () => {
|
|
876
|
-
const app = new
|
|
886
|
+
const app = new Acryl()
|
|
877
887
|
app.get('/', (c) => c.text('Hello! Node!'))
|
|
878
888
|
app.get('/url', (c) => c.text(c.req.url))
|
|
879
889
|
|
|
@@ -905,7 +915,7 @@ describe('SSL', () => {
|
|
|
905
915
|
})
|
|
906
916
|
|
|
907
917
|
describe('HTTP2', () => {
|
|
908
|
-
const app = new
|
|
918
|
+
const app = new Acryl()
|
|
909
919
|
app.get('/', (c) => c.text('Hello! Node!'))
|
|
910
920
|
app.get('/headers', (c) => {
|
|
911
921
|
// call newRequestFromIncoming
|
|
@@ -949,8 +959,8 @@ describe('HTTP2', () => {
|
|
|
949
959
|
})
|
|
950
960
|
})
|
|
951
961
|
|
|
952
|
-
describe('
|
|
953
|
-
const app = new
|
|
962
|
+
describe('Acryl compression default gzip', () => {
|
|
963
|
+
const app = new Acryl()
|
|
954
964
|
app.use('*', compress())
|
|
955
965
|
|
|
956
966
|
app.notFound((c) => {
|
|
@@ -1013,8 +1023,8 @@ describe('App compression default gzip', () => {
|
|
|
1013
1023
|
})
|
|
1014
1024
|
})
|
|
1015
1025
|
|
|
1016
|
-
describe('
|
|
1017
|
-
const app = new
|
|
1026
|
+
describe('Acryl compression deflate', () => {
|
|
1027
|
+
const app = new Acryl()
|
|
1018
1028
|
app.use('*', compress({ encoding: 'deflate' }))
|
|
1019
1029
|
|
|
1020
1030
|
app.notFound((c) => {
|
|
@@ -1078,7 +1088,7 @@ describe('App compression deflate', () => {
|
|
|
1078
1088
|
})
|
|
1079
1089
|
|
|
1080
1090
|
describe('set child response to c.res', () => {
|
|
1081
|
-
const app = new
|
|
1091
|
+
const app = new Acryl()
|
|
1082
1092
|
app.use('*', async (c, next) => {
|
|
1083
1093
|
await next()
|
|
1084
1094
|
c.res = new Response('', c.res)
|
|
@@ -1101,7 +1111,7 @@ describe('Headers appended to a raw Response after construction (issue #304)', (
|
|
|
1101
1111
|
// Regression test: a handler returning `new Response(body, init)` and
|
|
1102
1112
|
// appending headers (e.g. `Set-Cookie`) afterwards must not lose those
|
|
1103
1113
|
// headers when middleware later clones the response via `new Response(...)`.
|
|
1104
|
-
const app = new
|
|
1114
|
+
const app = new Acryl()
|
|
1105
1115
|
app.use('*', async (c, next) => {
|
|
1106
1116
|
await next()
|
|
1107
1117
|
// Mimics what middleware such as `cors`/`compress` does internally.
|
|
@@ -1127,7 +1137,7 @@ describe('Headers appended to a raw Response after construction (issue #304)', (
|
|
|
1127
1137
|
})
|
|
1128
1138
|
|
|
1129
1139
|
describe('forwarding IncomingMessage and ServerResponse in env', () => {
|
|
1130
|
-
const app = new
|
|
1140
|
+
const app = new Acryl<{ Bindings: HttpBindings }>()
|
|
1131
1141
|
app.get('/', (c) =>
|
|
1132
1142
|
c.json({
|
|
1133
1143
|
incoming: c.env.incoming.constructor.name,
|
|
@@ -1151,7 +1161,7 @@ describe('forwarding IncomingMessage and ServerResponse in env', () => {
|
|
|
1151
1161
|
})
|
|
1152
1162
|
|
|
1153
1163
|
describe('overrideGlobalObjects', () => {
|
|
1154
|
-
const app = new
|
|
1164
|
+
const app = new Acryl()
|
|
1155
1165
|
|
|
1156
1166
|
beforeEach(() => {
|
|
1157
1167
|
Object.defineProperty(global, 'Headers', {
|
|
@@ -1201,7 +1211,7 @@ describe('Memory leak test', () => {
|
|
|
1201
1211
|
const registry = new FinalizationRegistry(() => {
|
|
1202
1212
|
counter--
|
|
1203
1213
|
})
|
|
1204
|
-
const app = new
|
|
1214
|
+
const app = new Acryl()
|
|
1205
1215
|
const server = createAdaptorServer(app)
|
|
1206
1216
|
|
|
1207
1217
|
let onAbort: () => void
|
|
@@ -1286,7 +1296,7 @@ describe('Memory leak test', () => {
|
|
|
1286
1296
|
})
|
|
1287
1297
|
|
|
1288
1298
|
describe('serve', () => {
|
|
1289
|
-
const app = new
|
|
1299
|
+
const app = new Acryl()
|
|
1290
1300
|
app.get('/', (c) => c.newResponse(null, 200))
|
|
1291
1301
|
serve(app)
|
|
1292
1302
|
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Acryl } from '../../../../acryl-router/src/index.ts'
|
|
2
2
|
import type { HttpBindings } from '../../../src/adapter/index.ts'
|
|
3
3
|
import { createAdaptorServer } from '../../../src/adapter/server.ts'
|
|
4
4
|
import { RESPONSE_ALREADY_SENT } from '../../../src/adapter/utils/response.ts'
|
|
5
5
|
import { requestServer } from '../helpers/request.ts'
|
|
6
6
|
|
|
7
7
|
describe('RESPONSE_ALREADY_SENT', () => {
|
|
8
|
-
const app = new
|
|
8
|
+
const app = new Acryl<{ Bindings: HttpBindings }>()
|
|
9
9
|
app.get('/', (c) => {
|
|
10
10
|
const { outgoing } = c.env
|
|
11
11
|
outgoing.writeHead(200, { 'Content-Type': 'text/plain' })
|
|
12
|
-
outgoing.end('
|
|
12
|
+
outgoing.end('Acryl!')
|
|
13
13
|
return RESPONSE_ALREADY_SENT
|
|
14
14
|
})
|
|
15
15
|
const server = createAdaptorServer(app)
|
|
@@ -18,6 +18,6 @@ describe('RESPONSE_ALREADY_SENT', () => {
|
|
|
18
18
|
const res = await requestServer(server, { method: 'GET', path: '/' })
|
|
19
19
|
expect(res.status).toBe(200)
|
|
20
20
|
expect(res.headers.get('content-type')).toMatch('text/plain')
|
|
21
|
-
expect(await res.text()).toBe('
|
|
21
|
+
expect(await res.text()).toBe('Acryl!')
|
|
22
22
|
})
|
|
23
23
|
})
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Acryl } from '../../../acryl-router/src/index.ts'
|
|
2
2
|
import { WebSocket, WebSocketServer } from 'ws'
|
|
3
3
|
import { connect } from 'node:net'
|
|
4
4
|
import type { AddressInfo } from 'node:net'
|
|
5
5
|
import { createAdaptorServer, upgradeWebSocket } from '../../src/adapter/index.ts'
|
|
6
6
|
|
|
7
7
|
describe('WebSocket', () => {
|
|
8
|
-
const startServer = (app:
|
|
8
|
+
const startServer = (app: Acryl) => {
|
|
9
9
|
const wss = new WebSocketServer({ noServer: true })
|
|
10
10
|
const server = createAdaptorServer({ fetch: app.fetch, websocket: { server: wss } })
|
|
11
11
|
return new Promise<{ server: ReturnType<typeof createAdaptorServer>; address: AddressInfo }>(
|
|
@@ -18,7 +18,7 @@ describe('WebSocket', () => {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
it('should connect with upgradeWebSocket without manual injection', async () => {
|
|
21
|
-
const app = new
|
|
21
|
+
const app = new Acryl()
|
|
22
22
|
|
|
23
23
|
app.get(
|
|
24
24
|
'/ws',
|
|
@@ -50,7 +50,7 @@ describe('WebSocket', () => {
|
|
|
50
50
|
})
|
|
51
51
|
|
|
52
52
|
it('should reject WebSocket upgrade when route is not upgraded', async () => {
|
|
53
|
-
const app = new
|
|
53
|
+
const app = new Acryl()
|
|
54
54
|
app.get('/ws', (c) => c.text('ok'))
|
|
55
55
|
|
|
56
56
|
const { server, address } = await startServer(app)
|
|
@@ -71,7 +71,7 @@ describe('WebSocket', () => {
|
|
|
71
71
|
})
|
|
72
72
|
|
|
73
73
|
it('should forward response headers set by middleware on a successful upgrade', async () => {
|
|
74
|
-
const app = new
|
|
74
|
+
const app = new Acryl()
|
|
75
75
|
|
|
76
76
|
app.use(async (c, next) => {
|
|
77
77
|
await next()
|
|
@@ -106,7 +106,7 @@ describe('WebSocket', () => {
|
|
|
106
106
|
})
|
|
107
107
|
|
|
108
108
|
it('should forward response headers when the upgrade is rejected', async () => {
|
|
109
|
-
const app = new
|
|
109
|
+
const app = new Acryl()
|
|
110
110
|
|
|
111
111
|
app.get(
|
|
112
112
|
'/ws',
|
|
@@ -138,7 +138,7 @@ describe('WebSocket', () => {
|
|
|
138
138
|
})
|
|
139
139
|
|
|
140
140
|
it('should not block other upgrade listeners', async () => {
|
|
141
|
-
const app = new
|
|
141
|
+
const app = new Acryl()
|
|
142
142
|
const { server, address } = await startServer(app)
|
|
143
143
|
const wss = new WebSocketServer({ noServer: true })
|
|
144
144
|
|
|
@@ -165,7 +165,7 @@ describe('WebSocket', () => {
|
|
|
165
165
|
})
|
|
166
166
|
|
|
167
167
|
it('should call onError with the underlying error when the raw socket errors', async () => {
|
|
168
|
-
const app = new
|
|
168
|
+
const app = new Acryl()
|
|
169
169
|
const receivedError = new Error('boom')
|
|
170
170
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
171
171
|
let rawWs: any
|
|
@@ -210,7 +210,7 @@ describe('WebSocket', () => {
|
|
|
210
210
|
liveCount--
|
|
211
211
|
})
|
|
212
212
|
|
|
213
|
-
const app = new
|
|
213
|
+
const app = new Acryl()
|
|
214
214
|
app.use('/ws', async (c, next) => {
|
|
215
215
|
liveCount++
|
|
216
216
|
registry.register((c.env as { incoming: object }).incoming, 'incoming')
|