acrylblends 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +6 -1
- package/dist/index.js +84 -5
- 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/api-summary.md +138 -0
- package/docs/framework/concepts.md +105 -0
- package/docs/framework/context.md +129 -0
- package/docs/framework/getting-started.md +146 -0
- package/docs/framework/helpers.md +118 -0
- package/docs/framework/middleware.md +154 -0
- package/docs/framework/migration-from-0-3.md +108 -0
- package/docs/framework/migration-from-dsh-webserver.md +103 -0
- package/docs/framework/node-server.md +75 -0
- package/docs/framework/plugin-lifecycle.md +111 -0
- package/docs/framework/request.md +106 -0
- package/docs/framework/routing.md +188 -0
- package/docs/framework/surfaces.md +71 -0
- package/docs/framework/upstream.json +9 -0
- package/docs/framework/validation.md +135 -0
- package/package.json +4 -2
- package/plugins/acryl-inspect/plugin.json +2 -1
- package/plugins/acryl-inspect/src/report.ts +21 -13
- package/plugins/acryl-inspect/src/service.ts +9 -7
- package/plugins/acryl-inspect/tests/report.spec.ts +13 -8
- package/plugins/acryl-inspect/tests/service.spec.ts +11 -10
- package/plugins/acryl-inspect/upstream.json +2 -2
- package/plugins/acryl-node-server/LICENSE +26 -0
- package/plugins/acryl-node-server/plugin.json +2 -1
- package/plugins/acryl-node-server/src/adapter/conninfo.ts +23 -0
- package/plugins/acryl-node-server/src/adapter/early-hints.ts +55 -0
- package/plugins/acryl-node-server/src/adapter/error.ts +11 -0
- package/plugins/acryl-node-server/src/adapter/headers.ts +249 -0
- package/plugins/acryl-node-server/src/adapter/index.ts +6 -0
- package/plugins/acryl-node-server/src/adapter/listener.ts +540 -0
- package/plugins/acryl-node-server/src/adapter/request.ts +797 -0
- package/plugins/acryl-node-server/src/adapter/response.ts +186 -0
- package/plugins/acryl-node-server/src/adapter/serve-static.ts +238 -0
- package/plugins/acryl-node-server/src/adapter/server.ts +36 -0
- package/plugins/acryl-node-server/src/adapter/types.ts +82 -0
- package/plugins/acryl-node-server/src/adapter/url.ts +42 -0
- package/plugins/acryl-node-server/src/adapter/utils/response/constants.ts +1 -0
- package/plugins/acryl-node-server/src/adapter/utils/response.ts +4 -0
- package/plugins/acryl-node-server/src/adapter/utils/stream.ts +88 -0
- package/plugins/acryl-node-server/src/adapter/utils.ts +96 -0
- package/plugins/acryl-node-server/src/adapter/websocket-types.ts +45 -0
- package/plugins/acryl-node-server/src/adapter/websocket.ts +375 -0
- package/plugins/acryl-node-server/src/index.ts +19 -6
- package/plugins/acryl-node-server/tests/adapter/app.ts +76 -0
- package/plugins/acryl-node-server/tests/adapter/assets/.static/plain.txt +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/favicon.ico +0 -0
- package/plugins/acryl-node-server/tests/adapter/assets/secret.txt +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static/admin/secret.txt +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static/data.json +5 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static/extensionless +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static/foo..bar.txt +0 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static/plain.txt +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-context-path/plain.txt +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin.br +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.br +1 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.zst +1 -0
- package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +34 -0
- package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +248 -0
- package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +457 -0
- package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-cert.pem +23 -0
- package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-key.pem +27 -0
- package/plugins/acryl-node-server/tests/adapter/headers.test.ts +252 -0
- package/plugins/acryl-node-server/tests/adapter/helpers/request.ts +190 -0
- package/plugins/acryl-node-server/tests/adapter/listener.test.ts +727 -0
- package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +189 -0
- package/plugins/acryl-node-server/tests/adapter/request.test.ts +1230 -0
- package/plugins/acryl-node-server/tests/adapter/response.test.ts +285 -0
- package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +849 -0
- package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +790 -0
- package/plugins/acryl-node-server/tests/adapter/server.test.ts +1302 -0
- package/plugins/acryl-node-server/tests/adapter/setup.ts +16 -0
- package/plugins/acryl-node-server/tests/adapter/url.test.ts +76 -0
- package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +23 -0
- package/plugins/acryl-node-server/tests/adapter/utils/stream.test.ts +75 -0
- package/plugins/acryl-node-server/tests/adapter/utils.test.ts +235 -0
- package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +260 -0
- package/plugins/acryl-node-server/tests/server.spec.ts +44 -8
- package/plugins/acryl-node-server/upstream.json +3 -3
- package/plugins/acryl-router/LICENSE +26 -0
- package/plugins/acryl-router/plugin.json +2 -1
- package/plugins/acryl-router/src/client.ts +2 -0
- package/plugins/acryl-router/src/connection.ts +42 -0
- package/plugins/acryl-router/src/core/app-base.ts +544 -0
- package/plugins/acryl-router/src/core/app.test.ts +3833 -0
- package/plugins/acryl-router/src/core/app.ts +34 -0
- package/plugins/acryl-router/src/core/client/client.test.ts +2313 -0
- package/plugins/acryl-router/src/core/client/client.ts +249 -0
- package/plugins/acryl-router/src/core/client/fetch-result-please.ts +95 -0
- package/plugins/acryl-router/src/core/client/index.ts +17 -0
- package/plugins/acryl-router/src/core/client/types.test.ts +149 -0
- package/plugins/acryl-router/src/core/client/types.ts +393 -0
- package/plugins/acryl-router/src/core/client/utils.test.ts +405 -0
- package/plugins/acryl-router/src/core/client/utils.ts +117 -0
- package/plugins/acryl-router/src/core/compose.test.ts +751 -0
- package/plugins/acryl-router/src/core/compose.ts +73 -0
- package/plugins/acryl-router/src/core/context.test.ts +629 -0
- package/plugins/acryl-router/src/core/context.ts +781 -0
- package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +344 -0
- package/plugins/acryl-router/src/core/helper/accepts/accepts.ts +96 -0
- package/plugins/acryl-router/src/core/helper/accepts/index.ts +6 -0
- package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +55 -0
- package/plugins/acryl-router/src/core/helper/adapter/index.ts +90 -0
- package/plugins/acryl-router/src/core/helper/conninfo/index.ts +6 -0
- package/plugins/acryl-router/src/core/helper/conninfo/types.ts +45 -0
- package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +510 -0
- package/plugins/acryl-router/src/core/helper/cookie/index.ts +146 -0
- package/plugins/acryl-router/src/core/helper/factory/index.test.ts +434 -0
- package/plugins/acryl-router/src/core/helper/factory/index.ts +375 -0
- package/plugins/acryl-router/src/core/helper/html/index.test.ts +78 -0
- package/plugins/acryl-router/src/core/helper/html/index.ts +57 -0
- package/plugins/acryl-router/src/core/helper/route/index.test.ts +259 -0
- package/plugins/acryl-router/src/core/helper/route/index.ts +144 -0
- package/plugins/acryl-router/src/core/helper/streaming/index.ts +9 -0
- package/plugins/acryl-router/src/core/helper/streaming/sse.ts +101 -0
- package/plugins/acryl-router/src/core/helper/streaming/stream.test.ts +128 -0
- package/plugins/acryl-router/src/core/helper/streaming/stream.ts +45 -0
- package/plugins/acryl-router/src/core/helper/streaming/text.test.ts +34 -0
- package/plugins/acryl-router/src/core/helper/streaming/text.ts +15 -0
- package/plugins/acryl-router/src/core/helper/streaming/utils.ts +11 -0
- package/plugins/acryl-router/src/core/helper/testing/index.test.ts +42 -0
- package/plugins/acryl-router/src/core/helper/testing/index.ts +28 -0
- package/plugins/acryl-router/src/core/helper/websocket/index.test.ts +124 -0
- package/plugins/acryl-router/src/core/helper/websocket/index.ts +140 -0
- package/plugins/acryl-router/src/core/http-exception.test.ts +45 -0
- package/plugins/acryl-router/src/core/http-exception.ts +77 -0
- package/plugins/acryl-router/src/core/index.ts +53 -0
- package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +434 -0
- package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +152 -0
- package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +1018 -0
- package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +220 -0
- package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +273 -0
- package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +110 -0
- package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +355 -0
- package/plugins/acryl-router/src/core/middleware/combine/index.ts +171 -0
- package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +535 -0
- package/plugins/acryl-router/src/core/middleware/compress/index.ts +142 -0
- package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +43 -0
- package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +58 -0
- package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +532 -0
- package/plugins/acryl-router/src/core/middleware/cors/index.ts +163 -0
- package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +534 -0
- package/plugins/acryl-router/src/core/middleware/csrf/index.ts +150 -0
- package/plugins/acryl-router/src/core/middleware/etag/digest.test.ts +21 -0
- package/plugins/acryl-router/src/core/middleware/etag/digest.ts +95 -0
- package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +503 -0
- package/plugins/acryl-router/src/core/middleware/etag/index.ts +135 -0
- package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +217 -0
- package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +278 -0
- package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +1135 -0
- package/plugins/acryl-router/src/core/middleware/jwk/index.ts +1 -0
- package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +195 -0
- package/plugins/acryl-router/src/core/middleware/jwk/keys.test.json +48 -0
- package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +802 -0
- package/plugins/acryl-router/src/core/middleware/jwt/index.ts +9 -0
- package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +189 -0
- package/plugins/acryl-router/src/core/middleware/language/index.test.ts +552 -0
- package/plugins/acryl-router/src/core/middleware/language/index.ts +12 -0
- package/plugins/acryl-router/src/core/middleware/language/language.ts +314 -0
- package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +204 -0
- package/plugins/acryl-router/src/core/middleware/logger/index.ts +95 -0
- package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +292 -0
- package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +141 -0
- package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +221 -0
- package/plugins/acryl-router/src/core/middleware/method-override/index.ts +147 -0
- package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +37 -0
- package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +35 -0
- package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +218 -0
- package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +67 -0
- package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +168 -0
- package/plugins/acryl-router/src/core/middleware/request-id/index.ts +7 -0
- package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +59 -0
- package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +671 -0
- package/plugins/acryl-router/src/core/middleware/secure-headers/index.ts +8 -0
- package/plugins/acryl-router/src/core/middleware/secure-headers/permissions-policy.ts +101 -0
- package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +340 -0
- package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +450 -0
- package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +135 -0
- package/plugins/acryl-router/src/core/middleware/serve-static/path.test.ts +50 -0
- package/plugins/acryl-router/src/core/middleware/serve-static/path.ts +25 -0
- package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +70 -0
- package/plugins/acryl-router/src/core/middleware/timeout/index.ts +58 -0
- package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +310 -0
- package/plugins/acryl-router/src/core/middleware/timing/index.ts +8 -0
- package/plugins/acryl-router/src/core/middleware/timing/timing.ts +256 -0
- package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +381 -0
- package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +156 -0
- package/plugins/acryl-router/src/core/request/constants.ts +1 -0
- package/plugins/acryl-router/src/core/request.test.ts +751 -0
- package/plugins/acryl-router/src/core/request.ts +502 -0
- package/plugins/acryl-router/src/core/router/common.case.test.ts +1132 -0
- package/plugins/acryl-router/src/core/router/linear-router/index.ts +6 -0
- package/plugins/acryl-router/src/core/router/linear-router/router.test.ts +80 -0
- package/plugins/acryl-router/src/core/router/linear-router/router.ts +152 -0
- package/plugins/acryl-router/src/core/router/pattern-router/index.ts +6 -0
- package/plugins/acryl-router/src/core/router/pattern-router/router.test.ts +46 -0
- package/plugins/acryl-router/src/core/router/pattern-router/router.ts +54 -0
- package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +7 -0
- package/plugins/acryl-router/src/core/router/reg-exp-router/matcher.ts +33 -0
- package/plugins/acryl-router/src/core/router/reg-exp-router/node.ts +170 -0
- package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.test.ts +154 -0
- package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.ts +165 -0
- package/plugins/acryl-router/src/core/router/reg-exp-router/router.test.ts +265 -0
- package/plugins/acryl-router/src/core/router/reg-exp-router/router.ts +174 -0
- package/plugins/acryl-router/src/core/router/reg-exp-router/trie.ts +84 -0
- package/plugins/acryl-router/src/core/router/smart-router/index.ts +6 -0
- package/plugins/acryl-router/src/core/router/smart-router/router.test.ts +13 -0
- package/plugins/acryl-router/src/core/router/smart-router/router.ts +70 -0
- package/plugins/acryl-router/src/core/router/trie-router/index.ts +6 -0
- package/plugins/acryl-router/src/core/router/trie-router/node.test.ts +896 -0
- package/plugins/acryl-router/src/core/router/trie-router/node.ts +221 -0
- package/plugins/acryl-router/src/core/router/trie-router/router.test.ts +8 -0
- package/plugins/acryl-router/src/core/router/trie-router/router.ts +18 -0
- package/plugins/acryl-router/src/core/router/utils.ts +1 -0
- package/plugins/acryl-router/src/core/router.ts +103 -0
- package/plugins/acryl-router/src/core/types.test.ts +4134 -0
- package/plugins/acryl-router/src/core/types.ts +2782 -0
- package/plugins/acryl-router/src/core/utils/accept.test.ts +299 -0
- package/plugins/acryl-router/src/core/utils/accept.ts +268 -0
- package/plugins/acryl-router/src/core/utils/basic-auth.test.ts +56 -0
- package/plugins/acryl-router/src/core/utils/basic-auth.ts +26 -0
- package/plugins/acryl-router/src/core/utils/body.test.ts +496 -0
- package/plugins/acryl-router/src/core/utils/body.ts +263 -0
- package/plugins/acryl-router/src/core/utils/buffer.test.ts +147 -0
- package/plugins/acryl-router/src/core/utils/buffer.ts +117 -0
- package/plugins/acryl-router/src/core/utils/color.test.ts +23 -0
- package/plugins/acryl-router/src/core/utils/color.ts +56 -0
- package/plugins/acryl-router/src/core/utils/compress.ts +10 -0
- package/plugins/acryl-router/src/core/utils/concurrent.test.ts +69 -0
- package/plugins/acryl-router/src/core/utils/concurrent.ts +55 -0
- package/plugins/acryl-router/src/core/utils/constants.ts +4 -0
- package/plugins/acryl-router/src/core/utils/cookie.test.ts +460 -0
- package/plugins/acryl-router/src/core/utils/cookie.ts +281 -0
- package/plugins/acryl-router/src/core/utils/crypto.test.ts +43 -0
- package/plugins/acryl-router/src/core/utils/crypto.ts +58 -0
- package/plugins/acryl-router/src/core/utils/encode.test.ts +61 -0
- package/plugins/acryl-router/src/core/utils/encode.ts +34 -0
- package/plugins/acryl-router/src/core/utils/filepath.test.ts +78 -0
- package/plugins/acryl-router/src/core/utils/filepath.ts +60 -0
- package/plugins/acryl-router/src/core/utils/handler.ts +15 -0
- package/plugins/acryl-router/src/core/utils/headers.ts +355 -0
- package/plugins/acryl-router/src/core/utils/html.test.ts +16 -0
- package/plugins/acryl-router/src/core/utils/html.ts +182 -0
- package/plugins/acryl-router/src/core/utils/http-status.ts +72 -0
- package/plugins/acryl-router/src/core/utils/ipaddr.test.ts +149 -0
- package/plugins/acryl-router/src/core/utils/ipaddr.ts +374 -0
- package/plugins/acryl-router/src/core/utils/jwt/index.ts +7 -0
- package/plugins/acryl-router/src/core/utils/jwt/jwa.test.ts +86 -0
- package/plugins/acryl-router/src/core/utils/jwt/jwa.ts +38 -0
- package/plugins/acryl-router/src/core/utils/jwt/jws.ts +235 -0
- package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +1788 -0
- package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +292 -0
- package/plugins/acryl-router/src/core/utils/jwt/types.ts +157 -0
- package/plugins/acryl-router/src/core/utils/jwt/utf8.ts +7 -0
- package/plugins/acryl-router/src/core/utils/mime.test.ts +64 -0
- package/plugins/acryl-router/src/core/utils/mime.ts +94 -0
- package/plugins/acryl-router/src/core/utils/stream.test.ts +212 -0
- package/plugins/acryl-router/src/core/utils/stream.ts +107 -0
- package/plugins/acryl-router/src/core/utils/types.test.ts +295 -0
- package/plugins/acryl-router/src/core/utils/types.ts +123 -0
- package/plugins/acryl-router/src/core/utils/url.test.ts +384 -0
- package/plugins/acryl-router/src/core/utils/url.ts +337 -0
- package/plugins/acryl-router/src/core/validator/index.ts +8 -0
- package/plugins/acryl-router/src/core/validator/utils.test.ts +82 -0
- package/plugins/acryl-router/src/core/validator/utils.ts +69 -0
- package/plugins/acryl-router/src/core/validator/validator.test.ts +1488 -0
- package/plugins/acryl-router/src/core/validator/validator.ts +185 -0
- package/plugins/acryl-router/src/helpers/index.ts +13 -3
- package/plugins/acryl-router/src/helpers/schema-validator.ts +35 -0
- package/plugins/acryl-router/src/index.ts +6 -6
- package/plugins/acryl-router/src/middleware/index.ts +25 -6
- package/plugins/acryl-router/src/middleware/loopback-only.ts +53 -14
- package/plugins/acryl-router/src/service.ts +262 -64
- package/plugins/acryl-router/tests/docs-examples.spec.ts +152 -0
- package/plugins/acryl-router/tests/live-install.spec.ts +2 -2
- package/plugins/acryl-router/tests/loader.spec.ts +3 -2
- package/plugins/acryl-router/tests/loopback-only.spec.ts +80 -0
- package/plugins/acryl-router/tests/service.spec.ts +281 -66
- package/plugins/acryl-router/tests/shadow-state.spec.ts +79 -0
- package/plugins/acryl-router/upstream.json +2 -2
- package/plugins/acryl-router-http/plugin.json +2 -1
- package/plugins/acryl-router-http/src/bridge.ts +3 -1
- package/plugins/acryl-router-http/tests/adapter.spec.ts +16 -12
- package/plugins/acryl-router-http/tests/surfaces.spec.ts +12 -10
- package/plugins/acryl-router-http/upstream.json +3 -3
- package/plugins/acryl-state/NOTICE +30 -0
- package/plugins/acryl-state/plugin.json +1 -1
- package/plugins/acryl-state/src/cell.ts +1 -1
- package/plugins/acryl-state/src/service.ts +33 -15
- package/plugins/acryl-state/upstream.json +6 -4
- package/plugins/builder/script.ts +4 -7
- package/plugins/extensions/index.ts +6 -5
- package/plugins/extensions/resolve.ts +28 -3
- package/plugins/openai/prompt.ts +9 -7
- package/plugins/tsconfig.json +5 -4
- package/shared/AGENTS.core.md +54 -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 +37 -27
- package/templates/agent/test/model.test.ts +2 -1
- package/templates/agent/tsconfig.json +8 -5
- package/templates/blank/AGENTS.md +5 -0
- package/templates/blank/README.md +1 -1
- package/templates/blank/src/routes.ts +6 -4
- package/templates/blank/tsconfig.json +2 -4
- package/templates/todo/AGENTS.md +5 -0
- package/templates/todo/src/page.ts +1 -1
- package/templates/todo/src/todo.ts +58 -29
- package/templates/todo/tsconfig.json +2 -4
- package/templates/todo/upstream.json +2 -2
- package/plugins/acryl-router/src/compose.ts +0 -21
- package/plugins/acryl-router/src/context.ts +0 -59
- package/plugins/acryl-router/src/helpers/read-body.ts +0 -59
- package/plugins/acryl-router/src/helpers/sse.ts +0 -83
- package/plugins/acryl-router/src/helpers/validate.ts +0 -44
- package/plugins/acryl-router/src/http-error.ts +0 -21
- package/plugins/acryl-router/src/middleware/body-limit.ts +0 -25
- package/plugins/acryl-router/src/middleware/cors.ts +0 -46
- package/plugins/acryl-router/src/middleware/logger.ts +0 -21
- package/plugins/acryl-router/src/middleware/request-id.ts +0 -24
- package/plugins/acryl-router/src/middleware/secure-headers.ts +0 -23
- package/plugins/acryl-router/src/pattern.ts +0 -89
- package/plugins/acryl-router/src/registrar.ts +0 -90
- package/plugins/acryl-router/src/table.ts +0 -156
- package/plugins/acryl-router/src/types.ts +0 -73
- package/plugins/acryl-router/src/util.ts +0 -23
- package/plugins/acryl-router/tests/api.spec.ts +0 -223
- package/plugins/acryl-router/tests/conformance.ts +0 -170
- package/plugins/acryl-router/tests/helpers.spec.ts +0 -172
- package/plugins/acryl-router/tests/middleware.spec.ts +0 -183
- package/plugins/acryl-router/tests/table.spec.ts +0 -47
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* Factory Helper for App.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
7
|
+
import { App } from '../../app.ts'
|
|
8
|
+
import type { AppOptions } from '../../app-base.ts'
|
|
9
|
+
import type {
|
|
10
|
+
Env,
|
|
11
|
+
H,
|
|
12
|
+
HandlerResponse,
|
|
13
|
+
Input,
|
|
14
|
+
IntersectNonAnyTypes,
|
|
15
|
+
MiddlewareHandler,
|
|
16
|
+
} from '../../types.ts'
|
|
17
|
+
|
|
18
|
+
type InitApp<E extends Env = Env> = (app: App<E>) => void
|
|
19
|
+
|
|
20
|
+
export interface CreateHandlersInterface<E extends Env, P extends string> {
|
|
21
|
+
<I extends Input = {}, R extends HandlerResponse<any> = any, E2 extends Env = E>(
|
|
22
|
+
handler1: H<E2, P, I, R>
|
|
23
|
+
): [H<E2, P, I, R>]
|
|
24
|
+
|
|
25
|
+
// handler x2
|
|
26
|
+
<
|
|
27
|
+
I extends Input = {},
|
|
28
|
+
I2 extends Input = I,
|
|
29
|
+
R extends HandlerResponse<any> = any,
|
|
30
|
+
R2 extends HandlerResponse<any> = any,
|
|
31
|
+
E2 extends Env = E,
|
|
32
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
33
|
+
>(
|
|
34
|
+
handler1: H<E2, P, I, R>,
|
|
35
|
+
handler2: H<E3, P, I2, R2>
|
|
36
|
+
): [H<E2, P, I, R>, H<E3, P, I2, R2>]
|
|
37
|
+
|
|
38
|
+
// handler x3
|
|
39
|
+
<
|
|
40
|
+
I extends Input = {},
|
|
41
|
+
I2 extends Input = I,
|
|
42
|
+
I3 extends Input = I & I2,
|
|
43
|
+
R extends HandlerResponse<any> = any,
|
|
44
|
+
R2 extends HandlerResponse<any> = any,
|
|
45
|
+
R3 extends HandlerResponse<any> = any,
|
|
46
|
+
E2 extends Env = E,
|
|
47
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
48
|
+
E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
|
|
49
|
+
>(
|
|
50
|
+
handler1: H<E2, P, I, R>,
|
|
51
|
+
handler2: H<E3, P, I2, R2>,
|
|
52
|
+
handler3: H<E4, P, I3, R3>
|
|
53
|
+
): [H<E2, P, I, R>, H<E3, P, I2, R2>, H<E4, P, I3, R3>]
|
|
54
|
+
|
|
55
|
+
// handler x4
|
|
56
|
+
<
|
|
57
|
+
I extends Input = {},
|
|
58
|
+
I2 extends Input = I,
|
|
59
|
+
I3 extends Input = I & I2,
|
|
60
|
+
I4 extends Input = I & I2 & I3,
|
|
61
|
+
R extends HandlerResponse<any> = any,
|
|
62
|
+
R2 extends HandlerResponse<any> = any,
|
|
63
|
+
R3 extends HandlerResponse<any> = any,
|
|
64
|
+
R4 extends HandlerResponse<any> = any,
|
|
65
|
+
E2 extends Env = E,
|
|
66
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
67
|
+
E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
|
|
68
|
+
E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
|
|
69
|
+
>(
|
|
70
|
+
handler1: H<E2, P, I, R>,
|
|
71
|
+
handler2: H<E3, P, I2, R2>,
|
|
72
|
+
handler3: H<E4, P, I3, R3>,
|
|
73
|
+
handler4: H<E5, P, I4, R4>
|
|
74
|
+
): [H<E2, P, I, R>, H<E3, P, I2, R2>, H<E4, P, I3, R3>, H<E5, P, I4, R4>]
|
|
75
|
+
|
|
76
|
+
// handler x5
|
|
77
|
+
<
|
|
78
|
+
I extends Input = {},
|
|
79
|
+
I2 extends Input = I,
|
|
80
|
+
I3 extends Input = I & I2,
|
|
81
|
+
I4 extends Input = I & I2 & I3,
|
|
82
|
+
I5 extends Input = I & I2 & I3 & I4,
|
|
83
|
+
R extends HandlerResponse<any> = any,
|
|
84
|
+
R2 extends HandlerResponse<any> = any,
|
|
85
|
+
R3 extends HandlerResponse<any> = any,
|
|
86
|
+
R4 extends HandlerResponse<any> = any,
|
|
87
|
+
R5 extends HandlerResponse<any> = any,
|
|
88
|
+
E2 extends Env = E,
|
|
89
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
90
|
+
E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
|
|
91
|
+
E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
|
|
92
|
+
E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
|
|
93
|
+
>(
|
|
94
|
+
handler1: H<E2, P, I, R>,
|
|
95
|
+
handler2: H<E3, P, I2, R2>,
|
|
96
|
+
handler3: H<E4, P, I3, R3>,
|
|
97
|
+
handler4: H<E5, P, I4, R4>,
|
|
98
|
+
handler5: H<E6, P, I5, R5>
|
|
99
|
+
): [H<E2, P, I, R>, H<E3, P, I2, R2>, H<E4, P, I3, R3>, H<E5, P, I4, R4>, H<E6, P, I5, R5>]
|
|
100
|
+
|
|
101
|
+
// handler x6
|
|
102
|
+
<
|
|
103
|
+
I extends Input = {},
|
|
104
|
+
I2 extends Input = I,
|
|
105
|
+
I3 extends Input = I & I2,
|
|
106
|
+
I4 extends Input = I & I2 & I3,
|
|
107
|
+
I5 extends Input = I & I2 & I3 & I4,
|
|
108
|
+
I6 extends Input = I & I2 & I3 & I4 & I5,
|
|
109
|
+
R extends HandlerResponse<any> = any,
|
|
110
|
+
R2 extends HandlerResponse<any> = any,
|
|
111
|
+
R3 extends HandlerResponse<any> = any,
|
|
112
|
+
R4 extends HandlerResponse<any> = any,
|
|
113
|
+
R5 extends HandlerResponse<any> = any,
|
|
114
|
+
R6 extends HandlerResponse<any> = any,
|
|
115
|
+
E2 extends Env = E,
|
|
116
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
117
|
+
E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
|
|
118
|
+
E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
|
|
119
|
+
E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
|
|
120
|
+
E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
|
|
121
|
+
>(
|
|
122
|
+
handler1: H<E2, P, I, R>,
|
|
123
|
+
handler2: H<E3, P, I2, R2>,
|
|
124
|
+
handler3: H<E4, P, I3, R3>,
|
|
125
|
+
handler4: H<E5, P, I4, R4>,
|
|
126
|
+
handler5: H<E6, P, I5, R5>,
|
|
127
|
+
handler6: H<E7, P, I6, R6>
|
|
128
|
+
): [
|
|
129
|
+
H<E2, P, I, R>,
|
|
130
|
+
H<E3, P, I2, R2>,
|
|
131
|
+
H<E4, P, I3, R3>,
|
|
132
|
+
H<E5, P, I4, R4>,
|
|
133
|
+
H<E6, P, I5, R5>,
|
|
134
|
+
H<E7, P, I6, R6>,
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
// handler x7
|
|
138
|
+
<
|
|
139
|
+
I extends Input = {},
|
|
140
|
+
I2 extends Input = I,
|
|
141
|
+
I3 extends Input = I & I2,
|
|
142
|
+
I4 extends Input = I & I2 & I3,
|
|
143
|
+
I5 extends Input = I & I2 & I3 & I4,
|
|
144
|
+
I6 extends Input = I & I2 & I3 & I4 & I5,
|
|
145
|
+
I7 extends Input = I & I2 & I3 & I4 & I5 & I6,
|
|
146
|
+
R extends HandlerResponse<any> = any,
|
|
147
|
+
R2 extends HandlerResponse<any> = any,
|
|
148
|
+
R3 extends HandlerResponse<any> = any,
|
|
149
|
+
R4 extends HandlerResponse<any> = any,
|
|
150
|
+
R5 extends HandlerResponse<any> = any,
|
|
151
|
+
R6 extends HandlerResponse<any> = any,
|
|
152
|
+
R7 extends HandlerResponse<any> = any,
|
|
153
|
+
E2 extends Env = E,
|
|
154
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
155
|
+
E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
|
|
156
|
+
E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
|
|
157
|
+
E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
|
|
158
|
+
E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
|
|
159
|
+
E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>,
|
|
160
|
+
>(
|
|
161
|
+
handler1: H<E2, P, I, R>,
|
|
162
|
+
handler2: H<E3, P, I2, R2>,
|
|
163
|
+
handler3: H<E4, P, I3, R3>,
|
|
164
|
+
handler4: H<E5, P, I4, R4>,
|
|
165
|
+
handler5: H<E6, P, I5, R5>,
|
|
166
|
+
handler6: H<E7, P, I6, R6>,
|
|
167
|
+
handler7: H<E8, P, I7, R7>
|
|
168
|
+
): [
|
|
169
|
+
H<E2, P, I, R>,
|
|
170
|
+
H<E3, P, I2, R2>,
|
|
171
|
+
H<E4, P, I3, R3>,
|
|
172
|
+
H<E5, P, I4, R4>,
|
|
173
|
+
H<E6, P, I5, R5>,
|
|
174
|
+
H<E7, P, I6, R6>,
|
|
175
|
+
H<E8, P, I7, R7>,
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
// handler x8
|
|
179
|
+
<
|
|
180
|
+
I extends Input = {},
|
|
181
|
+
I2 extends Input = I,
|
|
182
|
+
I3 extends Input = I & I2,
|
|
183
|
+
I4 extends Input = I & I2 & I3,
|
|
184
|
+
I5 extends Input = I & I2 & I3 & I4,
|
|
185
|
+
I6 extends Input = I & I2 & I3 & I4 & I5,
|
|
186
|
+
I7 extends Input = I & I2 & I3 & I4 & I5 & I6,
|
|
187
|
+
I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7,
|
|
188
|
+
R extends HandlerResponse<any> = any,
|
|
189
|
+
R2 extends HandlerResponse<any> = any,
|
|
190
|
+
R3 extends HandlerResponse<any> = any,
|
|
191
|
+
R4 extends HandlerResponse<any> = any,
|
|
192
|
+
R5 extends HandlerResponse<any> = any,
|
|
193
|
+
R6 extends HandlerResponse<any> = any,
|
|
194
|
+
R7 extends HandlerResponse<any> = any,
|
|
195
|
+
R8 extends HandlerResponse<any> = any,
|
|
196
|
+
E2 extends Env = E,
|
|
197
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
198
|
+
E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
|
|
199
|
+
E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
|
|
200
|
+
E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
|
|
201
|
+
E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
|
|
202
|
+
E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>,
|
|
203
|
+
E9 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8]>,
|
|
204
|
+
>(
|
|
205
|
+
handler1: H<E2, P, I, R>,
|
|
206
|
+
handler2: H<E3, P, I2, R2>,
|
|
207
|
+
handler3: H<E4, P, I3, R3>,
|
|
208
|
+
handler4: H<E5, P, I4, R4>,
|
|
209
|
+
handler5: H<E6, P, I5, R5>,
|
|
210
|
+
handler6: H<E7, P, I6, R6>,
|
|
211
|
+
handler7: H<E8, P, I7, R7>,
|
|
212
|
+
handler8: H<E9, P, I8, R8>
|
|
213
|
+
): [
|
|
214
|
+
H<E2, P, I, R>,
|
|
215
|
+
H<E3, P, I2, R2>,
|
|
216
|
+
H<E4, P, I3, R3>,
|
|
217
|
+
H<E5, P, I4, R4>,
|
|
218
|
+
H<E6, P, I5, R5>,
|
|
219
|
+
H<E7, P, I6, R6>,
|
|
220
|
+
H<E8, P, I7, R7>,
|
|
221
|
+
H<E9, P, I8, R8>,
|
|
222
|
+
]
|
|
223
|
+
|
|
224
|
+
// handler x9
|
|
225
|
+
<
|
|
226
|
+
I extends Input = {},
|
|
227
|
+
I2 extends Input = I,
|
|
228
|
+
I3 extends Input = I & I2,
|
|
229
|
+
I4 extends Input = I & I2 & I3,
|
|
230
|
+
I5 extends Input = I & I2 & I3 & I4,
|
|
231
|
+
I6 extends Input = I & I2 & I3 & I4 & I5,
|
|
232
|
+
I7 extends Input = I & I2 & I3 & I4 & I5 & I6,
|
|
233
|
+
I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7,
|
|
234
|
+
I9 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8,
|
|
235
|
+
R extends HandlerResponse<any> = any,
|
|
236
|
+
R2 extends HandlerResponse<any> = any,
|
|
237
|
+
R3 extends HandlerResponse<any> = any,
|
|
238
|
+
R4 extends HandlerResponse<any> = any,
|
|
239
|
+
R5 extends HandlerResponse<any> = any,
|
|
240
|
+
R6 extends HandlerResponse<any> = any,
|
|
241
|
+
R7 extends HandlerResponse<any> = any,
|
|
242
|
+
R8 extends HandlerResponse<any> = any,
|
|
243
|
+
R9 extends HandlerResponse<any> = any,
|
|
244
|
+
E2 extends Env = E,
|
|
245
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
246
|
+
E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
|
|
247
|
+
E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
|
|
248
|
+
E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
|
|
249
|
+
E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
|
|
250
|
+
E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>,
|
|
251
|
+
E9 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8]>,
|
|
252
|
+
E10 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9]>,
|
|
253
|
+
>(
|
|
254
|
+
handler1: H<E2, P, I, R>,
|
|
255
|
+
handler2: H<E3, P, I2, R2>,
|
|
256
|
+
handler3: H<E4, P, I3, R3>,
|
|
257
|
+
handler4: H<E5, P, I4, R4>,
|
|
258
|
+
handler5: H<E6, P, I5, R5>,
|
|
259
|
+
handler6: H<E7, P, I6, R6>,
|
|
260
|
+
handler7: H<E8, P, I7, R7>,
|
|
261
|
+
handler8: H<E9, P, I8, R8>,
|
|
262
|
+
handler9: H<E10, P, I9, R9>
|
|
263
|
+
): [
|
|
264
|
+
H<E2, P, I, R>,
|
|
265
|
+
H<E3, P, I2, R>,
|
|
266
|
+
H<E4, P, I3, R>,
|
|
267
|
+
H<E5, P, I4, R>,
|
|
268
|
+
H<E6, P, I5, R>,
|
|
269
|
+
H<E7, P, I6, R>,
|
|
270
|
+
H<E8, P, I7, R>,
|
|
271
|
+
H<E9, P, I8, R>,
|
|
272
|
+
H<E10, P, I9, R>,
|
|
273
|
+
]
|
|
274
|
+
|
|
275
|
+
// handler x10
|
|
276
|
+
<
|
|
277
|
+
I extends Input = {},
|
|
278
|
+
I2 extends Input = I,
|
|
279
|
+
I3 extends Input = I & I2,
|
|
280
|
+
I4 extends Input = I & I2 & I3,
|
|
281
|
+
I5 extends Input = I & I2 & I3 & I4,
|
|
282
|
+
I6 extends Input = I & I2 & I3 & I4 & I5,
|
|
283
|
+
I7 extends Input = I & I2 & I3 & I4 & I5 & I6,
|
|
284
|
+
I8 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7,
|
|
285
|
+
I9 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8,
|
|
286
|
+
I10 extends Input = I & I2 & I3 & I4 & I5 & I6 & I7 & I8 & I9,
|
|
287
|
+
R extends HandlerResponse<any> = any,
|
|
288
|
+
R2 extends HandlerResponse<any> = any,
|
|
289
|
+
R3 extends HandlerResponse<any> = any,
|
|
290
|
+
R4 extends HandlerResponse<any> = any,
|
|
291
|
+
R5 extends HandlerResponse<any> = any,
|
|
292
|
+
R6 extends HandlerResponse<any> = any,
|
|
293
|
+
R7 extends HandlerResponse<any> = any,
|
|
294
|
+
R8 extends HandlerResponse<any> = any,
|
|
295
|
+
R9 extends HandlerResponse<any> = any,
|
|
296
|
+
R10 extends HandlerResponse<any> = any,
|
|
297
|
+
E2 extends Env = E,
|
|
298
|
+
E3 extends Env = IntersectNonAnyTypes<[E, E2]>,
|
|
299
|
+
E4 extends Env = IntersectNonAnyTypes<[E, E2, E3]>,
|
|
300
|
+
E5 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4]>,
|
|
301
|
+
E6 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5]>,
|
|
302
|
+
E7 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6]>,
|
|
303
|
+
E8 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7]>,
|
|
304
|
+
E9 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8]>,
|
|
305
|
+
E10 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9]>,
|
|
306
|
+
E11 extends Env = IntersectNonAnyTypes<[E, E2, E3, E4, E5, E6, E7, E8, E9, E10]>,
|
|
307
|
+
>(
|
|
308
|
+
handler1: H<E2, P, I, R>,
|
|
309
|
+
handler2: H<E3, P, I2, R2>,
|
|
310
|
+
handler3: H<E4, P, I3, R3>,
|
|
311
|
+
handler4: H<E5, P, I4, R4>,
|
|
312
|
+
handler5: H<E6, P, I5, R5>,
|
|
313
|
+
handler6: H<E7, P, I6, R6>,
|
|
314
|
+
handler7: H<E8, P, I7, R7>,
|
|
315
|
+
handler8: H<E9, P, I8, R8>,
|
|
316
|
+
handler9: H<E10, P, I9, R9>,
|
|
317
|
+
handler10: H<E11, P, I10, R10>
|
|
318
|
+
): [
|
|
319
|
+
H<E2, P, I, R>,
|
|
320
|
+
H<E3, P, I2, R2>,
|
|
321
|
+
H<E4, P, I3, R3>,
|
|
322
|
+
H<E5, P, I4, R4>,
|
|
323
|
+
H<E6, P, I5, R5>,
|
|
324
|
+
H<E7, P, I6, R6>,
|
|
325
|
+
H<E8, P, I7, R7>,
|
|
326
|
+
H<E9, P, I8, R8>,
|
|
327
|
+
H<E10, P, I9, R9>,
|
|
328
|
+
H<E11, P, I10, R10>,
|
|
329
|
+
]
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
export class Factory<E extends Env = Env, P extends string = string> {
|
|
333
|
+
private initApp?: InitApp<E>
|
|
334
|
+
#defaultAppOptions?: AppOptions<E>
|
|
335
|
+
|
|
336
|
+
constructor(init?: { initApp?: InitApp<E>; defaultAppOptions?: AppOptions<E> }) {
|
|
337
|
+
this.initApp = init?.initApp
|
|
338
|
+
this.#defaultAppOptions = init?.defaultAppOptions
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
createApp = (options?: AppOptions<E>): App<E> => {
|
|
342
|
+
const app = new App<E>(
|
|
343
|
+
(options && this.#defaultAppOptions
|
|
344
|
+
? { ...this.#defaultAppOptions, ...options }
|
|
345
|
+
: (options ?? this.#defaultAppOptions)) as AppOptions<E>
|
|
346
|
+
)
|
|
347
|
+
if (this.initApp) {
|
|
348
|
+
this.initApp(app)
|
|
349
|
+
}
|
|
350
|
+
return app
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
createMiddleware = <I extends Input = {}, R extends HandlerResponse<any> | void = void>(
|
|
354
|
+
middleware: MiddlewareHandler<E, P, I, R extends void ? Response : R>
|
|
355
|
+
): MiddlewareHandler<E, P, I, R extends void ? Response : R> => middleware
|
|
356
|
+
|
|
357
|
+
createHandlers: CreateHandlersInterface<E, P> = (...handlers: any) => {
|
|
358
|
+
// @ts-expect-error this should not be typed
|
|
359
|
+
return handlers.filter((handler) => handler !== undefined)
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export const createFactory = <E extends Env = Env, P extends string = string>(init?: {
|
|
364
|
+
initApp?: InitApp<E>
|
|
365
|
+
defaultAppOptions?: AppOptions<E>
|
|
366
|
+
}): Factory<E, P> => new Factory<E, P>(init)
|
|
367
|
+
|
|
368
|
+
export const createMiddleware = <
|
|
369
|
+
E extends Env = any,
|
|
370
|
+
P extends string = string,
|
|
371
|
+
I extends Input = {},
|
|
372
|
+
R extends HandlerResponse<any> | void = void,
|
|
373
|
+
>(
|
|
374
|
+
middleware: MiddlewareHandler<E, P, I, R extends void ? Response : R>
|
|
375
|
+
): MiddlewareHandler<E, P, I, R extends void ? Response : R> => middleware
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { html, raw } from './index.ts'
|
|
2
|
+
import { HtmlEscapedCallbackPhase, resolveCallback } from '../../utils/html.ts'
|
|
3
|
+
|
|
4
|
+
describe('Tagged Template Literals', () => {
|
|
5
|
+
it('Should escape special characters', () => {
|
|
6
|
+
const name = 'John "Johnny" Smith'
|
|
7
|
+
|
|
8
|
+
expect(html`<p>I'm ${name}.</p>`.toString()).toBe("<p>I'm John "Johnny" Smith.</p>")
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
describe('Booleans, Null, and Undefined Are Ignored', () => {
|
|
12
|
+
it.each([true, false, undefined, null])('%s', (item) => {
|
|
13
|
+
expect(html`${item}`.toString()).toBe('')
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('falsy value', () => {
|
|
17
|
+
expect(html`${0}`.toString()).toBe('0')
|
|
18
|
+
})
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
it('Should call $array.flat(Infinity)', () => {
|
|
22
|
+
const values = [
|
|
23
|
+
'Name:',
|
|
24
|
+
['John "Johnny" Smith', undefined, null],
|
|
25
|
+
' Contact:',
|
|
26
|
+
[html`<a href="http://example.com/">My Website</a>`],
|
|
27
|
+
]
|
|
28
|
+
expect(html`<p>${values}</p>`.toString()).toBe(
|
|
29
|
+
'<p>Name:John "Johnny" Smith Contact:<a href="http://example.com/">My Website</a></p>'
|
|
30
|
+
)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
describe('Promise', () => {
|
|
34
|
+
it('Should return Promise<string> when some variables contains Promise<string> in variables', async () => {
|
|
35
|
+
const name = Promise.resolve('John "Johnny" Smith')
|
|
36
|
+
const res = html`<p>I'm ${name}.</p>`
|
|
37
|
+
expect(res).toBeInstanceOf(Promise)
|
|
38
|
+
|
|
39
|
+
expect((await res).toString()).toBe("<p>I'm John "Johnny" Smith.</p>")
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('Should return raw value when some variables contains Promise<HtmlEscapedString> in variables', async () => {
|
|
43
|
+
const name = Promise.resolve(raw('John "Johnny" Smith'))
|
|
44
|
+
const res = html`<p>I'm ${name}.</p>`
|
|
45
|
+
expect(res).toBeInstanceOf(Promise)
|
|
46
|
+
expect((await res).toString()).toBe('<p>I\'m John "Johnny" Smith.</p>')
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
describe('HtmlEscapedString', () => {
|
|
51
|
+
it('Should preserve callbacks', async () => {
|
|
52
|
+
const name = raw('App', [
|
|
53
|
+
({ buffer }) => {
|
|
54
|
+
if (buffer) {
|
|
55
|
+
buffer[0] = buffer[0].replace('App', 'App!')
|
|
56
|
+
}
|
|
57
|
+
return undefined
|
|
58
|
+
},
|
|
59
|
+
])
|
|
60
|
+
const res = html`<p>I'm ${name}.</p>`
|
|
61
|
+
expect(res).toBeInstanceOf(Promise)
|
|
62
|
+
|
|
63
|
+
expect((await res).toString()).toBe("<p>I'm App.</p>")
|
|
64
|
+
expect(await resolveCallback(await res, HtmlEscapedCallbackPhase.Stringify, false, {})).toBe(
|
|
65
|
+
"<p>I'm App!.</p>"
|
|
66
|
+
)
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
describe('raw', () => {
|
|
72
|
+
it('Should be marked as escaped.', () => {
|
|
73
|
+
const name = 'John "Johnny" Smith'
|
|
74
|
+
expect(html`<p>I'm ${raw(name)}.</p>`.toString()).toBe(
|
|
75
|
+
"<p>I'm John "Johnny" Smith.</p>"
|
|
76
|
+
)
|
|
77
|
+
})
|
|
78
|
+
})
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* html Helper for App.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { escapeToBuffer, raw, resolveCallbackSync, stringBufferToString } from '../../utils/html.ts'
|
|
7
|
+
import type { HtmlEscaped, HtmlEscapedString, StringBufferWithCallbacks } from '../../utils/html.ts'
|
|
8
|
+
|
|
9
|
+
export { raw }
|
|
10
|
+
|
|
11
|
+
export const html = (
|
|
12
|
+
strings: TemplateStringsArray,
|
|
13
|
+
...values: unknown[]
|
|
14
|
+
): HtmlEscapedString | Promise<HtmlEscapedString> => {
|
|
15
|
+
const buffer: StringBufferWithCallbacks = [''] as StringBufferWithCallbacks
|
|
16
|
+
|
|
17
|
+
for (let i = 0, len = strings.length - 1; i < len; i++) {
|
|
18
|
+
buffer[0] += strings[i]
|
|
19
|
+
|
|
20
|
+
const children = Array.isArray(values[i])
|
|
21
|
+
? (values[i] as Array<unknown>).flat(Infinity)
|
|
22
|
+
: [values[i]]
|
|
23
|
+
for (let i = 0, len = children.length; i < len; i++) {
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
const child = children[i] as any
|
|
26
|
+
if (typeof child === 'string') {
|
|
27
|
+
escapeToBuffer(child, buffer)
|
|
28
|
+
} else if (typeof child === 'number') {
|
|
29
|
+
;(buffer[0] as string) += child
|
|
30
|
+
} else if (typeof child === 'boolean' || child === null || child === undefined) {
|
|
31
|
+
continue
|
|
32
|
+
} else if (typeof child === 'object' && (child as HtmlEscaped).isEscaped) {
|
|
33
|
+
if ((child as HtmlEscapedString).callbacks) {
|
|
34
|
+
buffer.unshift('', child)
|
|
35
|
+
} else {
|
|
36
|
+
const tmp = child.toString()
|
|
37
|
+
if (tmp instanceof Promise) {
|
|
38
|
+
buffer.unshift('', tmp)
|
|
39
|
+
} else {
|
|
40
|
+
buffer[0] += tmp
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
} else if (child instanceof Promise) {
|
|
44
|
+
buffer.unshift('', child)
|
|
45
|
+
} else {
|
|
46
|
+
escapeToBuffer(child.toString(), buffer)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
buffer[0] += strings.at(-1) as string
|
|
51
|
+
|
|
52
|
+
return buffer.length === 1
|
|
53
|
+
? 'callbacks' in buffer
|
|
54
|
+
? raw(resolveCallbackSync(raw(buffer[0], buffer.callbacks)))
|
|
55
|
+
: raw(buffer[0])
|
|
56
|
+
: stringBufferToString(buffer, buffer.callbacks)
|
|
57
|
+
}
|