acrylblends 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +73 -0
- package/docs/framework/README.md +51 -51
- package/docs/framework/UPSTREAM.md +1 -1
- package/docs/framework/agents/index.md +24 -0
- package/docs/framework/api/acryl.md +259 -0
- package/docs/framework/api/context.md +527 -0
- package/docs/framework/api/exception.md +80 -0
- package/docs/framework/api/index.md +12 -0
- package/docs/framework/api/presets.md +65 -0
- package/docs/framework/api/request.md +396 -0
- package/docs/framework/api/routing.md +303 -0
- package/docs/framework/{api-summary.md → api/summary.md} +19 -17
- package/docs/framework/concepts/benchmarks.md +26 -0
- package/docs/framework/concepts/developer-experience.md +5 -0
- package/docs/framework/concepts/middleware.md +21 -0
- package/docs/framework/concepts/motivation.md +14 -0
- package/docs/framework/concepts/routers.md +63 -0
- package/docs/framework/concepts/stacks.md +235 -0
- package/docs/framework/concepts/web-standard.md +37 -0
- package/docs/framework/{getting-started.md → cordis/acryl-in-a-cordis-app.md} +16 -16
- package/docs/framework/{concepts.md → cordis/concepts.md} +2 -2
- package/docs/framework/cordis/middleware.md +8 -0
- package/docs/framework/{migration-from-0-3.md → cordis/migration-from-0-3.md} +16 -13
- package/docs/framework/cordis/migration-from-0-4.md +14 -0
- package/docs/framework/{migration-from-dsh-webserver.md → cordis/migration-from-dsh-webserver.md} +7 -7
- package/docs/framework/{routing.md → cordis/mounting.md} +5 -108
- package/docs/framework/{node-server.md → cordis/node-server.md} +4 -4
- package/docs/framework/{surfaces.md → cordis/surfaces.md} +2 -2
- package/docs/framework/cordis/transport-and-cancellation.md +57 -0
- package/docs/framework/{validation.md → cordis/validation.md} +9 -9
- package/docs/framework/getting-started/basic.md +196 -0
- package/docs/framework/getting-started/bun.md +221 -0
- package/docs/framework/getting-started/nodejs.md +344 -0
- package/docs/framework/getting-started/other-runtimes.md +23 -0
- package/docs/framework/guides/best-practices.md +231 -0
- package/docs/framework/guides/create-acrylblends.md +79 -0
- package/docs/framework/guides/examples.md +3 -0
- package/docs/framework/guides/faq.md +19 -0
- package/docs/framework/guides/helpers.md +33 -0
- package/docs/framework/guides/jsx-dom.md +299 -0
- package/docs/framework/guides/jsx.md +440 -0
- package/docs/framework/guides/middleware.md +253 -0
- package/docs/framework/guides/rpc.md +886 -0
- package/docs/framework/guides/testing.md +133 -0
- package/docs/framework/guides/validation.md +383 -0
- package/docs/framework/helpers/accepts.md +60 -0
- package/docs/framework/helpers/adapter.md +87 -0
- package/docs/framework/helpers/conninfo.md +112 -0
- package/docs/framework/helpers/cookie.md +232 -0
- package/docs/framework/helpers/css.md +285 -0
- package/docs/framework/helpers/dev.md +67 -0
- package/docs/framework/helpers/factory.md +180 -0
- package/docs/framework/helpers/html.md +123 -0
- package/docs/framework/helpers/jwt.md +184 -0
- package/docs/framework/helpers/proxy.md +118 -0
- package/docs/framework/helpers/route.md +143 -0
- package/docs/framework/helpers/ssg.md +393 -0
- package/docs/framework/helpers/streaming.md +119 -0
- package/docs/framework/helpers/testing.md +101 -0
- package/docs/framework/helpers/websocket.md +215 -0
- package/docs/framework/middleware/builtin/basic-auth.md +165 -0
- package/docs/framework/middleware/builtin/bearer-auth.md +138 -0
- package/docs/framework/middleware/builtin/body-limit.md +71 -0
- package/docs/framework/middleware/builtin/cache.md +122 -0
- package/docs/framework/middleware/builtin/combine.md +94 -0
- package/docs/framework/middleware/builtin/compress.md +59 -0
- package/docs/framework/middleware/builtin/context-storage.md +78 -0
- package/docs/framework/middleware/builtin/cors.md +135 -0
- package/docs/framework/middleware/builtin/csrf.md +105 -0
- package/docs/framework/middleware/builtin/etag.md +54 -0
- package/docs/framework/middleware/builtin/ip-restriction.md +69 -0
- package/docs/framework/middleware/builtin/jsx-renderer.md +286 -0
- package/docs/framework/middleware/builtin/jwk.md +192 -0
- package/docs/framework/middleware/builtin/jwt.md +145 -0
- package/docs/framework/middleware/builtin/language.md +232 -0
- package/docs/framework/middleware/builtin/logger.md +74 -0
- package/docs/framework/middleware/builtin/loopback-only.md +31 -0
- package/docs/framework/middleware/builtin/method-not-allowed.md +48 -0
- package/docs/framework/middleware/builtin/method-override.md +80 -0
- package/docs/framework/middleware/builtin/mount.md +106 -0
- package/docs/framework/middleware/builtin/pretty-json.md +53 -0
- package/docs/framework/middleware/builtin/request-id.md +94 -0
- package/docs/framework/middleware/builtin/secure-headers.md +247 -0
- package/docs/framework/middleware/builtin/timeout.md +98 -0
- package/docs/framework/middleware/builtin/timing.md +101 -0
- package/docs/framework/middleware/builtin/trailing-slash.md +74 -0
- package/docs/framework/middleware/third-party.md +4 -0
- package/docs/framework/upstream.json +3 -3
- package/lib/accepts-XBuZPVRI.js +52 -0
- package/lib/accepts.d.ts +33 -0
- package/lib/accepts.js +2 -0
- package/lib/acryl-base.d.ts +2 -0
- package/lib/acryl-base.js +332 -0
- package/lib/adapter.d.ts +12 -0
- package/lib/adapter.js +37 -0
- package/lib/app-BM0rTCp7.js +26 -0
- package/lib/app-CmAYW1Al.d.ts +21 -0
- package/lib/basic-auth.d.ts +72 -0
- package/lib/basic-auth.js +95 -0
- package/lib/bearer-auth.d.ts +89 -0
- package/lib/bearer-auth.js +94 -0
- package/lib/body-limit.d.ts +42 -0
- package/lib/body-limit.js +66 -0
- package/lib/client-BHTr318g.js +266 -0
- package/lib/client.d.ts +3 -0
- package/lib/client.js +2 -0
- package/lib/combine.d.ts +85 -0
- package/lib/combine.js +137 -0
- package/lib/compose-BuW2B6PZ.js +50 -0
- package/lib/compress.d.ts +38 -0
- package/lib/compress.js +79 -0
- package/lib/connection-C7xgP1hP.js +24 -0
- package/lib/conninfo.d.ts +25 -0
- package/lib/conninfo.js +2 -0
- package/lib/constants-Dy7ZvN1H.js +4 -0
- package/lib/context-Bm7rI-oK.d.ts +1234 -0
- package/lib/context-DDO0cfuP.js +365 -0
- package/lib/context-storage.d.ts +38 -0
- package/lib/context-storage.js +52 -0
- package/lib/cookie-ClMaKDQf.d.ts +40 -0
- package/lib/cookie.d.ts +24 -0
- package/lib/cookie.js +82 -0
- package/lib/cors.d.ts +52 -0
- package/lib/cors.js +106 -0
- package/lib/csrf.d.ts +75 -0
- package/lib/csrf.js +101 -0
- package/lib/etag.d.ts +40 -0
- package/lib/etag.js +135 -0
- package/lib/factory.d.ts +35 -0
- package/lib/factory.js +30 -0
- package/lib/headers-tu2YYN8T.d.ts +11 -0
- package/lib/html.d.ts +6 -0
- package/lib/html.js +31 -0
- package/lib/http-exception.d.ts +57 -0
- package/lib/http-exception.js +54 -0
- package/lib/http-status-DaAwGAFL.d.ts +35 -0
- package/lib/index-B-3F4wt2.d.ts +12 -0
- package/lib/index-UTBmM3GX.d.ts +68 -0
- package/lib/index-oOClm_Xk.d.ts +45 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +28 -0
- package/lib/ip-restriction.d.ts +68 -0
- package/lib/ip-restriction.js +166 -0
- package/lib/jwk.d.ts +52 -0
- package/lib/jwk.js +117 -0
- package/lib/jwt-BGJBw5AF.js +403 -0
- package/lib/jwt-Dg493Tai.d.ts +51 -0
- package/lib/jwt.d.ts +72 -0
- package/lib/jwt.js +115 -0
- package/lib/language.d.ts +88 -0
- package/lib/language.js +198 -0
- package/lib/logger.d.ts +22 -0
- package/lib/logger.js +54 -0
- package/lib/loopback-only.d.ts +45 -0
- package/lib/loopback-only.js +90 -0
- package/lib/method-not-allowed.d.ts +47 -0
- package/lib/method-not-allowed.js +82 -0
- package/lib/method-override.d.ts +46 -0
- package/lib/method-override.js +103 -0
- package/lib/mime-BQOYHl-l.d.ts +72 -0
- package/lib/node-server/conninfo.d.ts +11 -0
- package/lib/node-server/conninfo.js +19 -0
- package/lib/node-server/serve-static.d.ts +19 -0
- package/lib/node-server/serve-static.js +2 -0
- package/lib/node-server.d.ts +103 -0
- package/lib/node-server.js +1325 -0
- package/lib/powered-by.d.ts +28 -0
- package/lib/powered-by.js +24 -0
- package/lib/pretty-json.d.ts +40 -0
- package/lib/pretty-json.js +39 -0
- package/lib/reg-exp-router-DC1R3qoY.js +363 -0
- package/lib/request-id.d.ts +45 -0
- package/lib/request-id.js +34 -0
- package/lib/request.d.ts +2 -0
- package/lib/request.js +323 -0
- package/lib/route.d.ts +78 -0
- package/lib/route.js +126 -0
- package/lib/router/linear-router.d.ts +11 -0
- package/lib/router/linear-router.js +96 -0
- package/lib/router/pattern-router.d.ts +11 -0
- package/lib/router/pattern-router.js +41 -0
- package/lib/router/reg-exp-router.d.ts +35 -0
- package/lib/router/reg-exp-router.js +2 -0
- package/lib/router/smart-router.d.ts +15 -0
- package/lib/router/smart-router.js +2 -0
- package/lib/router/trie-router.d.ts +11 -0
- package/lib/router/trie-router.js +2 -0
- package/lib/router-CvUxUTOq.d.ts +99 -0
- package/lib/router.d.ts +2 -0
- package/lib/router.js +35 -0
- package/lib/schema-validator.d.ts +28 -0
- package/lib/schema-validator.js +22 -0
- package/lib/secure-headers.d.ts +125 -0
- package/lib/secure-headers.js +163 -0
- package/lib/serve-static-Dw_m6KxR.js +213 -0
- package/lib/serve-static.d.ts +31 -0
- package/lib/serve-static.js +77 -0
- package/lib/smart-router-C5CZ5XSM.js +49 -0
- package/lib/stream-CPdqZ0Fp.d.ts +34 -0
- package/lib/streaming-DHST3Scg.js +96 -0
- package/lib/streaming.d.ts +23 -0
- package/lib/streaming.js +2 -0
- package/lib/testing.d.ts +10 -0
- package/lib/testing.js +17 -0
- package/lib/timeout.d.ts +30 -0
- package/lib/timeout.js +42 -0
- package/lib/timing.d.ts +130 -0
- package/lib/timing.js +183 -0
- package/lib/trailing-slash.d.ts +91 -0
- package/lib/trailing-slash.js +85 -0
- package/lib/trie-router-CfFbapzL.js +146 -0
- package/lib/types-CDO6I3B0.d.ts +40 -0
- package/lib/types-CHesD1KG.d.ts +195 -0
- package/lib/types-CwrQjlaM.d.ts +105 -0
- package/lib/types-DR95J00T.d.ts +29 -0
- package/lib/types.d.ts +2 -0
- package/lib/types.js +4 -0
- package/lib/utils/accept.d.ts +9 -0
- package/lib/utils/accept.js +193 -0
- package/lib/utils/basic-auth.d.ts +8 -0
- package/lib/utils/basic-auth.js +20 -0
- package/lib/utils/body.d.ts +2 -0
- package/lib/utils/body.js +94 -0
- package/lib/utils/buffer.d.ts +19 -0
- package/lib/utils/buffer.js +51 -0
- package/lib/utils/color.d.ts +24 -0
- package/lib/utils/color.js +37 -0
- package/lib/utils/compress.d.ts +11 -0
- package/lib/utils/compress.js +11 -0
- package/lib/utils/concurrent.d.ts +17 -0
- package/lib/utils/concurrent.js +30 -0
- package/lib/utils/constants.d.ts +7 -0
- package/lib/utils/constants.js +7 -0
- package/lib/utils/cookie.d.ts +2 -0
- package/lib/utils/cookie.js +125 -0
- package/lib/utils/crypto.d.ts +14 -0
- package/lib/utils/crypto.js +34 -0
- package/lib/utils/encode.d.ts +11 -0
- package/lib/utils/encode.js +33 -0
- package/lib/utils/filepath.d.ts +14 -0
- package/lib/utils/filepath.js +25 -0
- package/lib/utils/handler.d.ts +9 -0
- package/lib/utils/handler.js +12 -0
- package/lib/utils/headers.d.ts +2 -0
- package/lib/utils/headers.js +1 -0
- package/lib/utils/html.d.ts +46 -0
- package/lib/utils/html.js +103 -0
- package/lib/utils/http-status.d.ts +2 -0
- package/lib/utils/http-status.js +1 -0
- package/lib/utils/ipaddr.d.ts +56 -0
- package/lib/utils/ipaddr.js +238 -0
- package/lib/utils/jwt.d.ts +24 -0
- package/lib/utils/jwt.js +2 -0
- package/lib/utils/mime.d.ts +2 -0
- package/lib/utils/mime.js +77 -0
- package/lib/utils/stream.d.ts +2 -0
- package/lib/utils/stream.js +88 -0
- package/lib/utils/types.d.ts +2 -0
- package/lib/utils/types.js +1 -0
- package/lib/utils/url.d.ts +46 -0
- package/lib/utils/url.js +197 -0
- package/lib/utils-dw8lxqjL.js +4 -0
- package/lib/validator-D84mq-dO.js +65 -0
- package/lib/validator.d.ts +42 -0
- package/lib/validator.js +2 -0
- package/lib/ws.d.ts +2 -0
- package/lib/ws.js +53 -0
- package/package.json +312 -14
- package/plugins/acryl-inspect/src/service.ts +2 -2
- package/plugins/acryl-inspect/tests/service.spec.ts +3 -3
- package/plugins/acryl-inspect/upstream.json +2 -2
- package/plugins/acryl-node-server/tests/adapter/app.ts +2 -2
- package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -1
- package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +2 -2
- package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +4 -4
- package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +5 -5
- package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +2 -2
- package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +20 -20
- package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +2 -2
- package/plugins/acryl-node-server/tests/adapter/server.test.ts +50 -50
- package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +4 -4
- package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +9 -9
- package/plugins/acryl-node-server/tests/server.spec.ts +6 -6
- package/plugins/acryl-node-server/upstream.json +2 -2
- package/plugins/acryl-router/src/client.ts +1 -1
- package/plugins/acryl-router/src/connection.ts +2 -2
- package/plugins/acryl-router/src/core/app-base.ts +29 -29
- package/plugins/acryl-router/src/core/app.test.ts +175 -175
- package/plugins/acryl-router/src/core/app.ts +8 -8
- package/plugins/acryl-router/src/core/client/client.test.ts +76 -76
- package/plugins/acryl-router/src/core/client/client.ts +2 -2
- package/plugins/acryl-router/src/core/client/fetch-result-please.ts +1 -1
- package/plugins/acryl-router/src/core/client/index.ts +1 -1
- package/plugins/acryl-router/src/core/client/types.test.ts +6 -6
- package/plugins/acryl-router/src/core/client/types.ts +16 -16
- package/plugins/acryl-router/src/core/client/utils.test.ts +2 -2
- package/plugins/acryl-router/src/core/context.test.ts +4 -4
- package/plugins/acryl-router/src/core/context.ts +6 -6
- package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +3 -3
- package/plugins/acryl-router/src/core/helper/accepts/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +6 -6
- package/plugins/acryl-router/src/core/helper/adapter/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/conninfo/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +8 -8
- package/plugins/acryl-router/src/core/helper/cookie/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/factory/index.test.ts +9 -9
- package/plugins/acryl-router/src/core/helper/factory/index.ts +10 -10
- package/plugins/acryl-router/src/core/helper/html/index.test.ts +4 -4
- package/plugins/acryl-router/src/core/helper/html/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/route/index.test.ts +7 -7
- package/plugins/acryl-router/src/core/helper/route/index.ts +8 -8
- package/plugins/acryl-router/src/core/helper/streaming/index.ts +1 -1
- package/plugins/acryl-router/src/core/helper/testing/index.test.ts +6 -6
- package/plugins/acryl-router/src/core/helper/testing/index.ts +4 -4
- package/plugins/acryl-router/src/core/helper/websocket/index.ts +2 -1
- package/plugins/acryl-router/src/core/http-exception.ts +1 -1
- package/plugins/acryl-router/src/core/index.ts +9 -9
- package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +5 -5
- package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +9 -9
- package/plugins/acryl-router/src/core/middleware/combine/index.ts +7 -7
- package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +9 -9
- package/plugins/acryl-router/src/core/middleware/compress/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +5 -5
- package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +7 -7
- package/plugins/acryl-router/src/core/middleware/cors/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +10 -10
- package/plugins/acryl-router/src/core/middleware/csrf/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +42 -42
- package/plugins/acryl-router/src/core/middleware/etag/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +16 -16
- package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +7 -6
- package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +16 -16
- package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +4 -3
- package/plugins/acryl-router/src/core/middleware/language/index.test.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/language/language.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +5 -5
- package/plugins/acryl-router/src/core/middleware/logger/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +24 -24
- package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +8 -8
- package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +5 -5
- package/plugins/acryl-router/src/core/middleware/method-override/index.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +30 -30
- package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +15 -15
- package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +35 -35
- package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +23 -23
- package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +1 -1
- package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +2 -2
- package/plugins/acryl-router/src/core/middleware/timeout/index.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +14 -14
- package/plugins/acryl-router/src/core/middleware/timing/timing.ts +3 -3
- package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +7 -7
- package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +7 -7
- package/plugins/acryl-router/src/core/request.test.ts +42 -42
- package/plugins/acryl-router/src/core/request.ts +6 -6
- package/plugins/acryl-router/src/core/router/linear-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/router/pattern-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/router/smart-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/router/trie-router/index.ts +1 -1
- package/plugins/acryl-router/src/core/types.test.ts +115 -115
- package/plugins/acryl-router/src/core/types.ts +72 -72
- package/plugins/acryl-router/src/core/utils/body.ts +8 -8
- package/plugins/acryl-router/src/core/utils/html.ts +1 -1
- package/plugins/acryl-router/src/core/utils/jwt/jws.ts +3 -3
- package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +2 -2
- package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +3 -3
- package/plugins/acryl-router/src/core/utils/jwt/types.ts +1 -1
- package/plugins/acryl-router/src/core/utils/types.ts +42 -0
- package/plugins/acryl-router/src/core/utils/url.test.ts +2 -2
- package/plugins/acryl-router/src/core/validator/index.ts +1 -1
- package/plugins/acryl-router/src/core/validator/validator.test.ts +28 -28
- package/plugins/acryl-router/src/deprecated.ts +15 -0
- package/plugins/acryl-router/src/index.ts +3 -2
- package/plugins/acryl-router/src/service.ts +10 -10
- package/plugins/acryl-router/tests/docs-examples.spec.ts +11 -11
- package/plugins/acryl-router/tests/live-install.spec.ts +2 -2
- package/plugins/acryl-router/tests/loader.spec.ts +3 -3
- package/plugins/acryl-router/tests/loopback-only.spec.ts +4 -4
- package/plugins/acryl-router/tests/no-dom/consumer.ts +11 -0
- package/plugins/acryl-router/tests/no-dom/tsconfig.json +13 -0
- package/plugins/acryl-router/tests/service.spec.ts +23 -23
- package/plugins/acryl-router/upstream.json +3 -3
- package/plugins/acryl-router-http/tests/adapter.spec.ts +3 -3
- package/plugins/acryl-router-http/tests/surfaces.spec.ts +2 -2
- package/plugins/acryl-router-http/upstream.json +2 -2
- package/plugins/acryl-state/src/service.ts +2 -2
- package/plugins/acryl-state/upstream.json +2 -2
- package/plugins/builder/script.ts +2 -2
- package/plugins/extensions/resolve.ts +70 -10
- package/plugins/openai/prompt.ts +5 -5
- package/shared/AGENTS.core.md +16 -9
- package/templates/agent/src/routes.ts +2 -2
- package/templates/agent/test/model.test.ts +2 -2
- package/templates/agent/tsconfig.json +40 -0
- package/templates/blank/src/routes.ts +2 -2
- package/templates/todo/src/todo.ts +2 -2
- package/templates/todo/upstream.json +2 -2
- package/docs/framework/context.md +0 -129
- package/docs/framework/helpers.md +0 -118
- package/docs/framework/middleware.md +0 -154
- package/docs/framework/request.md +0 -106
- /package/docs/framework/{plugin-lifecycle.md → cordis/plugin-lifecycle.md} +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Acryl } from '../../app.ts'
|
|
2
2
|
import { cors } from './index.ts'
|
|
3
3
|
|
|
4
4
|
describe('CORS by Middleware', () => {
|
|
5
|
-
const app = new
|
|
5
|
+
const app = new Acryl()
|
|
6
6
|
|
|
7
7
|
app.use('/api/*', cors())
|
|
8
8
|
|
|
@@ -278,7 +278,7 @@ describe('CORS by Middleware', () => {
|
|
|
278
278
|
})
|
|
279
279
|
|
|
280
280
|
it('Append "Origin" to Vary header on OPTIONS preflight, if response has some Vary header', async () => {
|
|
281
|
-
const testApp = new
|
|
281
|
+
const testApp = new Acryl()
|
|
282
282
|
testApp.use('/api/*', async (c, next) => {
|
|
283
283
|
c.header('Vary', 'Accept-Encoding', { append: true })
|
|
284
284
|
await next()
|
|
@@ -412,7 +412,7 @@ describe('CORS by Middleware', () => {
|
|
|
412
412
|
|
|
413
413
|
it('Does not set allow methods when function returns an empty array', async () => {
|
|
414
414
|
for (const allowMethods of [() => [], async () => []]) {
|
|
415
|
-
const app = new
|
|
415
|
+
const app = new Acryl()
|
|
416
416
|
app.use(cors({ allowMethods }))
|
|
417
417
|
|
|
418
418
|
const res = await app.request('http://localhost/', { method: 'OPTIONS' })
|
|
@@ -481,7 +481,7 @@ describe('CORS by Middleware', () => {
|
|
|
481
481
|
})
|
|
482
482
|
|
|
483
483
|
it('Should not reflect an arbitrary Origin when credentials is true with default origin', async () => {
|
|
484
|
-
const app = new
|
|
484
|
+
const app = new Acryl()
|
|
485
485
|
app.use('*', cors({ credentials: true }))
|
|
486
486
|
app.get('/api/me', (c) => c.json({ secret: 'private user data' }))
|
|
487
487
|
|
|
@@ -494,7 +494,7 @@ describe('CORS by Middleware', () => {
|
|
|
494
494
|
})
|
|
495
495
|
|
|
496
496
|
it('Preflight should not approve an arbitrary Origin when credentials is true with default origin', async () => {
|
|
497
|
-
const app = new
|
|
497
|
+
const app = new Acryl()
|
|
498
498
|
app.use('*', cors({ credentials: true }))
|
|
499
499
|
app.delete('/api/account', (c) => c.json({ deleted: true }))
|
|
500
500
|
|
|
@@ -513,7 +513,7 @@ describe('CORS by Middleware', () => {
|
|
|
513
513
|
})
|
|
514
514
|
|
|
515
515
|
it('Options without origin fall back to wildcard default', async () => {
|
|
516
|
-
const subApp = new
|
|
516
|
+
const subApp = new Acryl()
|
|
517
517
|
subApp.use('/api/*', cors({ allowMethods: ['GET', 'POST'] }))
|
|
518
518
|
subApp.get('/api/abc', (c) => c.json({ ok: true }))
|
|
519
519
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* CORS Middleware for
|
|
3
|
+
* CORS Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Context } from '../../context.ts'
|
|
@@ -22,7 +22,7 @@ type CORSOptions = {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* CORS Middleware for
|
|
25
|
+
* CORS Middleware for Acryl.
|
|
26
26
|
*
|
|
27
27
|
*
|
|
28
28
|
* @param {CORSOptions} [options] - The options for the CORS middleware.
|
|
@@ -36,7 +36,7 @@ type CORSOptions = {
|
|
|
36
36
|
*
|
|
37
37
|
* @example
|
|
38
38
|
* ```ts
|
|
39
|
-
* const app = new
|
|
39
|
+
* const app = new Acryl()
|
|
40
40
|
*
|
|
41
41
|
* app.use('/api/*', cors())
|
|
42
42
|
* app.use(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Context } from '../../context.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { Acryl } from '../../app.ts'
|
|
3
3
|
import { csrf } from './index.ts'
|
|
4
4
|
|
|
5
5
|
const simplePostHandler = vi.fn(async (c: Context) => {
|
|
@@ -29,7 +29,7 @@ describe('CSRF by Middleware', () => {
|
|
|
29
29
|
})
|
|
30
30
|
|
|
31
31
|
describe('simple usage', () => {
|
|
32
|
-
const app = new
|
|
32
|
+
const app = new Acryl()
|
|
33
33
|
|
|
34
34
|
app.use('*', csrf())
|
|
35
35
|
app.get('/form', (c) => c.html('<form></form>'))
|
|
@@ -230,7 +230,7 @@ describe('CSRF by Middleware', () => {
|
|
|
230
230
|
|
|
231
231
|
describe('with origin option', () => {
|
|
232
232
|
describe('string', () => {
|
|
233
|
-
const app = new
|
|
233
|
+
const app = new Acryl()
|
|
234
234
|
|
|
235
235
|
app.use(
|
|
236
236
|
'*',
|
|
@@ -259,7 +259,7 @@ describe('CSRF by Middleware', () => {
|
|
|
259
259
|
})
|
|
260
260
|
|
|
261
261
|
describe('string[]', () => {
|
|
262
|
-
const app = new
|
|
262
|
+
const app = new Acryl()
|
|
263
263
|
|
|
264
264
|
app.use(
|
|
265
265
|
'*',
|
|
@@ -294,7 +294,7 @@ describe('CSRF by Middleware', () => {
|
|
|
294
294
|
})
|
|
295
295
|
|
|
296
296
|
describe('IsAllowedOriginHandler', () => {
|
|
297
|
-
const app = new
|
|
297
|
+
const app = new Acryl()
|
|
298
298
|
|
|
299
299
|
app.use(
|
|
300
300
|
'*',
|
|
@@ -336,7 +336,7 @@ describe('CSRF by Middleware', () => {
|
|
|
336
336
|
})
|
|
337
337
|
|
|
338
338
|
describe('async IsAllowedOriginHandler', () => {
|
|
339
|
-
const app = new
|
|
339
|
+
const app = new Acryl()
|
|
340
340
|
|
|
341
341
|
app.use(
|
|
342
342
|
'*',
|
|
@@ -383,7 +383,7 @@ describe('CSRF by Middleware', () => {
|
|
|
383
383
|
|
|
384
384
|
describe('with secFetchSite option', () => {
|
|
385
385
|
describe('string', () => {
|
|
386
|
-
const app = new
|
|
386
|
+
const app = new Acryl()
|
|
387
387
|
app.use('*', csrf({ secFetchSite: 'same-origin' }))
|
|
388
388
|
app.post('/form', simplePostHandler)
|
|
389
389
|
|
|
@@ -413,7 +413,7 @@ describe('CSRF by Middleware', () => {
|
|
|
413
413
|
})
|
|
414
414
|
|
|
415
415
|
describe('string[]', () => {
|
|
416
|
-
const app = new
|
|
416
|
+
const app = new Acryl()
|
|
417
417
|
app.use('*', csrf({ secFetchSite: ['same-origin', 'none'] }))
|
|
418
418
|
app.post('/form', simplePostHandler)
|
|
419
419
|
|
|
@@ -443,7 +443,7 @@ describe('CSRF by Middleware', () => {
|
|
|
443
443
|
})
|
|
444
444
|
|
|
445
445
|
describe('IsAllowedSecFetchSiteHandler', () => {
|
|
446
|
-
const app = new
|
|
446
|
+
const app = new Acryl()
|
|
447
447
|
app.use(
|
|
448
448
|
'*',
|
|
449
449
|
csrf({
|
|
@@ -487,7 +487,7 @@ describe('CSRF by Middleware', () => {
|
|
|
487
487
|
})
|
|
488
488
|
|
|
489
489
|
describe('async IsAllowedSecFetchSiteHandler', () => {
|
|
490
|
-
const app = new
|
|
490
|
+
const app = new Acryl()
|
|
491
491
|
app.use(
|
|
492
492
|
'*',
|
|
493
493
|
csrf({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* CSRF Protection Middleware for
|
|
3
|
+
* CSRF Protection Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { Context } from '../../context.ts'
|
|
@@ -30,7 +30,7 @@ const isRequestedByFormElementRe =
|
|
|
30
30
|
/^\b(application\/x-www-form-urlencoded|multipart\/form-data|text\/plain)\b/i
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
* CSRF Protection Middleware for
|
|
33
|
+
* CSRF Protection Middleware for Acryl.
|
|
34
34
|
*
|
|
35
35
|
* Protects against Cross-Site Request Forgery attacks by validating request origins
|
|
36
36
|
* and sec-fetch-site headers. The request is allowed if either validation passes.
|
|
@@ -53,7 +53,7 @@ const isRequestedByFormElementRe =
|
|
|
53
53
|
*
|
|
54
54
|
* @example
|
|
55
55
|
* ```ts
|
|
56
|
-
* const app = new
|
|
56
|
+
* const app = new Acryl()
|
|
57
57
|
*
|
|
58
58
|
* // Default: both origin and sec-fetch-site validation
|
|
59
59
|
* app.use('*', csrf())
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RETAINED_304_HEADERS, etag } from './index.ts'
|
|
2
|
-
import {
|
|
2
|
+
import { Acryl } from '../../app.ts'
|
|
3
3
|
|
|
4
4
|
const createPatternedBody = (length: number) => {
|
|
5
5
|
const body = new Uint8Array(length)
|
|
@@ -11,25 +11,25 @@ const createPatternedBody = (length: number) => {
|
|
|
11
11
|
|
|
12
12
|
describe('Etag Middleware', () => {
|
|
13
13
|
it('Should return etag header', async () => {
|
|
14
|
-
const app = new
|
|
14
|
+
const app = new Acryl()
|
|
15
15
|
app.use('/etag/*', etag())
|
|
16
16
|
app.get('/etag/abc', (c) => {
|
|
17
|
-
return c.text('
|
|
17
|
+
return c.text('Acryl is hot')
|
|
18
18
|
})
|
|
19
19
|
app.get('/etag/def', (c) => {
|
|
20
|
-
return c.json({ message: '
|
|
20
|
+
return c.json({ message: 'Acryl is hot' })
|
|
21
21
|
})
|
|
22
22
|
let res = await app.request('http://localhost/etag/abc')
|
|
23
23
|
expect(res.headers.get('ETag')).not.toBeFalsy()
|
|
24
|
-
expect(res.headers.get('ETag')).toBe('"
|
|
24
|
+
expect(res.headers.get('ETag')).toBe('"ba73e68ded3fb25dd2a1c90023bada7880da6ab7"')
|
|
25
25
|
|
|
26
26
|
res = await app.request('http://localhost/etag/def')
|
|
27
27
|
expect(res.headers.get('ETag')).not.toBeFalsy()
|
|
28
|
-
expect(res.headers.get('ETag')).toBe('"
|
|
28
|
+
expect(res.headers.get('ETag')).toBe('"13ac584bb97a25fdb954fc1813d2f03f8f5e017c"')
|
|
29
29
|
})
|
|
30
30
|
|
|
31
31
|
it('Should return etag header with another algorithm', async () => {
|
|
32
|
-
const app = new
|
|
32
|
+
const app = new Acryl()
|
|
33
33
|
app.use(
|
|
34
34
|
'/etag/*',
|
|
35
35
|
etag({
|
|
@@ -43,26 +43,26 @@ describe('Etag Middleware', () => {
|
|
|
43
43
|
})
|
|
44
44
|
)
|
|
45
45
|
app.get('/etag/abc', (c) => {
|
|
46
|
-
return c.text('
|
|
46
|
+
return c.text('Acryl is hot')
|
|
47
47
|
})
|
|
48
48
|
app.get('/etag/def', (c) => {
|
|
49
|
-
return c.json({ message: '
|
|
49
|
+
return c.json({ message: 'Acryl is hot' })
|
|
50
50
|
})
|
|
51
51
|
let res = await app.request('http://localhost/etag/abc')
|
|
52
52
|
expect(res.headers.get('ETag')).not.toBeFalsy()
|
|
53
53
|
expect(res.headers.get('ETag')).toBe(
|
|
54
|
-
'"
|
|
54
|
+
'"07c00dd761cfbb8e0765274785818aa0a59629d41cd66034acbde90dafe85cf3"'
|
|
55
55
|
)
|
|
56
56
|
|
|
57
57
|
res = await app.request('http://localhost/etag/def')
|
|
58
58
|
expect(res.headers.get('ETag')).not.toBeFalsy()
|
|
59
59
|
expect(res.headers.get('ETag')).toBe(
|
|
60
|
-
'"
|
|
60
|
+
'"49c6a1aa5026288ec59011aa6b3df0af8efc3d7531af06150dc7f018979efff7"'
|
|
61
61
|
)
|
|
62
62
|
})
|
|
63
63
|
|
|
64
64
|
it('Should return etag header - binary', async () => {
|
|
65
|
-
const app = new
|
|
65
|
+
const app = new Acryl()
|
|
66
66
|
app.use('/etag/*', etag())
|
|
67
67
|
app.get('/etag', async (c) => {
|
|
68
68
|
return c.body(new Uint8Array(1))
|
|
@@ -75,7 +75,7 @@ describe('Etag Middleware', () => {
|
|
|
75
75
|
})
|
|
76
76
|
|
|
77
77
|
it('Should not be the same etag - arrayBuffer', async () => {
|
|
78
|
-
const app = new
|
|
78
|
+
const app = new Acryl()
|
|
79
79
|
app.use('/etag/*', etag())
|
|
80
80
|
app.get('/etag/ab1', (c) => {
|
|
81
81
|
return c.body(new ArrayBuffer(1))
|
|
@@ -91,7 +91,7 @@ describe('Etag Middleware', () => {
|
|
|
91
91
|
})
|
|
92
92
|
|
|
93
93
|
it('Should not be the same etag - Uint8Array', async () => {
|
|
94
|
-
const app = new
|
|
94
|
+
const app = new Acryl()
|
|
95
95
|
app.use('/etag/*', etag())
|
|
96
96
|
app.get('/etag/ui1', (c) => {
|
|
97
97
|
return c.body(new Uint8Array([1, 2, 3]))
|
|
@@ -107,7 +107,7 @@ describe('Etag Middleware', () => {
|
|
|
107
107
|
})
|
|
108
108
|
|
|
109
109
|
it('Should not be the same etag - ReadableStream', async () => {
|
|
110
|
-
const app = new
|
|
110
|
+
const app = new Acryl()
|
|
111
111
|
app.use('/etag/*', etag())
|
|
112
112
|
app.get('/etag/rs1', (c) => {
|
|
113
113
|
return c.body(
|
|
@@ -139,7 +139,7 @@ describe('Etag Middleware', () => {
|
|
|
139
139
|
})
|
|
140
140
|
|
|
141
141
|
it('Should return the same etag regardless of ReadableStream chunk boundaries', async () => {
|
|
142
|
-
const app = new
|
|
142
|
+
const app = new Acryl()
|
|
143
143
|
app.use('/etag/*', etag())
|
|
144
144
|
const body = createPatternedBody(1_000_000)
|
|
145
145
|
app.get('/etag/rs1', (c) => {
|
|
@@ -173,7 +173,7 @@ describe('Etag Middleware', () => {
|
|
|
173
173
|
})
|
|
174
174
|
|
|
175
175
|
it('Should preserve the SHA-1 digest for bodies up to 256 KiB', async () => {
|
|
176
|
-
const app = new
|
|
176
|
+
const app = new Acryl()
|
|
177
177
|
app.use('/etag/*', etag())
|
|
178
178
|
app.get('/etag', (c) => c.body(createPatternedBody(256 * 1024)))
|
|
179
179
|
|
|
@@ -182,7 +182,7 @@ describe('Etag Middleware', () => {
|
|
|
182
182
|
})
|
|
183
183
|
|
|
184
184
|
it('Should not return etag header when the stream is empty', async () => {
|
|
185
|
-
const app = new
|
|
185
|
+
const app = new Acryl()
|
|
186
186
|
app.use('/etag/*', etag())
|
|
187
187
|
app.get('/etag/abc', (c) => {
|
|
188
188
|
const stream = new ReadableStream({
|
|
@@ -198,7 +198,7 @@ describe('Etag Middleware', () => {
|
|
|
198
198
|
})
|
|
199
199
|
|
|
200
200
|
it('Should not return etag header when body is null', async () => {
|
|
201
|
-
const app = new
|
|
201
|
+
const app = new Acryl()
|
|
202
202
|
app.use('/etag/*', etag())
|
|
203
203
|
app.get('/etag/abc', () => new Response(null, { status: 500 }))
|
|
204
204
|
const res = await app.request('http://localhost/etag/abc')
|
|
@@ -207,22 +207,22 @@ describe('Etag Middleware', () => {
|
|
|
207
207
|
})
|
|
208
208
|
|
|
209
209
|
it('Should return etag header - weak', async () => {
|
|
210
|
-
const app = new
|
|
210
|
+
const app = new Acryl()
|
|
211
211
|
app.use('/etag/*', etag({ weak: true }))
|
|
212
212
|
app.get('/etag/abc', (c) => {
|
|
213
|
-
return c.text('
|
|
213
|
+
return c.text('Acryl is hot')
|
|
214
214
|
})
|
|
215
215
|
|
|
216
216
|
const res = await app.request('http://localhost/etag/abc')
|
|
217
217
|
expect(res.headers.get('ETag')).not.toBeFalsy()
|
|
218
|
-
expect(res.headers.get('ETag')).toBe('W/"
|
|
218
|
+
expect(res.headers.get('ETag')).toBe('W/"ba73e68ded3fb25dd2a1c90023bada7880da6ab7"')
|
|
219
219
|
})
|
|
220
220
|
|
|
221
221
|
it('Should handle conditional GETs', async () => {
|
|
222
|
-
const app = new
|
|
222
|
+
const app = new Acryl()
|
|
223
223
|
app.use('/etag/*', etag())
|
|
224
224
|
app.get('/etag/ghi', (c) =>
|
|
225
|
-
c.text('
|
|
225
|
+
c.text('Acryl is great', 200, {
|
|
226
226
|
'cache-control': 'public, max-age=120',
|
|
227
227
|
date: 'Mon, Feb 27 2023 12:08:36 GMT',
|
|
228
228
|
expires: 'Mon, Feb 27 2023 12:10:36 GMT',
|
|
@@ -286,9 +286,9 @@ describe('Etag Middleware', () => {
|
|
|
286
286
|
})
|
|
287
287
|
|
|
288
288
|
it('Should handle conditional QUERY requests', async () => {
|
|
289
|
-
const app = new
|
|
289
|
+
const app = new Acryl()
|
|
290
290
|
app.use('/etag/*', etag())
|
|
291
|
-
app.on('QUERY', '/etag/query', (c) => c.text('
|
|
291
|
+
app.on('QUERY', '/etag/query', (c) => c.text('Acryl is great'))
|
|
292
292
|
|
|
293
293
|
// unconditional QUERY
|
|
294
294
|
let res = await app.request('http://localhost/etag/query', {
|
|
@@ -333,7 +333,7 @@ describe('Etag Middleware', () => {
|
|
|
333
333
|
})
|
|
334
334
|
|
|
335
335
|
it('Should not return 304 on unsafe methods or error responses', async () => {
|
|
336
|
-
const app = new
|
|
336
|
+
const app = new Acryl()
|
|
337
337
|
app.use('/etag/*', etag())
|
|
338
338
|
app.put('/etag/put', (c) => c.text('created', 201, { ETag: '"etag-123"' }))
|
|
339
339
|
app.get('/etag/not-found', (c) => c.text('not found', 404, { ETag: '"etag-123"' }))
|
|
@@ -374,18 +374,18 @@ describe('Etag Middleware', () => {
|
|
|
374
374
|
})
|
|
375
375
|
|
|
376
376
|
it('Should not return duplicate etag header values', async () => {
|
|
377
|
-
const app = new
|
|
377
|
+
const app = new Acryl()
|
|
378
378
|
app.use('/etag/*', etag())
|
|
379
379
|
app.use('/etag/*', etag())
|
|
380
|
-
app.get('/etag/abc', (c) => c.text('
|
|
380
|
+
app.get('/etag/abc', (c) => c.text('Acryl is hot'))
|
|
381
381
|
|
|
382
382
|
const res = await app.request('http://localhost/etag/abc')
|
|
383
383
|
expect(res.headers.get('ETag')).not.toBeFalsy()
|
|
384
|
-
expect(res.headers.get('ETag')).toBe('"
|
|
384
|
+
expect(res.headers.get('ETag')).toBe('"ba73e68ded3fb25dd2a1c90023bada7880da6ab7"')
|
|
385
385
|
})
|
|
386
386
|
|
|
387
387
|
it('Should not override ETag headers from upstream', async () => {
|
|
388
|
-
const app = new
|
|
388
|
+
const app = new Acryl()
|
|
389
389
|
app.use('/etag/*', etag())
|
|
390
390
|
app.get('/etag/predefined', (c) =>
|
|
391
391
|
c.text('This response has an ETag', 200, { ETag: '"f-0194-d"' })
|
|
@@ -398,7 +398,7 @@ describe('Etag Middleware', () => {
|
|
|
398
398
|
it('Should retain the default and the specified headers', async () => {
|
|
399
399
|
const cacheControl = 'public, max-age=120'
|
|
400
400
|
const message = 'Hello!'
|
|
401
|
-
const app = new
|
|
401
|
+
const app = new Acryl()
|
|
402
402
|
app.use(
|
|
403
403
|
'/etag/*',
|
|
404
404
|
etag({
|
|
@@ -406,7 +406,7 @@ describe('Etag Middleware', () => {
|
|
|
406
406
|
})
|
|
407
407
|
)
|
|
408
408
|
app.get('/etag', (c) => {
|
|
409
|
-
return c.text('
|
|
409
|
+
return c.text('Acryl is hot', 200, {
|
|
410
410
|
'cache-control': cacheControl,
|
|
411
411
|
'x-message-retain': message,
|
|
412
412
|
'X-Message-Retain-Upper': message,
|
|
@@ -415,12 +415,12 @@ describe('Etag Middleware', () => {
|
|
|
415
415
|
})
|
|
416
416
|
const res = await app.request('/etag', {
|
|
417
417
|
headers: {
|
|
418
|
-
'If-None-Match': '"
|
|
418
|
+
'If-None-Match': '"ba73e68ded3fb25dd2a1c90023bada7880da6ab7"',
|
|
419
419
|
},
|
|
420
420
|
})
|
|
421
421
|
expect(res.status).toBe(304)
|
|
422
422
|
expect(res.headers.get('ETag')).not.toBeFalsy()
|
|
423
|
-
expect(res.headers.get('ETag')).toBe('"
|
|
423
|
+
expect(res.headers.get('ETag')).toBe('"ba73e68ded3fb25dd2a1c90023bada7880da6ab7"')
|
|
424
424
|
expect(res.headers.get('Cache-Control')).toBe(cacheControl)
|
|
425
425
|
expect(res.headers.get('x-message-retain')).toBe(message)
|
|
426
426
|
expect(res.headers.get('X-Message-Retain-Upper')).toBe(message)
|
|
@@ -428,10 +428,10 @@ describe('Etag Middleware', () => {
|
|
|
428
428
|
})
|
|
429
429
|
|
|
430
430
|
it('Should return 304 when weak ETag in If-None-Match matches the generated ETag', async () => {
|
|
431
|
-
const app = new
|
|
431
|
+
const app = new Acryl()
|
|
432
432
|
app.use('/etag/*', etag())
|
|
433
433
|
app.get('/etag/abc', (c) => {
|
|
434
|
-
return c.text('
|
|
434
|
+
return c.text('Acryl is hot')
|
|
435
435
|
})
|
|
436
436
|
let res = await app.request('http://localhost/etag/abc')
|
|
437
437
|
const headerEtag = res.headers.get('ETag')!
|
|
@@ -440,7 +440,7 @@ describe('Etag Middleware', () => {
|
|
|
440
440
|
|
|
441
441
|
res = await app.request('http://localhost/etag/abc', {
|
|
442
442
|
headers: {
|
|
443
|
-
'If-None-Match': 'W/"
|
|
443
|
+
'If-None-Match': 'W/"ba73e68ded3fb25dd2a1c90023bada7880da6ab7"',
|
|
444
444
|
},
|
|
445
445
|
})
|
|
446
446
|
|
|
@@ -463,9 +463,9 @@ describe('Etag Middleware', () => {
|
|
|
463
463
|
})
|
|
464
464
|
|
|
465
465
|
it('Should not generate etag', async () => {
|
|
466
|
-
const app = new
|
|
466
|
+
const app = new Acryl()
|
|
467
467
|
app.use('/etag/*', etag())
|
|
468
|
-
app.get('/etag/no-digest', (c) => c.text('
|
|
468
|
+
app.get('/etag/no-digest', (c) => c.text('Acryl is hot'))
|
|
469
469
|
const res = await app.request('/etag/no-digest')
|
|
470
470
|
expect(res.status).toBe(200)
|
|
471
471
|
expect(res.headers.get('ETag')).toBeNull()
|
|
@@ -473,7 +473,7 @@ describe('Etag Middleware', () => {
|
|
|
473
473
|
})
|
|
474
474
|
|
|
475
475
|
it('Should remove all non-retained headers on 304 without skipping any', async () => {
|
|
476
|
-
const app = new
|
|
476
|
+
const app = new Acryl()
|
|
477
477
|
app.use('/etag/*', etag())
|
|
478
478
|
app.get('/etag/multi-headers', (c) => {
|
|
479
479
|
c.header('X-Custom-1', 'val1')
|
|
@@ -481,7 +481,7 @@ describe('Etag Middleware', () => {
|
|
|
481
481
|
c.header('X-Custom-3', 'val3')
|
|
482
482
|
c.header('X-Custom-4', 'val4')
|
|
483
483
|
c.header('Cache-Control', 'max-age=3600')
|
|
484
|
-
return c.text('
|
|
484
|
+
return c.text('Acryl is hot')
|
|
485
485
|
})
|
|
486
486
|
const res1 = await app.request('http://localhost/etag/multi-headers')
|
|
487
487
|
const etagHeader = res1.headers.get('ETag')!
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* ETag Middleware for
|
|
3
|
+
* ETag Middleware for Acryl.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { MiddlewareHandler } from '../../types.ts'
|
|
@@ -55,7 +55,7 @@ function initializeGenerator(
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
|
-
* ETag Middleware for
|
|
58
|
+
* ETag Middleware for Acryl.
|
|
59
59
|
*
|
|
60
60
|
*
|
|
61
61
|
* @param {ETagOptions} [options] - The options for the ETag middleware.
|
|
@@ -68,11 +68,11 @@ function initializeGenerator(
|
|
|
68
68
|
*
|
|
69
69
|
* @example
|
|
70
70
|
* ```ts
|
|
71
|
-
* const app = new
|
|
71
|
+
* const app = new Acryl()
|
|
72
72
|
*
|
|
73
73
|
* app.use('/etag/*', etag())
|
|
74
74
|
* app.get('/etag/abc', (c) => {
|
|
75
|
-
* return c.text('
|
|
75
|
+
* return c.text('Acryl is hot')
|
|
76
76
|
* })
|
|
77
77
|
* ```
|
|
78
78
|
*/
|
|
@@ -2,7 +2,7 @@ import { ipRestriction } from './index.ts'
|
|
|
2
2
|
import type { IPRestrictionRule } from './index.ts'
|
|
3
3
|
import { Context } from '../../context.ts'
|
|
4
4
|
import type { AddressType, GetConnInfo } from '../../helper/conninfo/index.ts'
|
|
5
|
-
import {
|
|
5
|
+
import { Acryl } from '../../app.ts'
|
|
6
6
|
|
|
7
7
|
describe('ipRestriction middleware', () => {
|
|
8
8
|
it('Should restrict', async () => {
|
|
@@ -13,7 +13,7 @@ describe('ipRestriction middleware', () => {
|
|
|
13
13
|
},
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
const app = new
|
|
16
|
+
const app = new Acryl<{
|
|
17
17
|
Bindings: {
|
|
18
18
|
ip: string
|
|
19
19
|
}
|
|
@@ -64,7 +64,7 @@ describe('ipRestriction middleware', () => {
|
|
|
64
64
|
test.each(['999.999.999.999', '2001:db8::1%eth0', '1234:::5678'])(
|
|
65
65
|
'Should reject invalid remote address: %s',
|
|
66
66
|
async (ip) => {
|
|
67
|
-
const app = new
|
|
67
|
+
const app = new Acryl<{
|
|
68
68
|
Bindings: {
|
|
69
69
|
ip: string
|
|
70
70
|
}
|
|
@@ -89,7 +89,7 @@ describe('ipRestriction middleware', () => {
|
|
|
89
89
|
)
|
|
90
90
|
|
|
91
91
|
it('Should not call onError for invalid remote addresses', async () => {
|
|
92
|
-
const app = new
|
|
92
|
+
const app = new Acryl<{
|
|
93
93
|
Bindings: {
|
|
94
94
|
ip: string
|
|
95
95
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* IP Restriction Middleware for
|
|
2
|
+
* IP Restriction Middleware for Acryl
|
|
3
3
|
* @module
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -175,7 +175,7 @@ export interface IPRestrictionRules {
|
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
/**
|
|
178
|
-
* IP Restriction Middleware for
|
|
178
|
+
* IP Restriction Middleware for Acryl.
|
|
179
179
|
*
|
|
180
180
|
*
|
|
181
181
|
* @param {GetConnInfo | ((c: Context) => string)} getIP - A function to retrieve the client IP address. Use `getConnInfo` from the appropriate runtime adapter.
|
|
@@ -185,11 +185,11 @@ export interface IPRestrictionRules {
|
|
|
185
185
|
*
|
|
186
186
|
* @example
|
|
187
187
|
* ```ts
|
|
188
|
-
* import {
|
|
189
|
-
* import { ipRestriction } from '
|
|
190
|
-
* import { getConnInfo } from '
|
|
188
|
+
* import { Acryl } from 'acrylblends'
|
|
189
|
+
* import { ipRestriction } from 'acrylblends/ip-restriction'
|
|
190
|
+
* import { getConnInfo } from 'acrylblends/cloudflare-workers'
|
|
191
191
|
*
|
|
192
|
-
* const app = new
|
|
192
|
+
* const app = new Acryl()
|
|
193
193
|
*
|
|
194
194
|
* app.use(
|
|
195
195
|
* '*',
|