wrangler 0.0.0-e6733a3 → 0.0.0-e7a0cd5b
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/Cloudflare_CA.pem +18 -0
- package/README.md +47 -14
- package/bin/wrangler.js +160 -28
- package/kv-asset-handler.js +1 -0
- package/miniflare-dist/index.mjs +6316 -0
- package/package.json +190 -124
- package/src/__tests__/access.test.ts +25 -0
- package/src/__tests__/api-dev.test.ts +209 -0
- package/src/__tests__/api-devregistry.test.js +57 -0
- package/src/__tests__/api.test.ts +80 -0
- package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
- package/src/__tests__/config-cache.test.ts +42 -0
- package/src/__tests__/configuration.test.ts +4028 -0
- package/src/__tests__/d1.test.ts +72 -0
- package/src/__tests__/delete.test.ts +230 -0
- package/src/__tests__/deployments.test.ts +95 -0
- package/src/__tests__/dev.test.tsx +1505 -62
- package/src/__tests__/dialogs.test.tsx +40 -0
- package/src/__tests__/generate.test.ts +235 -0
- package/src/__tests__/get-host-from-url.test.ts +16 -0
- package/src/__tests__/guess-worker-format.test.ts +85 -0
- package/src/__tests__/{clipboardy-mock.js → helpers/clipboardy-mock.js} +0 -0
- package/src/__tests__/helpers/cmd-shim.d.ts +11 -0
- package/src/__tests__/helpers/mock-account-id.ts +48 -0
- package/src/__tests__/helpers/mock-bin.ts +36 -0
- package/src/__tests__/helpers/mock-cfetch.ts +333 -0
- package/src/__tests__/helpers/mock-console.ts +106 -0
- package/src/__tests__/helpers/mock-dialogs.ts +153 -0
- package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
- package/src/__tests__/helpers/mock-http-server.ts +46 -0
- package/src/__tests__/helpers/mock-istty.ts +74 -0
- package/src/__tests__/helpers/mock-known-routes.ts +7 -0
- package/src/__tests__/helpers/mock-kv.ts +33 -0
- package/src/__tests__/helpers/mock-oauth-flow.ts +252 -0
- package/src/__tests__/helpers/mock-process.ts +39 -0
- package/src/__tests__/helpers/mock-stdin.ts +108 -0
- package/src/__tests__/helpers/mock-web-socket.ts +29 -0
- package/src/__tests__/helpers/msw/handlers/access.ts +13 -0
- package/src/__tests__/helpers/msw/handlers/deployments.ts +59 -0
- package/src/__tests__/helpers/msw/handlers/namespaces.ts +104 -0
- package/src/__tests__/helpers/msw/handlers/oauth.ts +36 -0
- package/src/__tests__/helpers/msw/handlers/r2.ts +80 -0
- package/src/__tests__/helpers/msw/handlers/script.ts +75 -0
- package/src/__tests__/helpers/msw/handlers/user.ts +63 -0
- package/src/__tests__/helpers/msw/handlers/zones.ts +22 -0
- package/src/__tests__/helpers/msw/index.ts +21 -0
- package/src/__tests__/helpers/run-in-tmp.ts +38 -0
- package/src/__tests__/helpers/run-wrangler.ts +16 -0
- package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
- package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
- package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
- package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
- package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
- package/src/__tests__/helpers/write-worker-source.ts +31 -0
- package/src/__tests__/helpers/write-wrangler-toml.ts +17 -0
- package/src/__tests__/https-options.test.ts +163 -0
- package/src/__tests__/index.test.ts +259 -284
- package/src/__tests__/init.test.ts +2900 -0
- package/src/__tests__/jest.setup.ts +190 -10
- package/src/__tests__/kv.test.ts +1668 -1091
- package/src/__tests__/logger.test.ts +141 -0
- package/src/__tests__/metrics.test.ts +450 -0
- package/src/__tests__/middleware.scheduled.test.ts +135 -0
- package/src/__tests__/middleware.test.ts +726 -0
- package/src/__tests__/package-manager.test.ts +353 -0
- package/src/__tests__/pages.test.ts +2223 -0
- package/src/__tests__/parse.test.ts +330 -0
- package/src/__tests__/paths.test.ts +39 -0
- package/src/__tests__/publish.test.ts +7660 -0
- package/src/__tests__/pubsub.test.ts +370 -0
- package/src/__tests__/queues.test.ts +371 -0
- package/src/__tests__/r2.test.ts +376 -0
- package/src/__tests__/route.test.ts +45 -0
- package/src/__tests__/secret.test.ts +644 -0
- package/src/__tests__/tail.test.ts +800 -0
- package/src/__tests__/test-old-node-version.js +31 -0
- package/src/__tests__/type-generation.test.ts +217 -0
- package/src/__tests__/user.test.ts +155 -0
- package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
- package/src/__tests__/validate-dev-props.test.ts +56 -0
- package/src/__tests__/version.test.ts +35 -0
- package/src/__tests__/whoami.test.tsx +278 -0
- package/src/__tests__/worker-namespace.test.ts +326 -0
- package/src/abort.d.ts +3 -0
- package/src/api/dev.ts +208 -0
- package/src/api/index.ts +2 -0
- package/src/bundle-reporter.tsx +68 -0
- package/src/bundle.ts +785 -0
- package/src/cfetch/index.ts +128 -70
- package/src/cfetch/internal.ts +240 -46
- package/src/cli.ts +25 -6
- package/src/config/README.md +107 -0
- package/src/config/config.ts +275 -0
- package/src/config/diagnostics.ts +80 -0
- package/src/config/environment.ts +563 -0
- package/src/config/index.ts +342 -0
- package/src/config/validation-helpers.ts +597 -0
- package/src/config/validation.ts +2113 -0
- package/src/config-cache.ts +85 -0
- package/src/create-worker-preview.ts +282 -0
- package/src/create-worker-upload-form.ts +321 -0
- package/src/d1/backups.tsx +218 -0
- package/src/d1/create.tsx +54 -0
- package/src/d1/delete.tsx +56 -0
- package/src/d1/execute.tsx +299 -0
- package/src/d1/formatTimeAgo.ts +14 -0
- package/src/d1/index.ts +76 -0
- package/src/d1/list.tsx +48 -0
- package/src/d1/options.ts +12 -0
- package/src/d1/types.tsx +14 -0
- package/src/d1/utils.ts +39 -0
- package/src/delete.ts +108 -0
- package/src/deployments.ts +74 -0
- package/src/deprecated/index.ts +438 -0
- package/src/dev/dev-vars.ts +39 -0
- package/src/dev/dev.tsx +587 -0
- package/src/dev/get-local-persistence-path.tsx +31 -0
- package/src/dev/local.tsx +717 -0
- package/src/dev/remote.tsx +603 -0
- package/src/dev/start-server.ts +513 -0
- package/src/dev/use-esbuild.ts +204 -0
- package/src/dev/validate-dev-props.ts +31 -0
- package/src/dev-registry.tsx +201 -0
- package/src/dev.tsx +848 -750
- package/src/dialogs.tsx +146 -60
- package/src/dispatch-namespace.ts +207 -0
- package/src/durable.ts +102 -0
- package/src/entry.ts +329 -0
- package/src/environment-variables.ts +50 -0
- package/src/errors.ts +11 -0
- package/src/git-client.ts +124 -0
- package/src/global-wrangler-config-path.ts +26 -0
- package/src/https-options.ts +127 -0
- package/src/index.tsx +669 -1959
- package/src/init.ts +970 -0
- package/src/inspect.ts +720 -477
- package/src/intl-polyfill.d.ts +139 -0
- package/src/is-ci.ts +14 -0
- package/src/is-interactive.ts +16 -0
- package/src/kv/helpers.ts +430 -0
- package/src/kv/index.ts +596 -0
- package/src/logger.ts +92 -0
- package/src/metrics/index.ts +5 -0
- package/src/metrics/metrics-config.ts +239 -0
- package/src/metrics/metrics-dispatcher.ts +96 -0
- package/src/metrics/metrics-usage-headers.ts +24 -0
- package/src/metrics/send-event.ts +94 -0
- package/src/miniflare-cli/README.md +30 -0
- package/src/miniflare-cli/assets.ts +215 -0
- package/src/miniflare-cli/index.ts +213 -0
- package/src/miniflare-cli/request-context.ts +40 -0
- package/src/module-collection.ts +256 -53
- package/src/open-in-browser.ts +17 -0
- package/src/package-manager.ts +219 -0
- package/src/pages/build.tsx +238 -0
- package/src/pages/constants.ts +18 -0
- package/src/pages/deployments.tsx +106 -0
- package/src/pages/dev.tsx +693 -0
- package/src/pages/errors.ts +66 -0
- package/src/pages/functions/buildPlugin.ts +110 -0
- package/src/pages/functions/buildWorker.ts +156 -0
- package/src/pages/functions/filepath-routing.test.ts +234 -0
- package/src/pages/functions/filepath-routing.ts +189 -0
- package/src/pages/functions/identifiers.ts +78 -0
- package/src/pages/functions/routes-consolidation.test.ts +250 -0
- package/src/pages/functions/routes-consolidation.ts +73 -0
- package/src/pages/functions/routes-transformation.test.ts +282 -0
- package/src/pages/functions/routes-transformation.ts +115 -0
- package/src/pages/functions/routes-validation.test.ts +403 -0
- package/src/pages/functions/routes-validation.ts +202 -0
- package/src/pages/functions/routes.ts +151 -0
- package/src/pages/functions.tsx +82 -0
- package/src/pages/hash.tsx +13 -0
- package/src/pages/index.tsx +94 -0
- package/src/pages/projects.tsx +169 -0
- package/src/pages/publish.tsx +436 -0
- package/src/pages/types.ts +49 -0
- package/src/pages/upload.tsx +425 -0
- package/src/pages/utils.ts +12 -0
- package/src/parse.ts +286 -0
- package/src/paths.ts +71 -0
- package/src/proxy.ts +647 -252
- package/src/publish/index.ts +270 -0
- package/src/publish/publish.ts +1035 -0
- package/src/pubsub/index.ts +286 -0
- package/src/pubsub/pubsub-commands.tsx +624 -0
- package/src/queues/cli/commands/consumer/add.ts +71 -0
- package/src/queues/cli/commands/consumer/index.ts +22 -0
- package/src/queues/cli/commands/consumer/remove.ts +38 -0
- package/src/queues/cli/commands/create.ts +25 -0
- package/src/queues/cli/commands/delete.ts +26 -0
- package/src/queues/cli/commands/index.ts +33 -0
- package/src/queues/cli/commands/list.ts +25 -0
- package/src/queues/client.ts +135 -0
- package/src/r2/helpers.ts +131 -0
- package/src/r2/index.ts +277 -0
- package/src/routes.ts +140 -0
- package/src/secret/index.ts +379 -0
- package/src/selfsigned.d.ts +29 -0
- package/src/sites.tsx +357 -99
- package/src/tail/createTail.ts +315 -0
- package/src/tail/filters.ts +277 -0
- package/src/tail/index.ts +214 -0
- package/src/tail/printing.ts +107 -0
- package/src/type-generation.ts +159 -0
- package/src/update-check.ts +19 -0
- package/src/user/access.ts +69 -0
- package/src/user/choose-account.tsx +69 -0
- package/src/user/env-vars.ts +46 -0
- package/src/user/generate-auth-url.ts +33 -0
- package/src/user/generate-random-state.ts +16 -0
- package/src/user/index.ts +3 -0
- package/src/user/user.tsx +1192 -0
- package/src/utils/collectKeyValues.ts +14 -0
- package/src/whoami.tsx +169 -0
- package/src/worker.ts +242 -0
- package/src/yargs-types.ts +20 -0
- package/src/zones.ts +191 -0
- package/templates/__tests__/pages-dev-util.test.ts +128 -0
- package/templates/checked-fetch.js +17 -0
- package/templates/d1-beta-facade.js +174 -0
- package/templates/experimental-local-cache-stubs.js +27 -0
- package/templates/first-party-worker-module-facade.ts +18 -0
- package/templates/format-dev-errors.ts +32 -0
- package/templates/gitignore +171 -0
- package/templates/init-tests/test-jest-new-worker.js +25 -0
- package/templates/init-tests/test-vitest-new-worker.js +26 -0
- package/templates/middleware/common.ts +62 -0
- package/templates/middleware/loader-modules.ts +84 -0
- package/templates/middleware/loader-sw.ts +213 -0
- package/templates/middleware/middleware-pretty-error.ts +40 -0
- package/templates/middleware/middleware-scheduled.ts +15 -0
- package/templates/new-worker-scheduled.js +17 -0
- package/templates/new-worker-scheduled.ts +32 -0
- package/templates/new-worker.js +15 -0
- package/templates/new-worker.ts +30 -0
- package/templates/no-op-worker.js +10 -0
- package/templates/pages-dev-pipeline.ts +28 -0
- package/templates/pages-dev-util.ts +52 -0
- package/templates/pages-shim.ts +9 -0
- package/templates/pages-template-plugin.ts +171 -0
- package/templates/pages-template-worker.ts +189 -0
- package/templates/serve-static-assets.ts +63 -0
- package/templates/service-bindings-module-facade.js +54 -0
- package/templates/service-bindings-sw-facade.js +42 -0
- package/templates/tsconfig.json +106 -0
- package/wrangler-dist/cli.d.ts +892 -0
- package/wrangler-dist/cli.js +142402 -103276
- package/pages/functions/buildWorker.ts +0 -62
- package/pages/functions/filepath-routing.test.ts +0 -39
- package/pages/functions/filepath-routing.ts +0 -221
- package/pages/functions/identifiers.ts +0 -78
- package/pages/functions/routes.ts +0 -158
- package/pages/functions/template-worker.ts +0 -144
- package/src/__tests__/mock-cfetch.ts +0 -171
- package/src/__tests__/mock-dialogs.ts +0 -65
- package/src/__tests__/run-in-tmp.ts +0 -19
- package/src/__tests__/run-wrangler.ts +0 -32
- package/src/api/form_data.ts +0 -131
- package/src/api/preview.ts +0 -128
- package/src/api/worker.ts +0 -155
- package/src/config.ts +0 -487
- package/src/kv.tsx +0 -267
- package/src/pages.tsx +0 -1031
- package/src/publish.ts +0 -358
- package/src/tail.tsx +0 -73
- package/src/user.tsx +0 -1025
- package/static-asset-facade.js +0 -47
- package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
- package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
- package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
- package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
- package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
- package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
- package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
- package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
- package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
- package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
- package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
- package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
- package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
- package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
- package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
- package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
- package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
- package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
- package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
- package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
- package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
- package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
- package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
- package/vendor/wrangler-mime/CHANGELOG.md +0 -289
- package/vendor/wrangler-mime/LICENSE +0 -21
- package/vendor/wrangler-mime/Mime.js +0 -97
- package/vendor/wrangler-mime/README.md +0 -187
- package/vendor/wrangler-mime/cli.js +0 -46
- package/vendor/wrangler-mime/index.js +0 -4
- package/vendor/wrangler-mime/lite.js +0 -4
- package/vendor/wrangler-mime/package.json +0 -52
- package/vendor/wrangler-mime/types/other.js +0 -1
- package/vendor/wrangler-mime/types/standard.js +0 -1
- package/wrangler-dist/cli.js.map +0 -7
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { isRoutingRuleMatch } from "../pages-dev-util";
|
|
2
|
+
|
|
3
|
+
describe("isRoutingRuleMatch", () => {
|
|
4
|
+
it("should match rules referencing root level correctly", () => {
|
|
5
|
+
const routingRule = "/";
|
|
6
|
+
|
|
7
|
+
expect(isRoutingRuleMatch("/", routingRule)).toBeTruthy();
|
|
8
|
+
expect(isRoutingRuleMatch("/foo", routingRule)).toBeFalsy();
|
|
9
|
+
expect(isRoutingRuleMatch("/foo/", routingRule)).toBeFalsy();
|
|
10
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeFalsy();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("should match include-all rules correctly", () => {
|
|
14
|
+
const routingRule = "/*";
|
|
15
|
+
|
|
16
|
+
expect(isRoutingRuleMatch("/", routingRule)).toBeTruthy();
|
|
17
|
+
expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
|
|
18
|
+
expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
|
|
19
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
|
|
20
|
+
expect(isRoutingRuleMatch("/foo/bar/", routingRule)).toBeTruthy();
|
|
21
|
+
expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
|
|
22
|
+
expect(isRoutingRuleMatch("/foo/bar/baz/", routingRule)).toBeTruthy();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("should match `/*` suffix-ed rules correctly", () => {
|
|
26
|
+
let routingRule = "/foo/*";
|
|
27
|
+
|
|
28
|
+
expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
|
|
29
|
+
expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
|
|
30
|
+
expect(isRoutingRuleMatch("/foobar", routingRule)).toBeFalsy();
|
|
31
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
|
|
32
|
+
expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
|
|
33
|
+
expect(isRoutingRuleMatch("/bar/foo", routingRule)).toBeFalsy();
|
|
34
|
+
expect(isRoutingRuleMatch("/bar/foo/baz", routingRule)).toBeFalsy();
|
|
35
|
+
|
|
36
|
+
routingRule = "/foo/bar/*";
|
|
37
|
+
|
|
38
|
+
expect(isRoutingRuleMatch("/foo", routingRule)).toBeFalsy();
|
|
39
|
+
expect(isRoutingRuleMatch("/foo/", routingRule)).toBeFalsy();
|
|
40
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
|
|
41
|
+
expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
|
|
42
|
+
expect(isRoutingRuleMatch("/foo/barfoo", routingRule)).toBeFalsy();
|
|
43
|
+
expect(isRoutingRuleMatch("baz/foo/bar", routingRule)).toBeFalsy();
|
|
44
|
+
expect(isRoutingRuleMatch("baz/foo/bar/", routingRule)).toBeFalsy();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should match `/` suffix-ed rules correctly", () => {
|
|
48
|
+
let routingRule = "/foo/";
|
|
49
|
+
expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
|
|
50
|
+
expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
|
|
51
|
+
|
|
52
|
+
routingRule = "/foo/bar/";
|
|
53
|
+
expect(isRoutingRuleMatch("/foo/bar/", routingRule)).toBeTruthy();
|
|
54
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("should match `*` suffix-ed rules correctly", () => {
|
|
58
|
+
let routingRule = "/foo*";
|
|
59
|
+
expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
|
|
60
|
+
expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
|
|
61
|
+
expect(isRoutingRuleMatch("/foobar", routingRule)).toBeTruthy();
|
|
62
|
+
expect(isRoutingRuleMatch("/barfoo", routingRule)).toBeFalsy();
|
|
63
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
|
|
64
|
+
expect(isRoutingRuleMatch("/bar/foo", routingRule)).toBeFalsy();
|
|
65
|
+
expect(isRoutingRuleMatch("/bar/foobar", routingRule)).toBeFalsy();
|
|
66
|
+
expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
|
|
67
|
+
expect(isRoutingRuleMatch("/bar/foo/baz", routingRule)).toBeFalsy();
|
|
68
|
+
|
|
69
|
+
routingRule = "/foo/bar*";
|
|
70
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
|
|
71
|
+
expect(isRoutingRuleMatch("/foo/bar/", routingRule)).toBeTruthy();
|
|
72
|
+
expect(isRoutingRuleMatch("/foo/barfoo", routingRule)).toBeTruthy();
|
|
73
|
+
expect(isRoutingRuleMatch("/bar/foo/barfoo", routingRule)).toBeFalsy();
|
|
74
|
+
expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeTruthy();
|
|
75
|
+
expect(isRoutingRuleMatch("/bar/foo/bar/baz", routingRule)).toBeFalsy();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("should match rules without wildcards correctly", () => {
|
|
79
|
+
let routingRule = "/foo";
|
|
80
|
+
|
|
81
|
+
expect(isRoutingRuleMatch("/foo", routingRule)).toBeTruthy();
|
|
82
|
+
expect(isRoutingRuleMatch("/foo/", routingRule)).toBeTruthy();
|
|
83
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeFalsy();
|
|
84
|
+
expect(isRoutingRuleMatch("/bar/foo", routingRule)).toBeFalsy();
|
|
85
|
+
|
|
86
|
+
routingRule = "/foo/bar";
|
|
87
|
+
expect(isRoutingRuleMatch("/foo/bar", routingRule)).toBeTruthy();
|
|
88
|
+
expect(isRoutingRuleMatch("/foo/bar/", routingRule)).toBeTruthy();
|
|
89
|
+
expect(isRoutingRuleMatch("/foo/bar/baz", routingRule)).toBeFalsy();
|
|
90
|
+
expect(isRoutingRuleMatch("/baz/foo/bar", routingRule)).toBeFalsy();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("should throw an error if pathname or routing rule params are missing", () => {
|
|
94
|
+
// MISSING PATHNAME
|
|
95
|
+
expect(() =>
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
97
|
+
// @ts-ignore: sanity check
|
|
98
|
+
isRoutingRuleMatch(undefined, "/*")
|
|
99
|
+
).toThrow("Pathname is undefined.");
|
|
100
|
+
|
|
101
|
+
expect(() =>
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
103
|
+
// @ts-ignore: sanity check
|
|
104
|
+
isRoutingRuleMatch(null, "/*")
|
|
105
|
+
).toThrow("Pathname is undefined.");
|
|
106
|
+
|
|
107
|
+
expect(() => isRoutingRuleMatch("", "/*")).toThrow(
|
|
108
|
+
"Pathname is undefined."
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
// MISSING ROUTING RULE
|
|
112
|
+
expect(() =>
|
|
113
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
114
|
+
// @ts-ignore: sanity check
|
|
115
|
+
isRoutingRuleMatch("/foo", undefined)
|
|
116
|
+
).toThrow("Routing rule is undefined.");
|
|
117
|
+
|
|
118
|
+
expect(() =>
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
120
|
+
// @ts-ignore: sanity check
|
|
121
|
+
isRoutingRuleMatch("/foo", null)
|
|
122
|
+
).toThrow("Routing rule is undefined.");
|
|
123
|
+
|
|
124
|
+
expect(() => isRoutingRuleMatch("/foo", "")).toThrow(
|
|
125
|
+
"Routing rule is undefined."
|
|
126
|
+
);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const urls = new Set();
|
|
2
|
+
|
|
3
|
+
export function checkedFetch(request, init) {
|
|
4
|
+
const url = new URL(
|
|
5
|
+
(typeof request === "string" ? new Request(request, init) : request).url
|
|
6
|
+
);
|
|
7
|
+
if (url.port && url.port !== "443" && url.protocol === "https:") {
|
|
8
|
+
if (!urls.has(url.toString())) {
|
|
9
|
+
urls.add(url.toString());
|
|
10
|
+
console.warn(
|
|
11
|
+
`WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers:\n` +
|
|
12
|
+
` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler publish\` command.\n`
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return globalThis.fetch(request, init);
|
|
17
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// src/shim.ts
|
|
2
|
+
import worker from "__ENTRY_POINT__";
|
|
3
|
+
export * from "__ENTRY_POINT__";
|
|
4
|
+
|
|
5
|
+
// src/index.ts
|
|
6
|
+
var D1Database = class {
|
|
7
|
+
constructor(binding) {
|
|
8
|
+
this.binding = binding;
|
|
9
|
+
}
|
|
10
|
+
prepare(query) {
|
|
11
|
+
return new D1PreparedStatement(this, query);
|
|
12
|
+
}
|
|
13
|
+
async dump() {
|
|
14
|
+
const response = await this.binding.fetch("/dump", {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: {
|
|
17
|
+
"content-type": "application/json",
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
if (response.status !== 200) {
|
|
21
|
+
const err = await response.json();
|
|
22
|
+
throw new Error("D1_DUMP_ERROR", {
|
|
23
|
+
cause: new Error(err.error),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return await response.arrayBuffer();
|
|
27
|
+
}
|
|
28
|
+
async batch(statements) {
|
|
29
|
+
const exec = await this._send(
|
|
30
|
+
"/query",
|
|
31
|
+
statements.map((s) => s.statement),
|
|
32
|
+
statements.map((s) => s.params)
|
|
33
|
+
);
|
|
34
|
+
return exec;
|
|
35
|
+
}
|
|
36
|
+
async exec(query) {
|
|
37
|
+
const lines = query.trim().split("\n");
|
|
38
|
+
const _exec = await this._send("/query", lines, []);
|
|
39
|
+
const exec = Array.isArray(_exec) ? _exec : [_exec];
|
|
40
|
+
const error = exec
|
|
41
|
+
.map((r) => {
|
|
42
|
+
return r.error ? 1 : 0;
|
|
43
|
+
})
|
|
44
|
+
.indexOf(1);
|
|
45
|
+
if (error !== -1) {
|
|
46
|
+
throw new Error("D1_EXEC_ERROR", {
|
|
47
|
+
cause: new Error(
|
|
48
|
+
`Error in line ${error + 1}: ${lines[error]}: ${exec[error].error}`
|
|
49
|
+
),
|
|
50
|
+
});
|
|
51
|
+
} else {
|
|
52
|
+
return {
|
|
53
|
+
count: exec.length,
|
|
54
|
+
duration: exec.reduce((p, c) => {
|
|
55
|
+
return p + c.duration;
|
|
56
|
+
}, 0),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async _send(endpoint, query, params) {
|
|
61
|
+
const body = JSON.stringify(
|
|
62
|
+
typeof query == "object"
|
|
63
|
+
? query.map((s, index) => {
|
|
64
|
+
return { sql: s, params: params[index] };
|
|
65
|
+
})
|
|
66
|
+
: {
|
|
67
|
+
sql: query,
|
|
68
|
+
params,
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
const response = await this.binding.fetch(endpoint, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
"content-type": "application/json",
|
|
75
|
+
},
|
|
76
|
+
body,
|
|
77
|
+
});
|
|
78
|
+
if (response.status !== 200) {
|
|
79
|
+
const err = await response.json();
|
|
80
|
+
throw new Error("D1_ERROR", { cause: new Error(err.error) });
|
|
81
|
+
}
|
|
82
|
+
const answer = await response.json();
|
|
83
|
+
return Array.isArray(answer) ? answer : answer;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var D1PreparedStatement = class {
|
|
87
|
+
constructor(database, statement, values) {
|
|
88
|
+
this.database = database;
|
|
89
|
+
this.statement = statement;
|
|
90
|
+
this.params = values || [];
|
|
91
|
+
}
|
|
92
|
+
bind(...values) {
|
|
93
|
+
return new D1PreparedStatement(this.database, this.statement, values);
|
|
94
|
+
}
|
|
95
|
+
async first(colName) {
|
|
96
|
+
const info = firstIfArray(
|
|
97
|
+
await this.database._send("/query", this.statement, this.params)
|
|
98
|
+
);
|
|
99
|
+
const results = info.results;
|
|
100
|
+
if (results.length < 1) {
|
|
101
|
+
throw new Error("D1_NORESULTS", { cause: new Error("No results") });
|
|
102
|
+
}
|
|
103
|
+
const result = results[0];
|
|
104
|
+
if (colName !== void 0) {
|
|
105
|
+
if (result[colName] === void 0) {
|
|
106
|
+
throw new Error("D1_COLUMN_NOTFOUND", {
|
|
107
|
+
cause: new Error(`Column not found`),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return result[colName];
|
|
111
|
+
} else {
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async run() {
|
|
116
|
+
return firstIfArray(
|
|
117
|
+
await this.database._send("/execute", this.statement, this.params)
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
async all() {
|
|
121
|
+
return firstIfArray(
|
|
122
|
+
await this.database._send("/query", this.statement, this.params)
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
async raw() {
|
|
126
|
+
const s = firstIfArray(
|
|
127
|
+
await this.database._send("/query", this.statement, this.params)
|
|
128
|
+
);
|
|
129
|
+
const raw = [];
|
|
130
|
+
for (var r in s.results) {
|
|
131
|
+
const entry = Object.keys(s.results[r]).map((k) => {
|
|
132
|
+
return s.results[r][k];
|
|
133
|
+
});
|
|
134
|
+
raw.push(entry);
|
|
135
|
+
}
|
|
136
|
+
return raw;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
function firstIfArray(results) {
|
|
140
|
+
return Array.isArray(results) ? results[0] : results;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// src/shim.ts
|
|
144
|
+
var D1_IMPORTS = __D1_IMPORTS__;
|
|
145
|
+
var LOCAL_MODE = __LOCAL_MODE__;
|
|
146
|
+
var D1_BETA_PREFIX = `__D1_BETA__`;
|
|
147
|
+
var envMap = /* @__PURE__ */ new Map();
|
|
148
|
+
function getMaskedEnv(env) {
|
|
149
|
+
if (envMap.has(env)) return envMap.get(env);
|
|
150
|
+
const newEnv = new Map(Object.entries(env));
|
|
151
|
+
D1_IMPORTS.filter((bindingName) =>
|
|
152
|
+
bindingName.startsWith(D1_BETA_PREFIX)
|
|
153
|
+
).forEach((bindingName) => {
|
|
154
|
+
newEnv.delete(bindingName);
|
|
155
|
+
const newName = bindingName.slice(D1_BETA_PREFIX.length);
|
|
156
|
+
const newBinding = !LOCAL_MODE
|
|
157
|
+
? new D1Database(env[bindingName])
|
|
158
|
+
: env[bindingName];
|
|
159
|
+
newEnv.set(newName, newBinding);
|
|
160
|
+
});
|
|
161
|
+
const newEnvObj = Object.fromEntries(newEnv.entries());
|
|
162
|
+
envMap.set(env, newEnvObj);
|
|
163
|
+
return newEnvObj;
|
|
164
|
+
}
|
|
165
|
+
var shim_default = {
|
|
166
|
+
async fetch(request, env, ctx) {
|
|
167
|
+
return worker.fetch(request, getMaskedEnv(env), ctx);
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
async scheduled(controller, env, ctx) {
|
|
171
|
+
return worker.scheduled(controller, getMaskedEnv(env), ctx);
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
export { shim_default as default };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// `workerd` currently throws on any use of the Cache API. Workers Sites
|
|
2
|
+
// requires the Cache API to function though, so stub it out to no-ops, like in
|
|
3
|
+
// regular `wrangler dev`.
|
|
4
|
+
|
|
5
|
+
class Cache {
|
|
6
|
+
async put(req, res) {}
|
|
7
|
+
|
|
8
|
+
async match(req, options) {}
|
|
9
|
+
|
|
10
|
+
async delete(req, options) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
class CacheStorage {
|
|
16
|
+
#cache = new Cache();
|
|
17
|
+
|
|
18
|
+
get default() {
|
|
19
|
+
return this.#cache;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async open(cacheName) {
|
|
23
|
+
return this.#cache;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
globalThis.caches = new CacheStorage();
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// @ts-ignore entry point will get replaced
|
|
2
|
+
import worker from "__ENTRY_POINT__";
|
|
3
|
+
// @ts-ignore entry point will get replaced
|
|
4
|
+
export * from "__ENTRY_POINT__";
|
|
5
|
+
|
|
6
|
+
type Env = {
|
|
7
|
+
// TODO: type this
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Setup globals/vars as required
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export default {
|
|
15
|
+
async fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
16
|
+
return worker.fetch(request, env, ctx);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// @ts-expect-error We'll swap in the entry point during build
|
|
2
|
+
import Worker from "__ENTRY_POINT__";
|
|
3
|
+
|
|
4
|
+
// @ts-expect-error
|
|
5
|
+
export * from "__ENTRY_POINT__";
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
async fetch(req: Request, env: unknown, ctx: ExecutionContext) {
|
|
9
|
+
try {
|
|
10
|
+
return await Worker.fetch(req, env, ctx);
|
|
11
|
+
} catch (err) {
|
|
12
|
+
return new Response(
|
|
13
|
+
`<!DOCTYPE html>
|
|
14
|
+
<html>
|
|
15
|
+
<head>
|
|
16
|
+
<meta charset="utf-8" />
|
|
17
|
+
<title>Error</title>
|
|
18
|
+
</head>
|
|
19
|
+
<body>
|
|
20
|
+
<pre>${(err as Error).stack}</pre>
|
|
21
|
+
</body>
|
|
22
|
+
</html>`,
|
|
23
|
+
{
|
|
24
|
+
status: 500,
|
|
25
|
+
headers: {
|
|
26
|
+
"Content-Type": "text/html",
|
|
27
|
+
},
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# Logs
|
|
2
|
+
|
|
3
|
+
logs
|
|
4
|
+
_.log
|
|
5
|
+
npm-debug.log_
|
|
6
|
+
yarn-debug.log*
|
|
7
|
+
yarn-error.log*
|
|
8
|
+
lerna-debug.log*
|
|
9
|
+
.pnpm-debug.log*
|
|
10
|
+
|
|
11
|
+
# Diagnostic reports (https://nodejs.org/api/report.html)
|
|
12
|
+
|
|
13
|
+
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
|
|
14
|
+
|
|
15
|
+
# Runtime data
|
|
16
|
+
|
|
17
|
+
pids
|
|
18
|
+
_.pid
|
|
19
|
+
_.seed
|
|
20
|
+
\*.pid.lock
|
|
21
|
+
|
|
22
|
+
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
23
|
+
|
|
24
|
+
lib-cov
|
|
25
|
+
|
|
26
|
+
# Coverage directory used by tools like istanbul
|
|
27
|
+
|
|
28
|
+
coverage
|
|
29
|
+
\*.lcov
|
|
30
|
+
|
|
31
|
+
# nyc test coverage
|
|
32
|
+
|
|
33
|
+
.nyc_output
|
|
34
|
+
|
|
35
|
+
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
|
36
|
+
|
|
37
|
+
.grunt
|
|
38
|
+
|
|
39
|
+
# Bower dependency directory (https://bower.io/)
|
|
40
|
+
|
|
41
|
+
bower_components
|
|
42
|
+
|
|
43
|
+
# node-waf configuration
|
|
44
|
+
|
|
45
|
+
.lock-wscript
|
|
46
|
+
|
|
47
|
+
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
48
|
+
|
|
49
|
+
build/Release
|
|
50
|
+
|
|
51
|
+
# Dependency directories
|
|
52
|
+
|
|
53
|
+
node_modules/
|
|
54
|
+
jspm_packages/
|
|
55
|
+
|
|
56
|
+
# Snowpack dependency directory (https://snowpack.dev/)
|
|
57
|
+
|
|
58
|
+
web_modules/
|
|
59
|
+
|
|
60
|
+
# TypeScript cache
|
|
61
|
+
|
|
62
|
+
\*.tsbuildinfo
|
|
63
|
+
|
|
64
|
+
# Optional npm cache directory
|
|
65
|
+
|
|
66
|
+
.npm
|
|
67
|
+
|
|
68
|
+
# Optional eslint cache
|
|
69
|
+
|
|
70
|
+
.eslintcache
|
|
71
|
+
|
|
72
|
+
# Optional stylelint cache
|
|
73
|
+
|
|
74
|
+
.stylelintcache
|
|
75
|
+
|
|
76
|
+
# Microbundle cache
|
|
77
|
+
|
|
78
|
+
.rpt2_cache/
|
|
79
|
+
.rts2_cache_cjs/
|
|
80
|
+
.rts2_cache_es/
|
|
81
|
+
.rts2_cache_umd/
|
|
82
|
+
|
|
83
|
+
# Optional REPL history
|
|
84
|
+
|
|
85
|
+
.node_repl_history
|
|
86
|
+
|
|
87
|
+
# Output of 'npm pack'
|
|
88
|
+
|
|
89
|
+
\*.tgz
|
|
90
|
+
|
|
91
|
+
# Yarn Integrity file
|
|
92
|
+
|
|
93
|
+
.yarn-integrity
|
|
94
|
+
|
|
95
|
+
# dotenv environment variable files
|
|
96
|
+
|
|
97
|
+
.env
|
|
98
|
+
.env.development.local
|
|
99
|
+
.env.test.local
|
|
100
|
+
.env.production.local
|
|
101
|
+
.env.local
|
|
102
|
+
|
|
103
|
+
# parcel-bundler cache (https://parceljs.org/)
|
|
104
|
+
|
|
105
|
+
.cache
|
|
106
|
+
.parcel-cache
|
|
107
|
+
|
|
108
|
+
# Next.js build output
|
|
109
|
+
|
|
110
|
+
.next
|
|
111
|
+
out
|
|
112
|
+
|
|
113
|
+
# Nuxt.js build / generate output
|
|
114
|
+
|
|
115
|
+
.nuxt
|
|
116
|
+
dist
|
|
117
|
+
|
|
118
|
+
# Gatsby files
|
|
119
|
+
|
|
120
|
+
.cache/
|
|
121
|
+
|
|
122
|
+
# Comment in the public line in if your project uses Gatsby and not Next.js
|
|
123
|
+
|
|
124
|
+
# https://nextjs.org/blog/next-9-1#public-directory-support
|
|
125
|
+
|
|
126
|
+
# public
|
|
127
|
+
|
|
128
|
+
# vuepress build output
|
|
129
|
+
|
|
130
|
+
.vuepress/dist
|
|
131
|
+
|
|
132
|
+
# vuepress v2.x temp and cache directory
|
|
133
|
+
|
|
134
|
+
.temp
|
|
135
|
+
.cache
|
|
136
|
+
|
|
137
|
+
# Docusaurus cache and generated files
|
|
138
|
+
|
|
139
|
+
.docusaurus
|
|
140
|
+
|
|
141
|
+
# Serverless directories
|
|
142
|
+
|
|
143
|
+
.serverless/
|
|
144
|
+
|
|
145
|
+
# FuseBox cache
|
|
146
|
+
|
|
147
|
+
.fusebox/
|
|
148
|
+
|
|
149
|
+
# DynamoDB Local files
|
|
150
|
+
|
|
151
|
+
.dynamodb/
|
|
152
|
+
|
|
153
|
+
# TernJS port file
|
|
154
|
+
|
|
155
|
+
.tern-port
|
|
156
|
+
|
|
157
|
+
# Stores VSCode versions used for testing VSCode extensions
|
|
158
|
+
|
|
159
|
+
.vscode-test
|
|
160
|
+
|
|
161
|
+
# yarn v2
|
|
162
|
+
|
|
163
|
+
.yarn/cache
|
|
164
|
+
.yarn/unplugged
|
|
165
|
+
.yarn/build-state.yml
|
|
166
|
+
.yarn/install-state.gz
|
|
167
|
+
.pnp.\*
|
|
168
|
+
|
|
169
|
+
# wrangler project
|
|
170
|
+
|
|
171
|
+
.dev.vars
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const { unstable_dev } = require("wrangler");
|
|
2
|
+
|
|
3
|
+
describe("Worker", () => {
|
|
4
|
+
let worker;
|
|
5
|
+
|
|
6
|
+
beforeAll(async () => {
|
|
7
|
+
worker = await unstable_dev(
|
|
8
|
+
"src/index.js",
|
|
9
|
+
{},
|
|
10
|
+
{ disableExperimentalWarning: true }
|
|
11
|
+
);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
afterAll(async () => {
|
|
15
|
+
await worker.stop();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("should return Hello World", async () => {
|
|
19
|
+
const resp = await worker.fetch();
|
|
20
|
+
if (resp) {
|
|
21
|
+
const text = await resp.text();
|
|
22
|
+
expect(text).toMatchInlineSnapshot(`"Hello World!"`);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { unstable_dev } from "wrangler";
|
|
2
|
+
import { describe, expect, it, beforeAll, afterAll } from "vitest";
|
|
3
|
+
|
|
4
|
+
describe("Worker", () => {
|
|
5
|
+
let worker;
|
|
6
|
+
|
|
7
|
+
beforeAll(async () => {
|
|
8
|
+
worker = await unstable_dev(
|
|
9
|
+
"src/index.js",
|
|
10
|
+
{},
|
|
11
|
+
{ disableExperimentalWarning: true }
|
|
12
|
+
);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
afterAll(async () => {
|
|
16
|
+
await worker.stop();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("should return Hello World", async () => {
|
|
20
|
+
const resp = await worker.fetch();
|
|
21
|
+
if (resp) {
|
|
22
|
+
const text = await resp.text();
|
|
23
|
+
expect(text).toMatchInlineSnapshot(`"Hello World!"`);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type Awaitable<T> = T | Promise<T>;
|
|
2
|
+
// TODO: allow dispatching more events?
|
|
3
|
+
export type Dispatcher = (
|
|
4
|
+
type: "scheduled",
|
|
5
|
+
init: { cron?: string }
|
|
6
|
+
) => Awaitable<void>;
|
|
7
|
+
|
|
8
|
+
export interface MiddlewareContext {
|
|
9
|
+
dispatch: Dispatcher;
|
|
10
|
+
next(request: Request, env: any): Awaitable<Response>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type Middleware = (
|
|
14
|
+
request: Request,
|
|
15
|
+
env: any,
|
|
16
|
+
ctx: ExecutionContext,
|
|
17
|
+
middlewareCtx: MiddlewareContext
|
|
18
|
+
) => Awaitable<Response>;
|
|
19
|
+
|
|
20
|
+
const __facade_middleware__: Middleware[] = [];
|
|
21
|
+
|
|
22
|
+
// The register functions allow for the insertion of one or many middleware,
|
|
23
|
+
// We register internal middleware first in the stack, but have no way of controlling
|
|
24
|
+
// the order that addMiddleware is run in service workers so need an internal function.
|
|
25
|
+
export function __facade_register__(...args: (Middleware | Middleware[])[]) {
|
|
26
|
+
__facade_middleware__.push(...args.flat());
|
|
27
|
+
}
|
|
28
|
+
export function __facade_registerInternal__(
|
|
29
|
+
...args: (Middleware | Middleware[])[]
|
|
30
|
+
) {
|
|
31
|
+
__facade_middleware__.unshift(...args.flat());
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function __facade_invokeChain__(
|
|
35
|
+
request: Request,
|
|
36
|
+
env: any,
|
|
37
|
+
ctx: ExecutionContext,
|
|
38
|
+
dispatch: Dispatcher,
|
|
39
|
+
middlewareChain: Middleware[]
|
|
40
|
+
): Awaitable<Response> {
|
|
41
|
+
const [head, ...tail] = middlewareChain;
|
|
42
|
+
const middlewareCtx: MiddlewareContext = {
|
|
43
|
+
dispatch,
|
|
44
|
+
next(newRequest, newEnv) {
|
|
45
|
+
return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
return head(request, env, ctx, middlewareCtx);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function __facade_invoke__(
|
|
52
|
+
request: Request,
|
|
53
|
+
env: any,
|
|
54
|
+
ctx: ExecutionContext,
|
|
55
|
+
dispatch: Dispatcher,
|
|
56
|
+
finalMiddleware: Middleware
|
|
57
|
+
): Awaitable<Response> {
|
|
58
|
+
return __facade_invokeChain__(request, env, ctx, dispatch, [
|
|
59
|
+
...__facade_middleware__,
|
|
60
|
+
finalMiddleware,
|
|
61
|
+
]);
|
|
62
|
+
}
|