acrylblends 0.2.0 → 0.4.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/dist/index.d.ts +22 -16
- package/dist/index.js +65 -20
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/plugins/acryl-inspect/LICENSE +21 -0
- package/plugins/acryl-inspect/plugin.json +12 -0
- package/plugins/acryl-inspect/src/index.ts +3 -0
- package/plugins/acryl-inspect/src/report.ts +126 -0
- package/plugins/acryl-inspect/src/service.ts +68 -0
- package/plugins/acryl-inspect/tests/report.spec.ts +63 -0
- package/plugins/acryl-inspect/tests/service.spec.ts +121 -0
- package/plugins/acryl-inspect/upstream.json +18 -0
- package/plugins/acryl-node-server/LICENSE +47 -0
- package/plugins/acryl-node-server/plugin.json +13 -0
- 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 +107 -0
- 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 +141 -0
- package/plugins/acryl-node-server/upstream.json +18 -0
- package/plugins/acryl-router/LICENSE +47 -0
- package/plugins/acryl-router/plugin.json +13 -0
- 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 -0
- package/plugins/acryl-router/src/helpers/schema-validator.ts +35 -0
- package/plugins/acryl-router/src/index.ts +6 -0
- package/plugins/acryl-router/src/middleware/index.ts +25 -0
- package/plugins/acryl-router/src/middleware/loopback-only.ts +88 -0
- package/plugins/acryl-router/src/service.ts +356 -0
- package/plugins/acryl-router/tests/docs-examples.spec.ts +152 -0
- package/plugins/acryl-router/tests/live-install.spec.ts +64 -0
- package/plugins/acryl-router/tests/loader.spec.ts +72 -0
- package/plugins/acryl-router/tests/service.spec.ts +409 -0
- package/plugins/acryl-router/tests/shadow-state.spec.ts +79 -0
- package/plugins/acryl-router/upstream.json +20 -0
- package/plugins/acryl-router-http/LICENSE +21 -0
- package/plugins/acryl-router-http/plugin.json +12 -0
- package/plugins/acryl-router-http/src/bridge.ts +54 -0
- package/plugins/acryl-router-http/src/index.ts +63 -0
- package/plugins/acryl-router-http/src/serve.ts +24 -0
- package/plugins/acryl-router-http/tests/adapter.spec.ts +174 -0
- package/plugins/acryl-router-http/tests/stream.spec.ts +133 -0
- package/plugins/acryl-router-http/tests/surfaces.spec.ts +101 -0
- package/plugins/acryl-router-http/upstream.json +22 -0
- package/plugins/acryl-state/LICENSE +21 -0
- package/plugins/acryl-state/NOTICE +30 -0
- package/plugins/acryl-state/plugin.json +12 -0
- package/plugins/acryl-state/src/cell.ts +67 -0
- package/plugins/acryl-state/src/index.ts +3 -0
- package/plugins/acryl-state/src/react.ts +11 -0
- package/plugins/acryl-state/src/service.ts +119 -0
- package/plugins/acryl-state/tests/cell.spec.ts +71 -0
- package/plugins/acryl-state/tests/react.spec.ts +39 -0
- package/plugins/acryl-state/tests/service.spec.ts +132 -0
- package/plugins/acryl-state/upstream.json +22 -0
- package/plugins/builder/script.ts +6 -10
- package/plugins/extensions/index.ts +20 -3
- package/plugins/extensions/resolve.ts +28 -3
- package/plugins/openai/prompt.ts +12 -6
- package/plugins/tasks/index.ts +14 -0
- package/plugins/tsconfig.json +14 -5
- package/templates/agent/blend.yaml +5 -7
- package/templates/agent/src/app.ts +8 -8
- package/templates/agent/src/routes.ts +39 -38
- package/templates/agent/template.json +3 -3
- package/templates/agent/test/builder.test.ts +22 -14
- package/templates/agent/test/model.test.ts +3 -3
- package/templates/agent/tsconfig.json +8 -5
- package/templates/{app → blank}/blend.yaml +3 -3
- package/templates/{app → blank}/src/app.ts +5 -5
- package/templates/blank/src/routes.ts +16 -0
- package/templates/blank/template.json +1 -0
- package/templates/{app → blank}/test/app.test.ts +1 -1
- package/templates/{app → blank}/tsconfig.json +2 -4
- package/templates/todo/README.md +27 -0
- package/templates/todo/blend.yaml +25 -0
- package/templates/todo/gitignore +2 -0
- package/templates/todo/package.json +23 -0
- package/templates/todo/src/app.ts +71 -0
- package/templates/todo/src/main.ts +19 -0
- package/templates/todo/src/page.ts +28 -0
- package/templates/todo/src/todo.ts +123 -0
- package/templates/todo/template.json +1 -0
- package/templates/todo/test/todo.test.ts +145 -0
- package/templates/todo/tsconfig.json +17 -0
- package/templates/todo/upstream.json +12 -0
- package/plugins/events/index.ts +0 -42
- package/plugins/events/plugin.json +0 -9
- package/plugins/http/index.ts +0 -64
- package/plugins/http/plugin.json +0 -10
- package/plugins/server/index.ts +0 -138
- package/plugins/server/plugin.json +0 -10
- package/templates/app/src/routes.ts +0 -14
- package/templates/app/template.json +0 -1
- /package/templates/{app → blank}/README.md +0 -0
- /package/templates/{app → blank}/gitignore +0 -0
- /package/templates/{app → blank}/package.json +0 -0
- /package/templates/{app → blank}/src/main.ts +0 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { Context } from '../context.ts'
|
|
2
|
+
import { getCookie } from '../helper/cookie/index.ts'
|
|
3
|
+
import { HTTPException } from '../http-exception.ts'
|
|
4
|
+
import type { Env, MiddlewareHandler, TypedResponse, ValidationTargets, FormValue } from '../types.ts'
|
|
5
|
+
import type { BodyData } from '../utils/body.ts'
|
|
6
|
+
import { bufferToFormData } from '../utils/buffer.ts'
|
|
7
|
+
import type { InferInput } from './utils.ts'
|
|
8
|
+
|
|
9
|
+
type ValidationTargetKeysWithBody = 'form' | 'json'
|
|
10
|
+
type ValidationTargetByMethod<M> = M extends 'get' | 'head' // GET and HEAD request must not have a body content.
|
|
11
|
+
? Exclude<keyof ValidationTargets, ValidationTargetKeysWithBody>
|
|
12
|
+
: keyof ValidationTargets
|
|
13
|
+
|
|
14
|
+
export type ValidationFunction<
|
|
15
|
+
InputType,
|
|
16
|
+
OutputType,
|
|
17
|
+
E extends Env = {},
|
|
18
|
+
P extends string = string,
|
|
19
|
+
> = (
|
|
20
|
+
value: InputType,
|
|
21
|
+
c: Context<E, P>
|
|
22
|
+
) => OutputType | TypedResponse | Promise<OutputType> | Promise<TypedResponse>
|
|
23
|
+
|
|
24
|
+
const jsonRegex = /^application\/([a-z-\.]+\+)?json(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/i
|
|
25
|
+
const multipartRegex = /^multipart\/form-data(;\s?boundary=[a-zA-Z0-9'"()+_,\-./:=?]+)?$/i
|
|
26
|
+
const urlencodedRegex = /^application\/x-www-form-urlencoded(;\s*[a-zA-Z0-9\-]+\=([^;]+))*$/i
|
|
27
|
+
|
|
28
|
+
export type ExtractValidationResponse<VF> = VF extends (value: any, c: any) => infer R
|
|
29
|
+
? R extends Promise<infer PR>
|
|
30
|
+
? PR extends TypedResponse<infer T, infer S, infer F>
|
|
31
|
+
? TypedResponse<T, S, F>
|
|
32
|
+
: PR extends Response
|
|
33
|
+
? PR
|
|
34
|
+
: PR extends undefined
|
|
35
|
+
? never // undefined → never
|
|
36
|
+
: never // anything else → never
|
|
37
|
+
: R extends TypedResponse<infer T, infer S, infer F>
|
|
38
|
+
? TypedResponse<T, S, F>
|
|
39
|
+
: R extends Response
|
|
40
|
+
? R
|
|
41
|
+
: R extends undefined
|
|
42
|
+
? never // undefined → never
|
|
43
|
+
: never // anything else → never
|
|
44
|
+
: never // Can't extract → never
|
|
45
|
+
|
|
46
|
+
export const validator = <
|
|
47
|
+
InputType,
|
|
48
|
+
P extends string,
|
|
49
|
+
M extends string,
|
|
50
|
+
U extends ValidationTargetByMethod<M>,
|
|
51
|
+
P2 extends string = P,
|
|
52
|
+
// Capture the actual validation function as a type
|
|
53
|
+
VF extends (
|
|
54
|
+
value: unknown extends InputType ? ValidationTargets[U] : InputType,
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
56
|
+
c: Context<any, P2>
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
58
|
+
) => any = (
|
|
59
|
+
value: unknown extends InputType ? ValidationTargets[U] : InputType,
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
c: Context<any, P2>
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
) => any,
|
|
64
|
+
V extends {
|
|
65
|
+
in: {
|
|
66
|
+
[K in U]: K extends 'json'
|
|
67
|
+
? unknown extends InputType
|
|
68
|
+
? ExtractValidatorOutput<VF>
|
|
69
|
+
: InputType
|
|
70
|
+
: InferInput<ExtractValidatorOutput<VF>, K, FormValue>
|
|
71
|
+
}
|
|
72
|
+
out: { [K in U]: ExtractValidatorOutput<VF> }
|
|
73
|
+
} = {
|
|
74
|
+
in: {
|
|
75
|
+
[K in U]: K extends 'json'
|
|
76
|
+
? unknown extends InputType
|
|
77
|
+
? ExtractValidatorOutput<VF>
|
|
78
|
+
: InputType
|
|
79
|
+
: InferInput<ExtractValidatorOutput<VF>, K, FormValue>
|
|
80
|
+
}
|
|
81
|
+
out: { [K in U]: ExtractValidatorOutput<VF> }
|
|
82
|
+
},
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
84
|
+
E extends Env = any,
|
|
85
|
+
>(
|
|
86
|
+
target: U,
|
|
87
|
+
validationFunc: VF
|
|
88
|
+
): MiddlewareHandler<E, P, V, ExtractValidationResponse<VF>> => {
|
|
89
|
+
return async (c, next) => {
|
|
90
|
+
let value = {}
|
|
91
|
+
const contentType = c.req.header('Content-Type')
|
|
92
|
+
|
|
93
|
+
switch (target) {
|
|
94
|
+
case 'json':
|
|
95
|
+
if (!contentType || !jsonRegex.test(contentType)) {
|
|
96
|
+
break
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
value = await c.req.json()
|
|
100
|
+
} catch {
|
|
101
|
+
const message = 'Malformed JSON in request body'
|
|
102
|
+
throw new HTTPException(400, { message })
|
|
103
|
+
}
|
|
104
|
+
break
|
|
105
|
+
case 'form': {
|
|
106
|
+
if (
|
|
107
|
+
!contentType ||
|
|
108
|
+
!(multipartRegex.test(contentType) || urlencodedRegex.test(contentType))
|
|
109
|
+
) {
|
|
110
|
+
break
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let formData: FormData
|
|
114
|
+
|
|
115
|
+
if (c.req.bodyCache.formData) {
|
|
116
|
+
formData = await c.req.bodyCache.formData
|
|
117
|
+
} else {
|
|
118
|
+
try {
|
|
119
|
+
const arrayBuffer = await c.req.arrayBuffer()
|
|
120
|
+
formData = await bufferToFormData(arrayBuffer, contentType)
|
|
121
|
+
c.req.bodyCache.formData = formData
|
|
122
|
+
} catch (e) {
|
|
123
|
+
let message = 'Malformed FormData request.'
|
|
124
|
+
message += e instanceof Error ? ` ${e.message}` : ` ${String(e)}`
|
|
125
|
+
throw new HTTPException(400, { message })
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const form: BodyData<{ all: true }> = Object.create(null)
|
|
130
|
+
formData.forEach((value, key) => {
|
|
131
|
+
if (key.endsWith('[]')) {
|
|
132
|
+
;((form[key] ??= []) as unknown[]).push(value)
|
|
133
|
+
} else if (Array.isArray(form[key])) {
|
|
134
|
+
;(form[key] as unknown[]).push(value)
|
|
135
|
+
} else if (Object.hasOwn(form, key)) {
|
|
136
|
+
form[key] = [form[key] as string | File, value]
|
|
137
|
+
} else {
|
|
138
|
+
form[key] = value
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
value = form
|
|
142
|
+
break
|
|
143
|
+
}
|
|
144
|
+
case 'query':
|
|
145
|
+
value = Object.fromEntries(
|
|
146
|
+
Object.entries(c.req.queries()).map(([k, v]) => {
|
|
147
|
+
return v.length === 1 ? [k, v[0]] : [k, v]
|
|
148
|
+
})
|
|
149
|
+
)
|
|
150
|
+
break
|
|
151
|
+
case 'param':
|
|
152
|
+
value = c.req.param() as Record<string, string>
|
|
153
|
+
break
|
|
154
|
+
case 'header':
|
|
155
|
+
value = c.req.header()
|
|
156
|
+
break
|
|
157
|
+
case 'cookie':
|
|
158
|
+
value = getCookie(c)
|
|
159
|
+
break
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const res = await validationFunc(value as never, c as never)
|
|
163
|
+
|
|
164
|
+
if (res instanceof Response) {
|
|
165
|
+
return res as ExtractValidationResponse<VF>
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
c.req.addValidatedData(target, res as never)
|
|
169
|
+
|
|
170
|
+
return (await next()) as ExtractValidationResponse<VF>
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
175
|
+
export type ExtractValidatorOutput<VF> = VF extends (value: any, c: any) => infer R
|
|
176
|
+
? R extends Promise<infer PR>
|
|
177
|
+
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
178
|
+
PR extends Response | TypedResponse<any, any, any>
|
|
179
|
+
? never
|
|
180
|
+
: PR
|
|
181
|
+
: // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
182
|
+
R extends Response | TypedResponse<any, any, any>
|
|
183
|
+
? never
|
|
184
|
+
: R
|
|
185
|
+
: never
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { getConnInfo, connectionOf } from '../connection.ts'
|
|
2
|
+
export type { AddressType, ConnInfo, GetConnInfo, NetAddrInfo } from '../core/helper/conninfo/index.ts'
|
|
3
|
+
export { accepts } from '../core/helper/accepts/index.ts'
|
|
4
|
+
export { createFactory, createMiddleware, Factory } from '../core/helper/factory/index.ts'
|
|
5
|
+
export { deleteCookie, generateCookie, generateSignedCookie, getCookie, getSignedCookie, setCookie, setSignedCookie } from '../core/helper/cookie/index.ts'
|
|
6
|
+
export { getExtension, getMimeType, mimes, type BaseMime } from '../core/utils/mime.ts'
|
|
7
|
+
export { html, raw } from '../core/helper/html/index.ts'
|
|
8
|
+
export { matchedRoutes, routePath, baseRoutePath, basePath } from '../core/helper/route/index.ts'
|
|
9
|
+
export { testClient } from '../core/helper/testing/index.ts'
|
|
10
|
+
export { stream, streamSSE, streamText, SSEStreamingApi, type SSEMessage } from '../core/helper/streaming/index.ts'
|
|
11
|
+
export { validator, type ValidationFunction } from '../core/validator/index.ts'
|
|
12
|
+
export { schemaValidator, type StandardSchema } from './schema-validator.ts'
|
|
13
|
+
export { createWSMessageEvent, defineWebSocketHelper, WSContext, type SendOptions, type UpgradeWebSocket, type WSContextInit, type WSEvents, type WSMessageReceive, type WSReadyState } from '../core/helper/websocket/index.ts'
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Env, MiddlewareHandler, ValidationTargets } from '../core/types.ts'
|
|
2
|
+
import { validator } from '../core/validator/index.ts'
|
|
3
|
+
|
|
4
|
+
/** The slice of the Standard Schema interface this needs; Schemastery (what Cordis uses), Zod and Valibot all implement it. */
|
|
5
|
+
export interface StandardSchema<T = unknown> {
|
|
6
|
+
readonly '~standard': {
|
|
7
|
+
validate(value: unknown): StandardResult<T> | Promise<StandardResult<T>>
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type StandardResult<T> =
|
|
12
|
+
| { readonly value: T, readonly issues?: undefined }
|
|
13
|
+
| { readonly issues: readonly { readonly message: string, readonly path?: readonly unknown[] | undefined }[] }
|
|
14
|
+
|
|
15
|
+
const pathOf = (path: readonly unknown[] | undefined): string =>
|
|
16
|
+
(path ?? []).map(part => String(typeof part === 'object' && part !== null && 'key' in part ? (part as { key: unknown }).key : part)).join('.')
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The core `validator` driven by a Standard Schema. A failure answers 400 with `{ error, issues }`; success makes the parsed value the
|
|
20
|
+
* handler's `c.req.valid(target)`, typed by the schema.
|
|
21
|
+
*/
|
|
22
|
+
export function schemaValidator<Target extends keyof ValidationTargets, Out, E extends Env = Env, P extends string = string>(
|
|
23
|
+
target: Target,
|
|
24
|
+
schema: StandardSchema<Out>,
|
|
25
|
+
): MiddlewareHandler<E, P, { in: { [K in Target]: Out }, out: { [K in Target]: Out } }> {
|
|
26
|
+
const middleware = validator(target, async (value, c) => {
|
|
27
|
+
const result = await schema['~standard'].validate(value)
|
|
28
|
+
if (result.issues !== undefined) {
|
|
29
|
+
return c.json({ error: `invalid ${target}`, issues: result.issues.map(issue => ({ message: issue.message, path: pathOf(issue.path) })) }, 400)
|
|
30
|
+
}
|
|
31
|
+
return result.value
|
|
32
|
+
})
|
|
33
|
+
// The core infers its own input and output types from the function; the schema's output type is the one a handler should see.
|
|
34
|
+
return middleware as unknown as MiddlewareHandler<E, P, { in: { [K in Target]: Out }, out: { [K in Target]: Out } }>
|
|
35
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Router, Config, apply, name, type MountableApp, type RouterHttpService, type TrailingSlash } from './service.ts'
|
|
2
|
+
export { connectionOf, getConnInfo, type ConnectionInfo, type RouterBindings, type RouterEnv } from './connection.ts'
|
|
3
|
+
export { App, Context } from './core/index.ts'
|
|
4
|
+
export type { AppRequest, ContextRenderer, ContextVariableMap, Env, ErrorHandler, ExecutionContext, Handler, Input, MiddlewareHandler, Next, NotFoundHandler, NotFoundResponse, Schema, ToSchema, TypedResponse, ValidationTargets } from './core/index.ts'
|
|
5
|
+
export { HTTPException } from './core/http-exception.ts'
|
|
6
|
+
export type { ContentfulStatusCode, StatusCode } from './core/utils/http-status.ts'
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { basicAuth } from '../core/middleware/basic-auth/index.ts'
|
|
2
|
+
export { bearerAuth } from '../core/middleware/bearer-auth/index.ts'
|
|
3
|
+
export { bodyLimit } from '../core/middleware/body-limit/index.ts'
|
|
4
|
+
export { every, except, some } from '../core/middleware/combine/index.ts'
|
|
5
|
+
export { compress } from '../core/middleware/compress/index.ts'
|
|
6
|
+
export { contextStorage, getContext, tryGetContext } from '../core/middleware/context-storage/index.ts'
|
|
7
|
+
export { cors } from '../core/middleware/cors/index.ts'
|
|
8
|
+
export { csrf } from '../core/middleware/csrf/index.ts'
|
|
9
|
+
export { etag } from '../core/middleware/etag/index.ts'
|
|
10
|
+
export { jwk } from '../core/middleware/jwk/index.ts'
|
|
11
|
+
export { AlgorithmTypes, decode, jwt, sign, verify, verifyWithJwks, type JwtVariables } from '../core/middleware/jwt/index.ts'
|
|
12
|
+
export { ipRestriction, type IPRestrictionRule, type IPRestrictionRules } from '../core/middleware/ip-restriction/index.ts'
|
|
13
|
+
export { detectFromCookie, detectFromHeader, detectFromPath, detectFromQuery, languageDetector } from '../core/middleware/language/index.ts'
|
|
14
|
+
export { logger } from '../core/middleware/logger/index.ts'
|
|
15
|
+
export { methodNotAllowed } from '../core/middleware/method-not-allowed/index.ts'
|
|
16
|
+
export { methodOverride } from '../core/middleware/method-override/index.ts'
|
|
17
|
+
export { poweredBy } from '../core/middleware/powered-by/index.ts'
|
|
18
|
+
export { prettyJSON } from '../core/middleware/pretty-json/index.ts'
|
|
19
|
+
export { requestId, type RequestIdVariables } from '../core/middleware/request-id/index.ts'
|
|
20
|
+
export { serveStatic, type ServeStaticOptions } from '../core/middleware/serve-static/index.ts'
|
|
21
|
+
export { NONCE, secureHeaders, type SecureHeadersVariables } from '../core/middleware/secure-headers/index.ts'
|
|
22
|
+
export { timeout } from '../core/middleware/timeout/index.ts'
|
|
23
|
+
export { endTime, setMetric, startTime, timing, wrapTime, type TimingVariables } from '../core/middleware/timing/index.ts'
|
|
24
|
+
export { appendTrailingSlash, trimTrailingSlash } from '../core/middleware/trailing-slash/index.ts'
|
|
25
|
+
export { LOOPBACK_HOSTNAMES, loopbackAuthority, loopbackOnly, sameOrigin, type LoopbackOptions } from './loopback-only.ts'
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { BlockList, isIP } from 'node:net'
|
|
2
|
+
import { connectionOf } from '../connection.ts'
|
|
3
|
+
import type { Context } from '../core/context.ts'
|
|
4
|
+
import type { MiddlewareHandler } from '../core/types.ts'
|
|
5
|
+
|
|
6
|
+
export interface LoopbackOptions {
|
|
7
|
+
/** Hostnames a `Host` header may name. Default: the loopback names `127.0.0.1`, `localhost` and `[::1]`. */
|
|
8
|
+
readonly hostnames?: readonly string[]
|
|
9
|
+
/**
|
|
10
|
+
* What a request that changes things (not GET, HEAD or OPTIONS) must show: `same-origin` (default) refuses an `Origin` header that is not this same
|
|
11
|
+
* authority (including `null`), which stops another web page from driving a local app. A browser always sends `Origin` on a cross-origin change, so a
|
|
12
|
+
* request with no `Origin` (curl, a script) is allowed: the `Host` it names is already checked to be a loopback address with this server's port, which
|
|
13
|
+
* is what stops DNS rebinding. `none` checks only the peer and the `Host`.
|
|
14
|
+
*/
|
|
15
|
+
readonly mutations?: 'same-origin' | 'none'
|
|
16
|
+
/**
|
|
17
|
+
* A call made inside the process (the terminal UI, a test) has no socket, so no peer to check. `deny` (default) refuses it, the safe choice for a route
|
|
18
|
+
* that guards something; `allow` lets it through for routes whose in-process caller is the host's own code. A request that came over a socket is always
|
|
19
|
+
* checked in full: only a call with no connection facts at all counts as in process.
|
|
20
|
+
*/
|
|
21
|
+
readonly inProcess?: 'deny' | 'allow'
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const loopback = new BlockList()
|
|
25
|
+
loopback.addSubnet('127.0.0.0', 8, 'ipv4')
|
|
26
|
+
loopback.addSubnet('::1', 128, 'ipv6')
|
|
27
|
+
|
|
28
|
+
const SAFE_METHODS = new Set(['GET', 'HEAD', 'OPTIONS'])
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The authority a loopback request addressed: the `Host` header as a URL, or `undefined` when the request does not come from a loopback peer to the
|
|
32
|
+
* real local port, names another host, or is marked cross-site by the browser. The peer and the port come from the transport (`connectionOf(c)`), never
|
|
33
|
+
* from a header; an in-process call has neither and is refused.
|
|
34
|
+
*/
|
|
35
|
+
export const LOOPBACK_HOSTNAMES: readonly string[] = ['127.0.0.1', 'localhost', '[::1]']
|
|
36
|
+
|
|
37
|
+
export function loopbackAuthority(c: Context, hostnames: readonly string[] = LOOPBACK_HOSTNAMES): URL | undefined {
|
|
38
|
+
const { remoteAddress, localPort } = connectionOf(c)
|
|
39
|
+
const host = c.req.header('host')
|
|
40
|
+
if (remoteAddress === undefined || localPort === undefined || host === undefined) return undefined
|
|
41
|
+
const address = (remoteAddress.replace(/^\[|\]$/gu, '').split('%', 1)[0] ?? '').replace(/^::ffff:/iu, '')
|
|
42
|
+
const family = isIP(address)
|
|
43
|
+
if (family === 0 || !loopback.check(address, family === 4 ? 'ipv4' : 'ipv6')) return undefined
|
|
44
|
+
let authority: URL
|
|
45
|
+
try {
|
|
46
|
+
authority = new URL(`http://${host}`)
|
|
47
|
+
} catch {
|
|
48
|
+
return undefined
|
|
49
|
+
}
|
|
50
|
+
if (
|
|
51
|
+
authority.protocol !== 'http:'
|
|
52
|
+
|| Number(authority.port || '80') !== localPort
|
|
53
|
+
|| !hostnames.includes(authority.hostname)
|
|
54
|
+
|| c.req.header('sec-fetch-site') === 'cross-site'
|
|
55
|
+
) return undefined
|
|
56
|
+
return authority
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Whether a changing request is acceptable by its `Origin`: absent (not a browser cross-origin change) or naming this same authority. `null` and any other origin are not. */
|
|
60
|
+
export function sameOrigin(c: Context, authority: URL): boolean {
|
|
61
|
+
const origin = c.req.header('origin')
|
|
62
|
+
if (origin === undefined) return true
|
|
63
|
+
try {
|
|
64
|
+
const parsed = new URL(origin)
|
|
65
|
+
return parsed.protocol === 'http:' && parsed.host === authority.host && parsed.pathname === '/'
|
|
66
|
+
} catch {
|
|
67
|
+
return false
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Only requests from this machine to this app: loopback peer, the real port, an allowed `Host`, and for mutations a matching `Origin`. Everything else gets a 403. */
|
|
72
|
+
export function loopbackOnly(options: LoopbackOptions = {}): MiddlewareHandler {
|
|
73
|
+
const mutations = options.mutations ?? 'same-origin'
|
|
74
|
+
const inProcess = options.inProcess ?? 'deny'
|
|
75
|
+
return async (c, next) => {
|
|
76
|
+
const connection = connectionOf(c)
|
|
77
|
+
if (inProcess === 'allow' && connection.remoteAddress === undefined && connection.localPort === undefined) {
|
|
78
|
+
await next()
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
const authority = loopbackAuthority(c, options.hostnames)
|
|
82
|
+
if (authority === undefined) return c.json({ error: 'request authority rejected' }, 403)
|
|
83
|
+
if (mutations === 'same-origin' && !SAFE_METHODS.has(c.req.method) && !sameOrigin(c, authority)) {
|
|
84
|
+
return c.json({ error: 'a change must come from this app\'s own origin' }, 403)
|
|
85
|
+
}
|
|
86
|
+
await next()
|
|
87
|
+
}
|
|
88
|
+
}
|