acrylblends 0.4.0 → 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/dist/index.js +56 -2
- package/dist/index.js.map +1 -1
- package/docs/framework/LICENSE +23 -0
- package/docs/framework/README.md +63 -0
- package/docs/framework/UPSTREAM.md +3 -0
- 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 +140 -0
- 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/cordis/acryl-in-a-cordis-app.md +146 -0
- package/docs/framework/cordis/concepts.md +105 -0
- package/docs/framework/cordis/middleware.md +8 -0
- package/docs/framework/cordis/migration-from-0-3.md +111 -0
- package/docs/framework/cordis/migration-from-0-4.md +14 -0
- package/docs/framework/cordis/migration-from-dsh-webserver.md +103 -0
- package/docs/framework/cordis/mounting.md +85 -0
- package/docs/framework/cordis/node-server.md +75 -0
- package/docs/framework/cordis/plugin-lifecycle.md +111 -0
- package/docs/framework/cordis/surfaces.md +71 -0
- package/docs/framework/cordis/transport-and-cancellation.md +57 -0
- package/docs/framework/cordis/validation.md +135 -0
- 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 +9 -0
- 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 +315 -15
- package/plugins/acryl-inspect/src/report.ts +15 -10
- package/plugins/acryl-inspect/src/service.ts +2 -2
- package/plugins/acryl-inspect/tests/report.spec.ts +9 -3
- 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/middleware/index.ts +1 -1
- package/plugins/acryl-router/src/middleware/loopback-only.ts +34 -1
- package/plugins/acryl-router/src/service.ts +19 -13
- 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 +80 -0
- 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 +39 -22
- 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 +3 -3
- package/plugins/extensions/index.ts +4 -3
- package/plugins/extensions/resolve.ts +70 -10
- package/plugins/openai/prompt.ts +7 -7
- package/shared/AGENTS.core.md +61 -0
- package/templates/agent/AGENTS.md +6 -0
- package/templates/agent/README.md +2 -2
- package/templates/agent/blend.yaml +1 -1
- 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/AGENTS.md +5 -0
- package/templates/blank/README.md +1 -1
- package/templates/blank/src/routes.ts +2 -2
- package/templates/todo/AGENTS.md +5 -0
- package/templates/todo/src/todo.ts +6 -4
- package/templates/todo/upstream.json +2 -2
package/lib/timing.d.ts
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { I as MiddlewareHandler, t as Context } from "./context-Bm7rI-oK.js";
|
|
2
|
+
|
|
3
|
+
//#region ../../plugins/acryl-router/src/core/middleware/timing/timing.d.ts
|
|
4
|
+
type TimingVariables = {
|
|
5
|
+
metric?: {
|
|
6
|
+
headers: string[];
|
|
7
|
+
timers: Map<string, Timer>;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
interface Timer {
|
|
11
|
+
description?: string;
|
|
12
|
+
start: number;
|
|
13
|
+
}
|
|
14
|
+
interface TimingOptions {
|
|
15
|
+
total?: boolean;
|
|
16
|
+
enabled?: boolean | ((c: Context) => boolean);
|
|
17
|
+
totalDescription?: string;
|
|
18
|
+
autoEnd?: boolean;
|
|
19
|
+
crossOrigin?: boolean | string | ((c: Context) => boolean | string);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Server-Timing Middleware for Acryl.
|
|
23
|
+
*
|
|
24
|
+
*
|
|
25
|
+
* @param {TimingOptions} [config] - The options for the timing middleware.
|
|
26
|
+
* @param {boolean} [config.total=true] - Show the total response time.
|
|
27
|
+
* @param {boolean | ((c: Context) => boolean)} [config.enabled=true] - Whether timings should be added to the headers or not.
|
|
28
|
+
* @param {string} [config.totalDescription=Total Response Time] - Description for the total response time.
|
|
29
|
+
* @param {boolean} [config.autoEnd=true] - If `startTime()` should end automatically at the end of the request.
|
|
30
|
+
* @param {boolean | string | ((c: Context) => boolean | string)} [config.crossOrigin=false] - The origin this timings header should be readable.
|
|
31
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const app = new Acryl()
|
|
36
|
+
*
|
|
37
|
+
* // add the middleware to your router
|
|
38
|
+
* app.use(timing());
|
|
39
|
+
*
|
|
40
|
+
* app.get('/', async (c) => {
|
|
41
|
+
* // add custom metrics
|
|
42
|
+
* setMetric(c, 'region', 'europe-west3')
|
|
43
|
+
*
|
|
44
|
+
* // add custom metrics with timing, must be in milliseconds
|
|
45
|
+
* setMetric(c, 'custom', 23.8, 'My custom Metric')
|
|
46
|
+
*
|
|
47
|
+
* // start a new timer
|
|
48
|
+
* startTime(c, 'db');
|
|
49
|
+
*
|
|
50
|
+
* const data = await db.findMany(...);
|
|
51
|
+
*
|
|
52
|
+
* // end the timer
|
|
53
|
+
* endTime(c, 'db');
|
|
54
|
+
*
|
|
55
|
+
* return c.json({ response: data });
|
|
56
|
+
* });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
declare const timing: (config?: TimingOptions) => MiddlewareHandler;
|
|
60
|
+
interface SetMetric {
|
|
61
|
+
(c: Context, name: string, value: number, description?: string, precision?: number): void;
|
|
62
|
+
(c: Context, name: string, description?: string): void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Set a metric for the timing middleware.
|
|
66
|
+
*
|
|
67
|
+
* @param {Context} c - The context of the request.
|
|
68
|
+
* @param {string} name - The name of the metric.
|
|
69
|
+
* @param {number | string} [valueDescription] - The value or description of the metric.
|
|
70
|
+
* @param {string} [description] - The description of the metric.
|
|
71
|
+
* @param {number} [precision] - The precision of the metric value.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* setMetric(c, 'region', 'europe-west3')
|
|
76
|
+
* setMetric(c, 'custom', 23.8, 'My custom Metric')
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
declare const setMetric: SetMetric;
|
|
80
|
+
/**
|
|
81
|
+
* Start a timer for the timing middleware.
|
|
82
|
+
*
|
|
83
|
+
* @param {Context} c - The context of the request.
|
|
84
|
+
* @param {string} name - The name of the timer.
|
|
85
|
+
* @param {string} [description] - The description of the timer.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* startTime(c, 'db')
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
declare const startTime: (c: Context, name: string, description?: string) => void;
|
|
93
|
+
/**
|
|
94
|
+
* End a timer for the timing middleware.
|
|
95
|
+
*
|
|
96
|
+
* @param {Context} c - The context of the request.
|
|
97
|
+
* @param {string} name - The name of the timer.
|
|
98
|
+
* @param {number} [precision] - The precision of the timer value.
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* endTime(c, 'db')
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
declare const endTime: (c: Context, name: string, precision?: number) => void;
|
|
106
|
+
/**
|
|
107
|
+
* Wrap a Promise to capture its duration.
|
|
108
|
+
* @param {Context} c - The context of the request.
|
|
109
|
+
* @param {string} name - The name of the timer.
|
|
110
|
+
* @param {Promise<T>} callable - The Promise to time.
|
|
111
|
+
* @param {string} [description] - The description of the timer.
|
|
112
|
+
* @param {number} [precision] - The precision of the timer value.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* // Instead of this:
|
|
117
|
+
* const data = await db.findMany(...);
|
|
118
|
+
*
|
|
119
|
+
* // do this:
|
|
120
|
+
* const data = await wrapTime(c, 'query', db.findMany(...));
|
|
121
|
+
* ```
|
|
122
|
+
* */
|
|
123
|
+
declare function wrapTime<T>(c: Context, name: string, callable: Promise<T>, description?: string, precision?: number): Promise<T>;
|
|
124
|
+
//#endregion
|
|
125
|
+
//#region ../../plugins/acryl-router/src/core/middleware/timing/index.d.ts
|
|
126
|
+
declare module '../../context.ts' {
|
|
127
|
+
interface ContextVariableMap extends TimingVariables {}
|
|
128
|
+
}
|
|
129
|
+
//#endregion
|
|
130
|
+
export { type TimingVariables, endTime, setMetric, startTime, timing, wrapTime };
|
package/lib/timing.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
//#region ../../plugins/acryl-router/src/core/middleware/timing/timing.ts
|
|
2
|
+
const getTime = () => {
|
|
3
|
+
try {
|
|
4
|
+
return performance.now();
|
|
5
|
+
} catch {}
|
|
6
|
+
return Date.now();
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Server-Timing Middleware for Acryl.
|
|
10
|
+
*
|
|
11
|
+
*
|
|
12
|
+
* @param {TimingOptions} [config] - The options for the timing middleware.
|
|
13
|
+
* @param {boolean} [config.total=true] - Show the total response time.
|
|
14
|
+
* @param {boolean | ((c: Context) => boolean)} [config.enabled=true] - Whether timings should be added to the headers or not.
|
|
15
|
+
* @param {string} [config.totalDescription=Total Response Time] - Description for the total response time.
|
|
16
|
+
* @param {boolean} [config.autoEnd=true] - If `startTime()` should end automatically at the end of the request.
|
|
17
|
+
* @param {boolean | string | ((c: Context) => boolean | string)} [config.crossOrigin=false] - The origin this timings header should be readable.
|
|
18
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const app = new Acryl()
|
|
23
|
+
*
|
|
24
|
+
* // add the middleware to your router
|
|
25
|
+
* app.use(timing());
|
|
26
|
+
*
|
|
27
|
+
* app.get('/', async (c) => {
|
|
28
|
+
* // add custom metrics
|
|
29
|
+
* setMetric(c, 'region', 'europe-west3')
|
|
30
|
+
*
|
|
31
|
+
* // add custom metrics with timing, must be in milliseconds
|
|
32
|
+
* setMetric(c, 'custom', 23.8, 'My custom Metric')
|
|
33
|
+
*
|
|
34
|
+
* // start a new timer
|
|
35
|
+
* startTime(c, 'db');
|
|
36
|
+
*
|
|
37
|
+
* const data = await db.findMany(...);
|
|
38
|
+
*
|
|
39
|
+
* // end the timer
|
|
40
|
+
* endTime(c, 'db');
|
|
41
|
+
*
|
|
42
|
+
* return c.json({ response: data });
|
|
43
|
+
* });
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
const timing = (config) => {
|
|
47
|
+
const options = {
|
|
48
|
+
total: true,
|
|
49
|
+
enabled: true,
|
|
50
|
+
totalDescription: "Total Response Time",
|
|
51
|
+
autoEnd: true,
|
|
52
|
+
crossOrigin: false,
|
|
53
|
+
...config
|
|
54
|
+
};
|
|
55
|
+
return async function timing(c, next) {
|
|
56
|
+
const headers = [];
|
|
57
|
+
const timers = /* @__PURE__ */ new Map();
|
|
58
|
+
if (c.get("metric")) return await next();
|
|
59
|
+
c.set("metric", {
|
|
60
|
+
headers,
|
|
61
|
+
timers
|
|
62
|
+
});
|
|
63
|
+
if (options.total) startTime(c, "total", options.totalDescription);
|
|
64
|
+
await next();
|
|
65
|
+
if (options.total) endTime(c, "total");
|
|
66
|
+
if (options.autoEnd) timers.forEach((_, key) => {
|
|
67
|
+
endTime(c, key);
|
|
68
|
+
});
|
|
69
|
+
if (typeof options.enabled === "function" ? options.enabled(c) : options.enabled) {
|
|
70
|
+
c.res.headers.append("Server-Timing", headers.join(","));
|
|
71
|
+
const crossOrigin = typeof options.crossOrigin === "function" ? options.crossOrigin(c) : options.crossOrigin;
|
|
72
|
+
if (crossOrigin) c.res.headers.append("Timing-Allow-Origin", typeof crossOrigin === "string" ? crossOrigin : "*");
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Set a metric for the timing middleware.
|
|
78
|
+
*
|
|
79
|
+
* @param {Context} c - The context of the request.
|
|
80
|
+
* @param {string} name - The name of the metric.
|
|
81
|
+
* @param {number | string} [valueDescription] - The value or description of the metric.
|
|
82
|
+
* @param {string} [description] - The description of the metric.
|
|
83
|
+
* @param {number} [precision] - The precision of the metric value.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* setMetric(c, 'region', 'europe-west3')
|
|
88
|
+
* setMetric(c, 'custom', 23.8, 'My custom Metric')
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
const setMetric = (c, name, valueDescription, description, precision) => {
|
|
92
|
+
const metrics = c.get("metric");
|
|
93
|
+
if (!metrics) {
|
|
94
|
+
console.warn("Metrics not initialized! Please add the `timing()` middleware to this route!");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (typeof valueDescription === "number") {
|
|
98
|
+
const dur = valueDescription.toFixed(precision || 1);
|
|
99
|
+
const metric = description ? `${name};dur=${dur};desc="${description}"` : `${name};dur=${dur}`;
|
|
100
|
+
metrics.headers.push(metric);
|
|
101
|
+
} else {
|
|
102
|
+
const metric = valueDescription ? `${name};desc="${valueDescription}"` : `${name}`;
|
|
103
|
+
metrics.headers.push(metric);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Start a timer for the timing middleware.
|
|
108
|
+
*
|
|
109
|
+
* @param {Context} c - The context of the request.
|
|
110
|
+
* @param {string} name - The name of the timer.
|
|
111
|
+
* @param {string} [description] - The description of the timer.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* startTime(c, 'db')
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
const startTime = (c, name, description) => {
|
|
119
|
+
const metrics = c.get("metric");
|
|
120
|
+
if (!metrics) {
|
|
121
|
+
console.warn("Metrics not initialized! Please add the `timing()` middleware to this route!");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
metrics.timers.set(name, {
|
|
125
|
+
description,
|
|
126
|
+
start: getTime()
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* End a timer for the timing middleware.
|
|
131
|
+
*
|
|
132
|
+
* @param {Context} c - The context of the request.
|
|
133
|
+
* @param {string} name - The name of the timer.
|
|
134
|
+
* @param {number} [precision] - The precision of the timer value.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```ts
|
|
138
|
+
* endTime(c, 'db')
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
const endTime = (c, name, precision) => {
|
|
142
|
+
const metrics = c.get("metric");
|
|
143
|
+
if (!metrics) {
|
|
144
|
+
console.warn("Metrics not initialized! Please add the `timing()` middleware to this route!");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const timer = metrics.timers.get(name);
|
|
148
|
+
if (!timer) {
|
|
149
|
+
console.warn(`Timer "${name}" does not exist!`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const { description, start } = timer;
|
|
153
|
+
const duration = getTime() - start;
|
|
154
|
+
setMetric(c, name, duration, description, precision);
|
|
155
|
+
metrics.timers.delete(name);
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Wrap a Promise to capture its duration.
|
|
159
|
+
* @param {Context} c - The context of the request.
|
|
160
|
+
* @param {string} name - The name of the timer.
|
|
161
|
+
* @param {Promise<T>} callable - The Promise to time.
|
|
162
|
+
* @param {string} [description] - The description of the timer.
|
|
163
|
+
* @param {number} [precision] - The precision of the timer value.
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```ts
|
|
167
|
+
* // Instead of this:
|
|
168
|
+
* const data = await db.findMany(...);
|
|
169
|
+
*
|
|
170
|
+
* // do this:
|
|
171
|
+
* const data = await wrapTime(c, 'query', db.findMany(...));
|
|
172
|
+
* ```
|
|
173
|
+
* */
|
|
174
|
+
async function wrapTime(c, name, callable, description, precision) {
|
|
175
|
+
startTime(c, name, description);
|
|
176
|
+
try {
|
|
177
|
+
return await callable;
|
|
178
|
+
} finally {
|
|
179
|
+
endTime(c, name, precision);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//#endregion
|
|
183
|
+
export { endTime, setMetric, startTime, timing, wrapTime };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { I as MiddlewareHandler } from "./context-Bm7rI-oK.js";
|
|
2
|
+
|
|
3
|
+
//#region ../../plugins/acryl-router/src/core/middleware/trailing-slash/index.d.ts
|
|
4
|
+
type TrimTrailingSlashOptions = {
|
|
5
|
+
/**
|
|
6
|
+
* If `true`, the middleware will always redirect requests with a trailing slash
|
|
7
|
+
* before executing handlers.
|
|
8
|
+
* This is useful for routes with wildcards (`*`).
|
|
9
|
+
* If `false` (default), it will only redirect when the route is not found (404).
|
|
10
|
+
* @default false
|
|
11
|
+
*/
|
|
12
|
+
alwaysRedirect?: boolean;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Trailing Slash Middleware for Acryl.
|
|
16
|
+
*
|
|
17
|
+
*
|
|
18
|
+
* @param {TrimTrailingSlashOptions} options - The options for the middleware.
|
|
19
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const app = new Acryl()
|
|
24
|
+
*
|
|
25
|
+
* app.use(trimTrailingSlash())
|
|
26
|
+
* app.get('/about/me/', (c) => c.text('With Trailing Slash'))
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* // With alwaysRedirect option for wildcard routes
|
|
32
|
+
* const app = new Acryl()
|
|
33
|
+
*
|
|
34
|
+
* app.use(trimTrailingSlash({ alwaysRedirect: true }))
|
|
35
|
+
* app.get('/my-path/*', (c) => c.text('Wildcard route'))
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
declare const trimTrailingSlash: (options?: TrimTrailingSlashOptions) => MiddlewareHandler;
|
|
39
|
+
type AppendTrailingSlashOptions = {
|
|
40
|
+
/**
|
|
41
|
+
* If `true`, the middleware will always redirect requests without a trailing slash
|
|
42
|
+
* before executing handlers.
|
|
43
|
+
* This is useful for routes with wildcards (`*`).
|
|
44
|
+
* If `false` (default), it will only redirect when the route is not found (404).
|
|
45
|
+
* @default false
|
|
46
|
+
*/
|
|
47
|
+
alwaysRedirect?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* A function that determines whether to skip the redirect for a given path.
|
|
50
|
+
* If the function returns `true`, the redirect will be skipped.
|
|
51
|
+
* @param path - The request path
|
|
52
|
+
* @returns `true` to skip the redirect
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* // Skip redirect for paths with file extensions
|
|
57
|
+
* app.use(appendTrailingSlash({
|
|
58
|
+
* alwaysRedirect: true,
|
|
59
|
+
* skip: (path) => /\.\w+$/.test(path),
|
|
60
|
+
* }))
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
skip?: (path: string) => boolean;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Append trailing slash middleware for Acryl.
|
|
67
|
+
* Append a trailing slash to the URL if it doesn't have one. For example, `/path/to/page` will be redirected to `/path/to/page/`.
|
|
68
|
+
*
|
|
69
|
+
*
|
|
70
|
+
* @param {AppendTrailingSlashOptions} options - The options for the middleware.
|
|
71
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* const app = new Acryl()
|
|
76
|
+
*
|
|
77
|
+
* app.use(appendTrailingSlash())
|
|
78
|
+
* ```
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```ts
|
|
82
|
+
* // With alwaysRedirect option for wildcard routes
|
|
83
|
+
* const app = new Acryl()
|
|
84
|
+
*
|
|
85
|
+
* app.use(appendTrailingSlash({ alwaysRedirect: true }))
|
|
86
|
+
* app.get('/my-path/*', (c) => c.text('Wildcard route'))
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
declare const appendTrailingSlash: (options?: AppendTrailingSlashOptions) => MiddlewareHandler;
|
|
90
|
+
//#endregion
|
|
91
|
+
export { appendTrailingSlash, trimTrailingSlash };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
//#region ../../plugins/acryl-router/src/core/middleware/trailing-slash/index.ts
|
|
2
|
+
/**
|
|
3
|
+
* Trailing Slash Middleware for Acryl.
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* @param {TrimTrailingSlashOptions} options - The options for the middleware.
|
|
7
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const app = new Acryl()
|
|
12
|
+
*
|
|
13
|
+
* app.use(trimTrailingSlash())
|
|
14
|
+
* app.get('/about/me/', (c) => c.text('With Trailing Slash'))
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* // With alwaysRedirect option for wildcard routes
|
|
20
|
+
* const app = new Acryl()
|
|
21
|
+
*
|
|
22
|
+
* app.use(trimTrailingSlash({ alwaysRedirect: true }))
|
|
23
|
+
* app.get('/my-path/*', (c) => c.text('Wildcard route'))
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
const trimTrailingSlash = (options) => {
|
|
27
|
+
return async function trimTrailingSlash(c, next) {
|
|
28
|
+
if (options?.alwaysRedirect) {
|
|
29
|
+
if ((c.req.method === "GET" || c.req.method === "HEAD") && c.req.path !== "/" && c.req.path.at(-1) === "/") {
|
|
30
|
+
const url = new URL(c.req.url);
|
|
31
|
+
url.pathname = url.pathname.substring(0, url.pathname.length - 1);
|
|
32
|
+
return c.redirect(url.toString(), 301);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
await next();
|
|
36
|
+
if (!options?.alwaysRedirect && c.res.status === 404 && (c.req.method === "GET" || c.req.method === "HEAD") && c.req.path !== "/" && c.req.path.at(-1) === "/") {
|
|
37
|
+
const url = new URL(c.req.url);
|
|
38
|
+
url.pathname = url.pathname.substring(0, url.pathname.length - 1);
|
|
39
|
+
c.res = c.redirect(url.toString(), 301);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Append trailing slash middleware for Acryl.
|
|
45
|
+
* Append a trailing slash to the URL if it doesn't have one. For example, `/path/to/page` will be redirected to `/path/to/page/`.
|
|
46
|
+
*
|
|
47
|
+
*
|
|
48
|
+
* @param {AppendTrailingSlashOptions} options - The options for the middleware.
|
|
49
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const app = new Acryl()
|
|
54
|
+
*
|
|
55
|
+
* app.use(appendTrailingSlash())
|
|
56
|
+
* ```
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* // With alwaysRedirect option for wildcard routes
|
|
61
|
+
* const app = new Acryl()
|
|
62
|
+
*
|
|
63
|
+
* app.use(appendTrailingSlash({ alwaysRedirect: true }))
|
|
64
|
+
* app.get('/my-path/*', (c) => c.text('Wildcard route'))
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
const appendTrailingSlash = (options) => {
|
|
68
|
+
return async function appendTrailingSlash(c, next) {
|
|
69
|
+
if (options?.alwaysRedirect) {
|
|
70
|
+
if ((c.req.method === "GET" || c.req.method === "HEAD") && c.req.path.at(-1) !== "/" && !options.skip?.(c.req.path)) {
|
|
71
|
+
const url = new URL(c.req.url);
|
|
72
|
+
url.pathname += "/";
|
|
73
|
+
return c.redirect(url.toString(), 301);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
await next();
|
|
77
|
+
if (!options?.alwaysRedirect && c.res.status === 404 && (c.req.method === "GET" || c.req.method === "HEAD") && c.req.path.at(-1) !== "/" && !options?.skip?.(c.req.path)) {
|
|
78
|
+
const url = new URL(c.req.url);
|
|
79
|
+
url.pathname += "/";
|
|
80
|
+
c.res = c.redirect(url.toString(), 301);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
//#endregion
|
|
85
|
+
export { appendTrailingSlash, trimTrailingSlash };
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { checkOptionalParameter, getPattern, splitPath, splitRoutingPath } from "./utils/url.js";
|
|
2
|
+
import "./router.js";
|
|
3
|
+
import { t as createNullObject } from "./utils-dw8lxqjL.js";
|
|
4
|
+
//#region ../../plugins/acryl-router/src/core/router/trie-router/node.ts
|
|
5
|
+
const emptyParams = createNullObject();
|
|
6
|
+
let order = 0;
|
|
7
|
+
var Node = class Node {
|
|
8
|
+
#methods = [];
|
|
9
|
+
#children = createNullObject();
|
|
10
|
+
#patterns = [];
|
|
11
|
+
#pattern;
|
|
12
|
+
#params = emptyParams;
|
|
13
|
+
insert(method, path, handler) {
|
|
14
|
+
let curNode = this;
|
|
15
|
+
const parts = splitRoutingPath(path);
|
|
16
|
+
const possibleKeys = /* @__PURE__ */ new Set();
|
|
17
|
+
let i = 0;
|
|
18
|
+
for (const p of parts) {
|
|
19
|
+
const nextP = parts[++i];
|
|
20
|
+
const pattern = getPattern(p, nextP) || (nextP === void 0 && p && p.indexOf("*") === p.length - 1 ? p : null);
|
|
21
|
+
const isParam = Array.isArray(pattern);
|
|
22
|
+
const key = isParam ? pattern[0] : pattern || p;
|
|
23
|
+
const child = curNode.#children[key] ||= new Node();
|
|
24
|
+
if (pattern && !child.#pattern) {
|
|
25
|
+
child.#pattern = pattern;
|
|
26
|
+
curNode.#patterns.push(child);
|
|
27
|
+
}
|
|
28
|
+
curNode = child;
|
|
29
|
+
if (isParam) possibleKeys.add(pattern[1]);
|
|
30
|
+
}
|
|
31
|
+
curNode.#methods.push({ [method]: {
|
|
32
|
+
handler,
|
|
33
|
+
possibleKeys: [...possibleKeys],
|
|
34
|
+
score: ++order
|
|
35
|
+
} });
|
|
36
|
+
}
|
|
37
|
+
#pushHandlerSets(handlerSets, node, method, nodeParams, params) {
|
|
38
|
+
for (let i = 0, len = node.#methods.length; i < len; i++) {
|
|
39
|
+
const m = node.#methods[i];
|
|
40
|
+
const handlerSet = m[method] || m["ALL"];
|
|
41
|
+
if (handlerSet) {
|
|
42
|
+
handlerSet.params = createNullObject();
|
|
43
|
+
handlerSets.push(handlerSet);
|
|
44
|
+
for (let i = 0, len = handlerSet.possibleKeys.length; i < len; i++) {
|
|
45
|
+
const key = handlerSet.possibleKeys[i];
|
|
46
|
+
handlerSet.params[key] = params?.[key] && !i ? params[key] : nodeParams[key] ?? params?.[key];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
search(method, path) {
|
|
52
|
+
const handlerSets = [];
|
|
53
|
+
this.#params = emptyParams;
|
|
54
|
+
let curNodes = [this];
|
|
55
|
+
const parts = splitPath(path);
|
|
56
|
+
const curNodesQueue = [];
|
|
57
|
+
const len = parts.length;
|
|
58
|
+
let partOffsets = null;
|
|
59
|
+
for (let i = 0; i < len; i++) {
|
|
60
|
+
const part = parts[i];
|
|
61
|
+
const isLast = i === len - 1;
|
|
62
|
+
const tempNodes = [];
|
|
63
|
+
for (let j = 0, len2 = curNodes.length; j < len2; j++) {
|
|
64
|
+
const node = curNodes[j];
|
|
65
|
+
const nextNode = node.#children[part];
|
|
66
|
+
if (nextNode) {
|
|
67
|
+
nextNode.#params = node.#params;
|
|
68
|
+
if (isLast) {
|
|
69
|
+
if (nextNode.#children["*"]) this.#pushHandlerSets(handlerSets, nextNode.#children["*"], method, node.#params);
|
|
70
|
+
this.#pushHandlerSets(handlerSets, nextNode, method, node.#params);
|
|
71
|
+
} else tempNodes.push(nextNode);
|
|
72
|
+
}
|
|
73
|
+
for (const child of node.#patterns) {
|
|
74
|
+
const pattern = child.#pattern;
|
|
75
|
+
const params = node.#params === emptyParams ? {} : { ...node.#params };
|
|
76
|
+
if (typeof pattern === "string") {
|
|
77
|
+
if (pattern === "*" || part.startsWith(pattern.slice(0, -1))) {
|
|
78
|
+
this.#pushHandlerSets(handlerSets, child, method, node.#params);
|
|
79
|
+
if (pattern === "*") {
|
|
80
|
+
child.#params = params;
|
|
81
|
+
tempNodes.push(child);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const [, name, matcher] = pattern;
|
|
87
|
+
if (!part && matcher === true) continue;
|
|
88
|
+
if (matcher !== true) {
|
|
89
|
+
if (!partOffsets) {
|
|
90
|
+
partOffsets = [];
|
|
91
|
+
let offset = path[0] === "/" ? 1 : 0;
|
|
92
|
+
for (let p = 0; p < len; p++) {
|
|
93
|
+
partOffsets[p] = offset;
|
|
94
|
+
offset += parts[p].length + 1;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const restPathString = path.slice(partOffsets[i]);
|
|
98
|
+
const m = matcher.exec(restPathString);
|
|
99
|
+
if (m) {
|
|
100
|
+
if (!Object.hasOwn(params, name)) params[name] = m[0];
|
|
101
|
+
this.#pushHandlerSets(handlerSets, child, method, node.#params, params);
|
|
102
|
+
if (m[0].length === restPathString.length && child.#children["*"]) this.#pushHandlerSets(handlerSets, child.#children["*"], method, node.#params, params);
|
|
103
|
+
for (const _ in child.#children) {
|
|
104
|
+
child.#params = params;
|
|
105
|
+
const componentCount = m[0].match(/\//g)?.length ?? 0;
|
|
106
|
+
(curNodesQueue[componentCount] ||= []).push(child);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (matcher === true || matcher.test(part)) {
|
|
113
|
+
if (!Object.hasOwn(params, name)) params[name] = part;
|
|
114
|
+
if (isLast) {
|
|
115
|
+
this.#pushHandlerSets(handlerSets, child, method, params, node.#params);
|
|
116
|
+
if (child.#children["*"]) this.#pushHandlerSets(handlerSets, child.#children["*"], method, params, node.#params);
|
|
117
|
+
} else {
|
|
118
|
+
child.#params = params;
|
|
119
|
+
tempNodes.push(child);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const shifted = curNodesQueue.shift();
|
|
125
|
+
curNodes = shifted ? tempNodes.concat(shifted) : tempNodes;
|
|
126
|
+
}
|
|
127
|
+
if (handlerSets[1]) handlerSets.sort((a, b) => {
|
|
128
|
+
return a.score - b.score;
|
|
129
|
+
});
|
|
130
|
+
return [handlerSets.map(({ handler, params }) => [handler, params])];
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
//#endregion
|
|
134
|
+
//#region ../../plugins/acryl-router/src/core/router/trie-router/router.ts
|
|
135
|
+
var TrieRouter = class {
|
|
136
|
+
name = "TrieRouter";
|
|
137
|
+
#node = new Node();
|
|
138
|
+
add(method, path, handler) {
|
|
139
|
+
for (const result of checkOptionalParameter(path) || [path]) this.#node.insert(method, result, handler);
|
|
140
|
+
}
|
|
141
|
+
match(method, path) {
|
|
142
|
+
return this.#node.search(method, path);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
//#endregion
|
|
146
|
+
export { TrieRouter as t };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { t as Context } from "./context-Bm7rI-oK.js";
|
|
2
|
+
|
|
3
|
+
//#region ../../plugins/acryl-router/src/core/helper/conninfo/types.d.ts
|
|
4
|
+
type AddressType = 'IPv6' | 'IPv4' | undefined;
|
|
5
|
+
type NetAddrInfo = {
|
|
6
|
+
/**
|
|
7
|
+
* Transport protocol type
|
|
8
|
+
*/
|
|
9
|
+
transport?: 'tcp' | 'udp';
|
|
10
|
+
/**
|
|
11
|
+
* Transport port number
|
|
12
|
+
*/
|
|
13
|
+
port?: number;
|
|
14
|
+
address?: string;
|
|
15
|
+
addressType?: AddressType;
|
|
16
|
+
} & ({
|
|
17
|
+
/**
|
|
18
|
+
* Host name such as IP Addr
|
|
19
|
+
*/
|
|
20
|
+
address: string;
|
|
21
|
+
/**
|
|
22
|
+
* Host name type
|
|
23
|
+
*/
|
|
24
|
+
addressType: AddressType;
|
|
25
|
+
} | {});
|
|
26
|
+
/**
|
|
27
|
+
* HTTP Connection information
|
|
28
|
+
*/
|
|
29
|
+
interface ConnInfo {
|
|
30
|
+
/**
|
|
31
|
+
* Remote information
|
|
32
|
+
*/
|
|
33
|
+
remote: NetAddrInfo;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Helper type
|
|
37
|
+
*/
|
|
38
|
+
type GetConnInfo = (c: Context) => ConnInfo;
|
|
39
|
+
//#endregion
|
|
40
|
+
export { NetAddrInfo as i, ConnInfo as n, GetConnInfo as r, AddressType as t };
|