wrangler 0.0.0-e7a0cd5b → 0.0.0-e7c06d78
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/README.md +13 -15
- package/bin/wrangler.js +24 -93
- package/config-schema.json +3059 -0
- package/package.json +196 -191
- package/templates/__tests__/tsconfig-sanity.ts +12 -0
- package/templates/__tests__/tsconfig.json +8 -0
- package/templates/checked-fetch.js +19 -6
- package/templates/facade.d.ts +19 -0
- package/templates/gitignore +2 -3
- package/templates/init-tests/test-jest-new-worker.js +3 -5
- package/templates/init-tests/test-vitest-new-worker.js +4 -6
- package/templates/init-tests/test-vitest-new-worker.ts +25 -0
- package/templates/middleware/common.ts +9 -4
- package/templates/middleware/loader-modules.ts +94 -44
- package/templates/middleware/loader-sw.ts +48 -32
- package/templates/middleware/middleware-ensure-req-body-drained.ts +18 -0
- package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
- package/templates/middleware/middleware-serve-static-assets.d.ts +6 -0
- package/templates/middleware/middleware-serve-static-assets.ts +56 -0
- package/templates/modules-watch-stub.js +4 -0
- package/templates/new-worker-scheduled.ts +1 -1
- package/templates/new-worker.ts +4 -1
- package/templates/pages-dev-pipeline.ts +6 -2
- package/templates/pages-dev-util.ts +4 -1
- package/templates/pages-shim.ts +1 -1
- package/templates/pages-template-plugin.ts +33 -14
- package/templates/pages-template-worker.ts +12 -3
- package/templates/startDevWorker/InspectorProxyWorker.ts +664 -0
- package/templates/startDevWorker/ProxyWorker.ts +334 -0
- package/templates/tsconfig-sanity.ts +11 -0
- package/templates/tsconfig.init.json +22 -0
- package/templates/tsconfig.json +5 -103
- package/wrangler-dist/InspectorProxyWorker.js +464 -0
- package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
- package/wrangler-dist/ProxyWorker.js +240 -0
- package/wrangler-dist/ProxyWorker.js.map +6 -0
- package/wrangler-dist/cli.d.ts +26010 -512
- package/wrangler-dist/cli.js +164971 -116798
- package/wrangler-dist/wasm-sync.wasm +0 -0
- package/Cloudflare_CA.pem +0 -18
- package/import_meta_url.js +0 -3
- package/miniflare-config-stubs/.env.empty +0 -0
- package/miniflare-config-stubs/package.empty.json +0 -1
- package/miniflare-config-stubs/wrangler.empty.toml +0 -0
- package/miniflare-dist/index.mjs +0 -6316
- package/src/__tests__/access.test.ts +0 -25
- package/src/__tests__/api-dev.test.ts +0 -209
- package/src/__tests__/api-devregistry.test.js +0 -57
- package/src/__tests__/api.test.ts +0 -80
- package/src/__tests__/config-cache-without-cache-dir.test.ts +0 -38
- package/src/__tests__/config-cache.test.ts +0 -42
- package/src/__tests__/configuration.test.ts +0 -4028
- package/src/__tests__/d1.test.ts +0 -72
- package/src/__tests__/delete.test.ts +0 -230
- package/src/__tests__/deployments.test.ts +0 -95
- package/src/__tests__/dev.test.tsx +0 -1509
- package/src/__tests__/dialogs.test.tsx +0 -40
- package/src/__tests__/generate.test.ts +0 -235
- package/src/__tests__/get-host-from-url.test.ts +0 -16
- package/src/__tests__/guess-worker-format.test.ts +0 -85
- package/src/__tests__/helpers/clipboardy-mock.js +0 -4
- package/src/__tests__/helpers/cmd-shim.d.ts +0 -11
- package/src/__tests__/helpers/mock-account-id.ts +0 -48
- package/src/__tests__/helpers/mock-bin.ts +0 -36
- package/src/__tests__/helpers/mock-cfetch.ts +0 -333
- package/src/__tests__/helpers/mock-console.ts +0 -106
- package/src/__tests__/helpers/mock-dialogs.ts +0 -153
- package/src/__tests__/helpers/mock-get-zone-from-host.ts +0 -8
- package/src/__tests__/helpers/mock-http-server.ts +0 -46
- package/src/__tests__/helpers/mock-istty.ts +0 -74
- package/src/__tests__/helpers/mock-known-routes.ts +0 -7
- package/src/__tests__/helpers/mock-kv.ts +0 -33
- package/src/__tests__/helpers/mock-oauth-flow.ts +0 -252
- package/src/__tests__/helpers/mock-process.ts +0 -39
- package/src/__tests__/helpers/mock-stdin.ts +0 -108
- package/src/__tests__/helpers/mock-web-socket.ts +0 -29
- package/src/__tests__/helpers/msw/handlers/access.ts +0 -13
- package/src/__tests__/helpers/msw/handlers/deployments.ts +0 -59
- package/src/__tests__/helpers/msw/handlers/namespaces.ts +0 -104
- package/src/__tests__/helpers/msw/handlers/oauth.ts +0 -36
- package/src/__tests__/helpers/msw/handlers/r2.ts +0 -80
- package/src/__tests__/helpers/msw/handlers/script.ts +0 -75
- package/src/__tests__/helpers/msw/handlers/user.ts +0 -63
- package/src/__tests__/helpers/msw/handlers/zones.ts +0 -22
- package/src/__tests__/helpers/msw/index.ts +0 -21
- package/src/__tests__/helpers/run-in-tmp.ts +0 -38
- package/src/__tests__/helpers/run-wrangler.ts +0 -16
- package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +0 -1
- package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +0 -5
- package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +0 -1
- package/src/__tests__/helpers/worker-scripts/parent-worker.js +0 -8
- package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +0 -5
- package/src/__tests__/helpers/write-worker-source.ts +0 -31
- package/src/__tests__/helpers/write-wrangler-toml.ts +0 -17
- package/src/__tests__/https-options.test.ts +0 -163
- package/src/__tests__/index.test.ts +0 -262
- package/src/__tests__/init.test.ts +0 -2900
- package/src/__tests__/jest.setup.ts +0 -202
- package/src/__tests__/kv.test.ts +0 -1675
- package/src/__tests__/logger.test.ts +0 -141
- package/src/__tests__/metrics.test.ts +0 -450
- package/src/__tests__/middleware.scheduled.test.ts +0 -135
- package/src/__tests__/middleware.test.ts +0 -726
- package/src/__tests__/package-manager.test.ts +0 -353
- package/src/__tests__/pages.test.ts +0 -2223
- package/src/__tests__/parse.test.ts +0 -330
- package/src/__tests__/paths.test.ts +0 -39
- package/src/__tests__/publish.test.ts +0 -7660
- package/src/__tests__/pubsub.test.ts +0 -370
- package/src/__tests__/queues.test.ts +0 -371
- package/src/__tests__/r2.test.ts +0 -376
- package/src/__tests__/route.test.ts +0 -45
- package/src/__tests__/secret.test.ts +0 -644
- package/src/__tests__/tail.test.ts +0 -800
- package/src/__tests__/test-old-node-version.js +0 -31
- package/src/__tests__/type-generation.test.ts +0 -217
- package/src/__tests__/user.test.ts +0 -155
- package/src/__tests__/utils-collectKeyValues.test.ts +0 -47
- package/src/__tests__/validate-dev-props.test.ts +0 -56
- package/src/__tests__/version.test.ts +0 -35
- package/src/__tests__/whoami.test.tsx +0 -278
- package/src/__tests__/worker-namespace.test.ts +0 -326
- package/src/abort.d.ts +0 -3
- package/src/api/dev.ts +0 -208
- package/src/api/index.ts +0 -2
- package/src/bundle-reporter.tsx +0 -68
- package/src/bundle.ts +0 -785
- package/src/cfetch/index.ts +0 -160
- package/src/cfetch/internal.ts +0 -263
- package/src/cli.ts +0 -28
- package/src/config/README.md +0 -107
- package/src/config/config.ts +0 -275
- package/src/config/diagnostics.ts +0 -80
- package/src/config/environment.ts +0 -563
- package/src/config/index.ts +0 -342
- package/src/config/validation-helpers.ts +0 -597
- package/src/config/validation.ts +0 -2113
- package/src/config-cache.ts +0 -85
- package/src/create-worker-preview.ts +0 -282
- package/src/create-worker-upload-form.ts +0 -321
- package/src/d1/backups.tsx +0 -218
- package/src/d1/create.tsx +0 -54
- package/src/d1/delete.tsx +0 -56
- package/src/d1/execute.tsx +0 -299
- package/src/d1/formatTimeAgo.ts +0 -14
- package/src/d1/index.ts +0 -76
- package/src/d1/list.tsx +0 -48
- package/src/d1/options.ts +0 -12
- package/src/d1/types.tsx +0 -14
- package/src/d1/utils.ts +0 -39
- package/src/delete.ts +0 -108
- package/src/deployments.ts +0 -74
- package/src/deprecated/index.ts +0 -438
- package/src/dev/dev-vars.ts +0 -39
- package/src/dev/dev.tsx +0 -587
- package/src/dev/get-local-persistence-path.tsx +0 -31
- package/src/dev/local.tsx +0 -717
- package/src/dev/remote.tsx +0 -603
- package/src/dev/start-server.ts +0 -513
- package/src/dev/use-esbuild.ts +0 -204
- package/src/dev/validate-dev-props.ts +0 -31
- package/src/dev-registry.tsx +0 -201
- package/src/dev.tsx +0 -869
- package/src/dialogs.tsx +0 -163
- package/src/dispatch-namespace.ts +0 -207
- package/src/durable.ts +0 -102
- package/src/entry.ts +0 -329
- package/src/environment-variables.ts +0 -50
- package/src/errors.ts +0 -11
- package/src/git-client.ts +0 -124
- package/src/global-wrangler-config-path.ts +0 -26
- package/src/https-options.ts +0 -127
- package/src/index.tsx +0 -684
- package/src/init.ts +0 -970
- package/src/inspect.ts +0 -767
- package/src/intl-polyfill.d.ts +0 -139
- package/src/is-ci.ts +0 -14
- package/src/is-interactive.ts +0 -16
- package/src/kv/helpers.ts +0 -430
- package/src/kv/index.ts +0 -596
- package/src/logger.ts +0 -92
- package/src/metrics/index.ts +0 -5
- package/src/metrics/metrics-config.ts +0 -239
- package/src/metrics/metrics-dispatcher.ts +0 -96
- package/src/metrics/metrics-usage-headers.ts +0 -24
- package/src/metrics/send-event.ts +0 -94
- package/src/miniflare-cli/README.md +0 -30
- package/src/miniflare-cli/assets.ts +0 -215
- package/src/miniflare-cli/index.ts +0 -213
- package/src/miniflare-cli/request-context.ts +0 -40
- package/src/module-collection.ts +0 -267
- package/src/open-in-browser.ts +0 -17
- package/src/package-manager.ts +0 -219
- package/src/pages/build.tsx +0 -238
- package/src/pages/constants.ts +0 -18
- package/src/pages/deployments.tsx +0 -106
- package/src/pages/dev.tsx +0 -693
- package/src/pages/errors.ts +0 -66
- package/src/pages/functions/buildPlugin.ts +0 -110
- package/src/pages/functions/buildWorker.ts +0 -156
- package/src/pages/functions/filepath-routing.test.ts +0 -234
- package/src/pages/functions/filepath-routing.ts +0 -189
- package/src/pages/functions/identifiers.ts +0 -78
- package/src/pages/functions/routes-consolidation.test.ts +0 -250
- package/src/pages/functions/routes-consolidation.ts +0 -73
- package/src/pages/functions/routes-transformation.test.ts +0 -282
- package/src/pages/functions/routes-transformation.ts +0 -115
- package/src/pages/functions/routes-validation.test.ts +0 -403
- package/src/pages/functions/routes-validation.ts +0 -202
- package/src/pages/functions/routes.ts +0 -151
- package/src/pages/functions.tsx +0 -82
- package/src/pages/hash.tsx +0 -13
- package/src/pages/index.tsx +0 -94
- package/src/pages/projects.tsx +0 -169
- package/src/pages/publish.tsx +0 -436
- package/src/pages/types.ts +0 -49
- package/src/pages/upload.tsx +0 -425
- package/src/pages/utils.ts +0 -12
- package/src/parse.ts +0 -286
- package/src/paths.ts +0 -71
- package/src/proxy.ts +0 -689
- package/src/publish/index.ts +0 -270
- package/src/publish/publish.ts +0 -1035
- package/src/pubsub/index.ts +0 -286
- package/src/pubsub/pubsub-commands.tsx +0 -624
- package/src/queues/cli/commands/consumer/add.ts +0 -71
- package/src/queues/cli/commands/consumer/index.ts +0 -22
- package/src/queues/cli/commands/consumer/remove.ts +0 -38
- package/src/queues/cli/commands/create.ts +0 -25
- package/src/queues/cli/commands/delete.ts +0 -26
- package/src/queues/cli/commands/index.ts +0 -33
- package/src/queues/cli/commands/list.ts +0 -25
- package/src/queues/client.ts +0 -135
- package/src/r2/helpers.ts +0 -131
- package/src/r2/index.ts +0 -277
- package/src/routes.ts +0 -140
- package/src/secret/index.ts +0 -379
- package/src/selfsigned.d.ts +0 -29
- package/src/sites.tsx +0 -372
- package/src/tail/createTail.ts +0 -315
- package/src/tail/filters.ts +0 -277
- package/src/tail/index.ts +0 -214
- package/src/tail/printing.ts +0 -107
- package/src/type-generation.ts +0 -159
- package/src/update-check.ts +0 -19
- package/src/user/access.ts +0 -69
- package/src/user/choose-account.tsx +0 -69
- package/src/user/env-vars.ts +0 -46
- package/src/user/generate-auth-url.ts +0 -33
- package/src/user/generate-random-state.ts +0 -16
- package/src/user/index.ts +0 -3
- package/src/user/user.tsx +0 -1192
- package/src/utils/collectKeyValues.ts +0 -14
- package/src/whoami.tsx +0 -169
- package/src/worker.ts +0 -242
- package/src/yargs-types.ts +0 -20
- package/src/zones.ts +0 -191
- package/templates/d1-beta-facade.js +0 -174
- package/templates/experimental-local-cache-stubs.js +0 -27
- package/templates/first-party-worker-module-facade.ts +0 -18
- package/templates/format-dev-errors.ts +0 -32
- package/templates/serve-static-assets.ts +0 -63
- package/templates/service-bindings-module-facade.js +0 -54
- package/templates/service-bindings-sw-facade.js +0 -42
|
@@ -1,25 +1,17 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// // of "plugin" system.
|
|
1
|
+
// This loads all middlewares exposed on the middleware object and then starts
|
|
2
|
+
// the invocation chain. The big idea is that we can add these to the middleware
|
|
3
|
+
// export dynamically through wrangler, or we can potentially let users directly
|
|
4
|
+
// add them as a sort of "plugin" system.
|
|
6
5
|
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
__facade_invoke__,
|
|
11
|
-
__facade_register__,
|
|
12
|
-
} from "./common";
|
|
6
|
+
import ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from "__ENTRY_POINT__";
|
|
7
|
+
import { __facade_invoke__, __facade_register__, Dispatcher } from "./common";
|
|
8
|
+
import type { WorkerEntrypointConstructor } from "__ENTRY_POINT__";
|
|
13
9
|
|
|
14
|
-
//
|
|
15
|
-
import worker from "__ENTRY_POINT__";
|
|
16
|
-
|
|
17
|
-
// We need to preserve all of the exports from the worker
|
|
18
|
-
// @ts-expect-error We'll swap in the entry point during build
|
|
10
|
+
// Preserve all the exports from the worker
|
|
19
11
|
export * from "__ENTRY_POINT__";
|
|
20
12
|
|
|
21
13
|
class __Facade_ScheduledController__ implements ScheduledController {
|
|
22
|
-
#noRetry: ScheduledController["noRetry"];
|
|
14
|
+
readonly #noRetry: ScheduledController["noRetry"];
|
|
23
15
|
|
|
24
16
|
constructor(
|
|
25
17
|
readonly scheduledTime: number,
|
|
@@ -38,20 +30,34 @@ class __Facade_ScheduledController__ implements ScheduledController {
|
|
|
38
30
|
}
|
|
39
31
|
}
|
|
40
32
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
function wrapExportedHandler(worker: ExportedHandler): ExportedHandler {
|
|
34
|
+
// If we don't have any middleware defined, just return the handler as is
|
|
35
|
+
if (
|
|
36
|
+
__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||
|
|
37
|
+
__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0
|
|
38
|
+
) {
|
|
39
|
+
return worker;
|
|
40
|
+
}
|
|
41
|
+
// Otherwise, register all middleware once
|
|
42
|
+
for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {
|
|
43
|
+
__facade_register__(middleware);
|
|
44
|
+
}
|
|
45
45
|
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
const fetchDispatcher: ExportedHandlerFetchHandler = function (
|
|
47
|
+
request,
|
|
48
|
+
env,
|
|
49
|
+
ctx
|
|
50
|
+
) {
|
|
51
|
+
if (worker.fetch === undefined) {
|
|
52
|
+
throw new Error("Handler does not export a fetch() function.");
|
|
53
|
+
}
|
|
54
|
+
return worker.fetch(request, env, ctx);
|
|
55
|
+
};
|
|
53
56
|
|
|
54
|
-
|
|
57
|
+
return {
|
|
58
|
+
...worker,
|
|
59
|
+
fetch(request, env, ctx) {
|
|
60
|
+
const dispatcher: Dispatcher = function (type, init) {
|
|
55
61
|
if (type === "scheduled" && worker.scheduled !== undefined) {
|
|
56
62
|
const controller = new __Facade_ScheduledController__(
|
|
57
63
|
Date.now(),
|
|
@@ -61,24 +67,68 @@ const facade: ExportedHandler<unknown> = {
|
|
|
61
67
|
return worker.scheduled(controller, env, ctx);
|
|
62
68
|
}
|
|
63
69
|
};
|
|
70
|
+
return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
64
74
|
|
|
75
|
+
function wrapWorkerEntrypoint(
|
|
76
|
+
klass: WorkerEntrypointConstructor
|
|
77
|
+
): WorkerEntrypointConstructor {
|
|
78
|
+
// If we don't have any middleware defined, just return the handler as is
|
|
79
|
+
if (
|
|
80
|
+
__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||
|
|
81
|
+
__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0
|
|
82
|
+
) {
|
|
83
|
+
return klass;
|
|
84
|
+
}
|
|
85
|
+
// Otherwise, register all middleware once
|
|
86
|
+
for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {
|
|
87
|
+
__facade_register__(middleware);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// `extend`ing `klass` here so other RPC methods remain callable
|
|
91
|
+
return class extends klass {
|
|
92
|
+
#fetchDispatcher: ExportedHandlerFetchHandler<Record<string, unknown>> = (
|
|
93
|
+
request,
|
|
94
|
+
env,
|
|
95
|
+
ctx
|
|
96
|
+
) => {
|
|
97
|
+
this.env = env;
|
|
98
|
+
this.ctx = ctx;
|
|
99
|
+
if (super.fetch === undefined) {
|
|
100
|
+
throw new Error("Entrypoint class does not define a fetch() function.");
|
|
101
|
+
}
|
|
102
|
+
return super.fetch(request);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
#dispatcher: Dispatcher = (type, init) => {
|
|
106
|
+
if (type === "scheduled" && super.scheduled !== undefined) {
|
|
107
|
+
const controller = new __Facade_ScheduledController__(
|
|
108
|
+
Date.now(),
|
|
109
|
+
init.cron ?? "",
|
|
110
|
+
() => {}
|
|
111
|
+
);
|
|
112
|
+
return super.scheduled(controller);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
fetch(request: Request<unknown, IncomingRequestCfProperties>) {
|
|
65
117
|
return __facade_invoke__(
|
|
66
118
|
request,
|
|
67
|
-
env,
|
|
68
|
-
ctx,
|
|
69
|
-
|
|
70
|
-
|
|
119
|
+
this.env,
|
|
120
|
+
this.ctx,
|
|
121
|
+
this.#dispatcher,
|
|
122
|
+
this.#fetchDispatcher
|
|
71
123
|
);
|
|
72
|
-
} else {
|
|
73
|
-
// We didn't have any middleware so we can skip the invocation chain,
|
|
74
|
-
// and just call the fetch handler directly
|
|
75
|
-
|
|
76
|
-
// We "don't care" if this is undefined as we want to have the same behaviour
|
|
77
|
-
// as if the worker completely bypassed middleware.
|
|
78
|
-
return worker.fetch!(request, env, ctx);
|
|
79
124
|
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
};
|
|
125
|
+
};
|
|
126
|
+
}
|
|
83
127
|
|
|
84
|
-
|
|
128
|
+
let WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined;
|
|
129
|
+
if (typeof ENTRY === "object") {
|
|
130
|
+
WRAPPED_ENTRY = wrapExportedHandler(ENTRY);
|
|
131
|
+
} else if (typeof ENTRY === "function") {
|
|
132
|
+
WRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY);
|
|
133
|
+
}
|
|
134
|
+
export default WRAPPED_ENTRY;
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import {
|
|
2
|
+
__facade_invoke__,
|
|
3
|
+
__facade_register__,
|
|
4
|
+
__facade_registerInternal__,
|
|
5
|
+
Awaitable,
|
|
6
|
+
Dispatcher,
|
|
7
|
+
IncomingRequest,
|
|
8
|
+
Middleware,
|
|
9
|
+
} from "./common";
|
|
10
|
+
|
|
11
|
+
export { __facade_register__, __facade_registerInternal__ };
|
|
12
|
+
|
|
13
|
+
// Miniflare 2's `EventTarget` follows the spec and doesn't allow exceptions to
|
|
14
|
+
// be caught by `dispatchEvent`. Instead it has a custom `ThrowingEventTarget`
|
|
6
15
|
// class that rethrows errors from event listeners in `dispatchEvent`.
|
|
7
16
|
// We'd like errors to be propagated to the top-level `addEventListener`, so
|
|
8
17
|
// we'd like to use `ThrowingEventTarget`. Unfortunately, `ThrowingEventTarget`
|
|
@@ -15,45 +24,52 @@ if ((globalThis as any).MINIFLARE) {
|
|
|
15
24
|
__FACADE_EVENT_TARGET__ = new EventTarget();
|
|
16
25
|
}
|
|
17
26
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
listener: EventListenerOrEventListenerObject,
|
|
22
|
-
options?: EventTargetAddEventListenerOptions | boolean
|
|
23
|
-
) => void;
|
|
24
|
-
var __facade_removeEventListener__: (
|
|
25
|
-
type: string,
|
|
26
|
-
listener: EventListenerOrEventListenerObject,
|
|
27
|
-
options?: EventTargetEventListenerOptions | boolean
|
|
28
|
-
) => void;
|
|
29
|
-
var __facade_dispatchEvent__: (event: Event) => void;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function __facade_isSpecialEvent__(type: string) {
|
|
27
|
+
function __facade_isSpecialEvent__(
|
|
28
|
+
type: string
|
|
29
|
+
): type is "fetch" | "scheduled" {
|
|
33
30
|
return type === "fetch" || type === "scheduled";
|
|
34
31
|
}
|
|
35
|
-
|
|
32
|
+
const __facade__originalAddEventListener__ = globalThis.addEventListener;
|
|
33
|
+
const __facade__originalRemoveEventListener__ = globalThis.removeEventListener;
|
|
34
|
+
const __facade__originalDispatchEvent__ = globalThis.dispatchEvent;
|
|
35
|
+
|
|
36
|
+
globalThis.addEventListener = function (type, listener, options) {
|
|
36
37
|
if (__facade_isSpecialEvent__(type)) {
|
|
37
|
-
__FACADE_EVENT_TARGET__.addEventListener(
|
|
38
|
+
__FACADE_EVENT_TARGET__.addEventListener(
|
|
39
|
+
type,
|
|
40
|
+
listener as EventListenerOrEventListenerObject,
|
|
41
|
+
options
|
|
42
|
+
);
|
|
38
43
|
} else {
|
|
39
|
-
|
|
44
|
+
__facade__originalAddEventListener__(type, listener, options);
|
|
40
45
|
}
|
|
41
46
|
};
|
|
42
|
-
globalThis.
|
|
47
|
+
globalThis.removeEventListener = function (type, listener, options) {
|
|
43
48
|
if (__facade_isSpecialEvent__(type)) {
|
|
44
|
-
__FACADE_EVENT_TARGET__.removeEventListener(
|
|
49
|
+
__FACADE_EVENT_TARGET__.removeEventListener(
|
|
50
|
+
type,
|
|
51
|
+
listener as EventListenerOrEventListenerObject,
|
|
52
|
+
options
|
|
53
|
+
);
|
|
45
54
|
} else {
|
|
46
|
-
|
|
55
|
+
__facade__originalRemoveEventListener__(type, listener, options);
|
|
47
56
|
}
|
|
48
57
|
};
|
|
49
|
-
globalThis.
|
|
58
|
+
globalThis.dispatchEvent = function (event) {
|
|
50
59
|
if (__facade_isSpecialEvent__(event.type)) {
|
|
51
|
-
__FACADE_EVENT_TARGET__.dispatchEvent(event);
|
|
60
|
+
return __FACADE_EVENT_TARGET__.dispatchEvent(event);
|
|
52
61
|
} else {
|
|
53
|
-
|
|
62
|
+
return __facade__originalDispatchEvent__(event);
|
|
54
63
|
}
|
|
55
64
|
};
|
|
56
65
|
|
|
66
|
+
declare global {
|
|
67
|
+
var addMiddleware: typeof __facade_register__;
|
|
68
|
+
var addMiddlewareInternal: typeof __facade_registerInternal__;
|
|
69
|
+
}
|
|
70
|
+
globalThis.addMiddleware = __facade_register__;
|
|
71
|
+
globalThis.addMiddlewareInternal = __facade_registerInternal__;
|
|
72
|
+
|
|
57
73
|
const __facade_waitUntil__ = Symbol("__facade_waitUntil__");
|
|
58
74
|
const __facade_response__ = Symbol("__facade_response__");
|
|
59
75
|
const __facade_dispatched__ = Symbol("__facade_dispatched__");
|
|
@@ -154,7 +170,7 @@ class __Facade_ScheduledEvent__ extends __Facade_ExtendableEvent__ {
|
|
|
154
170
|
}
|
|
155
171
|
}
|
|
156
172
|
|
|
157
|
-
|
|
173
|
+
__facade__originalAddEventListener__("fetch", (event) => {
|
|
158
174
|
const ctx: ExecutionContext = {
|
|
159
175
|
waitUntil: event.waitUntil.bind(event),
|
|
160
176
|
passThroughOnException: event.passThroughOnException.bind(event),
|
|
@@ -192,7 +208,7 @@ globalThis.addEventListener("fetch", (event) => {
|
|
|
192
208
|
|
|
193
209
|
event.respondWith(
|
|
194
210
|
__facade_invoke__(
|
|
195
|
-
event.request,
|
|
211
|
+
event.request as IncomingRequest,
|
|
196
212
|
globalThis,
|
|
197
213
|
ctx,
|
|
198
214
|
__facade_sw_dispatch__,
|
|
@@ -201,7 +217,7 @@ globalThis.addEventListener("fetch", (event) => {
|
|
|
201
217
|
);
|
|
202
218
|
});
|
|
203
219
|
|
|
204
|
-
|
|
220
|
+
__facade__originalAddEventListener__("scheduled", (event) => {
|
|
205
221
|
const facadeEvent = new __Facade_ScheduledEvent__("scheduled", {
|
|
206
222
|
scheduledTime: event.scheduledTime,
|
|
207
223
|
cron: event.cron,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Middleware } from "./common";
|
|
2
|
+
|
|
3
|
+
const drainBody: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
4
|
+
try {
|
|
5
|
+
return await middlewareCtx.next(request, env);
|
|
6
|
+
} finally {
|
|
7
|
+
try {
|
|
8
|
+
if (request.body !== null && !request.bodyUsed) {
|
|
9
|
+
const reader = request.body.getReader();
|
|
10
|
+
while (!(await reader.read()).done) {}
|
|
11
|
+
}
|
|
12
|
+
} catch (e) {
|
|
13
|
+
console.error("Failed to drain the unused request body.", e);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export default drainBody;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Middleware } from "./common";
|
|
2
|
+
|
|
3
|
+
interface JsonError {
|
|
4
|
+
message?: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
stack?: string;
|
|
7
|
+
cause?: JsonError;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function reduceError(e: any): JsonError {
|
|
11
|
+
return {
|
|
12
|
+
name: e?.name,
|
|
13
|
+
message: e?.message ?? String(e),
|
|
14
|
+
stack: e?.stack,
|
|
15
|
+
cause: e?.cause === undefined ? undefined : reduceError(e.cause),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// See comment in `bundle.ts` for details on why this is needed
|
|
20
|
+
const jsonError: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
21
|
+
try {
|
|
22
|
+
return await middlewareCtx.next(request, env);
|
|
23
|
+
} catch (e: any) {
|
|
24
|
+
const error = reduceError(e);
|
|
25
|
+
return Response.json(error, {
|
|
26
|
+
status: 500,
|
|
27
|
+
headers: { "MF-Experimental-Error-Stack": "true" },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default jsonError;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/// <reference path="middleware-serve-static-assets.d.ts"/>
|
|
2
|
+
|
|
3
|
+
import manifest from "__STATIC_CONTENT_MANIFEST";
|
|
4
|
+
import {
|
|
5
|
+
getAssetFromKV,
|
|
6
|
+
MethodNotAllowedError,
|
|
7
|
+
NotFoundError,
|
|
8
|
+
serveSinglePageApp,
|
|
9
|
+
} from "@cloudflare/kv-asset-handler";
|
|
10
|
+
import { cacheControl, spaMode } from "config:middleware/serve-static-assets";
|
|
11
|
+
import type { Middleware } from "./common";
|
|
12
|
+
import type { Options } from "@cloudflare/kv-asset-handler";
|
|
13
|
+
import type * as kvAssetHandler from "@cloudflare/kv-asset-handler";
|
|
14
|
+
|
|
15
|
+
const ASSET_MANIFEST = JSON.parse(manifest);
|
|
16
|
+
|
|
17
|
+
const staticAssets: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
18
|
+
let options: Partial<Options> = {
|
|
19
|
+
ASSET_MANIFEST,
|
|
20
|
+
ASSET_NAMESPACE: env.__STATIC_CONTENT,
|
|
21
|
+
cacheControl: cacheControl,
|
|
22
|
+
mapRequestToAsset: spaMode ? serveSinglePageApp : undefined,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const page = await (getAssetFromKV as typeof kvAssetHandler.getAssetFromKV)(
|
|
27
|
+
{
|
|
28
|
+
request,
|
|
29
|
+
waitUntil(promise) {
|
|
30
|
+
return _ctx.waitUntil(promise);
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
options
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
// allow headers to be altered
|
|
37
|
+
const response = new Response(page.body, page);
|
|
38
|
+
|
|
39
|
+
response.headers.set("X-XSS-Protection", "1; mode=block");
|
|
40
|
+
response.headers.set("X-Content-Type-Options", "nosniff");
|
|
41
|
+
response.headers.set("X-Frame-Options", "DENY");
|
|
42
|
+
response.headers.set("Referrer-Policy", "unsafe-url");
|
|
43
|
+
response.headers.set("Feature-Policy", "none");
|
|
44
|
+
|
|
45
|
+
return response;
|
|
46
|
+
} catch (e) {
|
|
47
|
+
if (e instanceof NotFoundError || e instanceof MethodNotAllowedError) {
|
|
48
|
+
// if a known error is thrown then serve from actual worker
|
|
49
|
+
return await middlewareCtx.next(request, env);
|
|
50
|
+
}
|
|
51
|
+
// otherwise it's a real error, so throw it
|
|
52
|
+
throw e;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export default staticAssets;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - Run `curl "http://localhost:8787/cdn-cgi/mf/scheduled"` to trigger the scheduled event
|
|
6
6
|
* - Go back to the console to see what your worker has logged
|
|
7
7
|
* - Update the Cron trigger in wrangler.toml (see https://developers.cloudflare.com/workers/wrangler/configuration/#triggers)
|
|
8
|
-
* - Run `wrangler
|
|
8
|
+
* - Run `wrangler deploy --name my-worker` to deploy your worker
|
|
9
9
|
*
|
|
10
10
|
* Learn more at https://developers.cloudflare.com/workers/runtime-apis/scheduled-event/
|
|
11
11
|
*/
|
package/templates/new-worker.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* - Run `wrangler dev src/index.ts` in your terminal to start a development server
|
|
5
5
|
* - Open a browser tab at http://localhost:8787/ to see your worker in action
|
|
6
|
-
* - Run `wrangler
|
|
6
|
+
* - Run `wrangler deploy src/index.ts --name my-worker` to deploy your worker
|
|
7
7
|
*
|
|
8
8
|
* Learn more at https://developers.cloudflare.com/workers/
|
|
9
9
|
*/
|
|
@@ -17,6 +17,9 @@ export interface Env {
|
|
|
17
17
|
//
|
|
18
18
|
// Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/
|
|
19
19
|
// MY_BUCKET: R2Bucket;
|
|
20
|
+
//
|
|
21
|
+
// Example binding to a Service. Learn more at https://developers.cloudflare.com/workers/runtime-apis/service-bindings/
|
|
22
|
+
// MY_SERVICE: Fetcher;
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
export default {
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
// @ts-ignore entry point will get replaced
|
|
2
2
|
import worker from "__ENTRY_POINT__";
|
|
3
|
+
import { isRoutingRuleMatch } from "./pages-dev-util";
|
|
4
|
+
|
|
3
5
|
// @ts-ignore entry point will get replaced
|
|
4
6
|
export * from "__ENTRY_POINT__";
|
|
5
|
-
import { isRoutingRuleMatch } from "./pages-dev-util";
|
|
6
7
|
|
|
7
8
|
// @ts-ignore routes are injected
|
|
8
9
|
const routes = __ROUTES__;
|
|
9
10
|
|
|
10
|
-
export default {
|
|
11
|
+
export default <ExportedHandler<{ ASSETS: Fetcher }>>{
|
|
11
12
|
fetch(request, env, context) {
|
|
12
13
|
const { pathname } = new URL(request.url);
|
|
13
14
|
|
|
@@ -19,6 +20,9 @@ export default {
|
|
|
19
20
|
|
|
20
21
|
for (const include of routes.include) {
|
|
21
22
|
if (isRoutingRuleMatch(pathname, include)) {
|
|
23
|
+
if (worker.fetch === undefined) {
|
|
24
|
+
throw new TypeError("Entry point missing `fetch` handler");
|
|
25
|
+
}
|
|
22
26
|
return worker.fetch(request, env, context);
|
|
23
27
|
}
|
|
24
28
|
}
|
|
@@ -45,7 +45,10 @@ function transformRoutingRuleToRegExp(rule: string): RegExp {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// /foo* => /foo.* => ^/foo.*$
|
|
48
|
-
|
|
48
|
+
// /*.* => /*\.* => /.*\..* => ^/.*\..*$
|
|
49
|
+
transformedRule = `^${transformedRule
|
|
50
|
+
.replaceAll(/\./g, "\\.")
|
|
51
|
+
.replaceAll(/\*/g, ".*")}$`;
|
|
49
52
|
|
|
50
53
|
// ^/foo.*$ => /^\/foo.*$/
|
|
51
54
|
return new RegExp(transformedRule);
|
package/templates/pages-shim.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// This Worker is used as a default when no Pages Functions are present.
|
|
2
2
|
// It proxies the request directly on to the asset server binding.
|
|
3
3
|
|
|
4
|
-
export default {
|
|
4
|
+
export default <ExportedHandler<{ ASSETS: Fetcher }>>{
|
|
5
5
|
async fetch(request, env, context) {
|
|
6
6
|
const response = await env.ASSETS.fetch(request.url, request);
|
|
7
7
|
return new Response(response.body, response);
|
|
@@ -41,14 +41,14 @@ type EventPluginContext<Env, P extends string, Data, PluginArgs> = {
|
|
|
41
41
|
declare type PagesFunction<
|
|
42
42
|
Env = unknown,
|
|
43
43
|
P extends string = string,
|
|
44
|
-
Data extends Record<string, unknown> = Record<string, unknown
|
|
44
|
+
Data extends Record<string, unknown> = Record<string, unknown>,
|
|
45
45
|
> = (context: EventContext<Env, P, Data>) => Response | Promise<Response>;
|
|
46
46
|
|
|
47
47
|
declare type PagesPluginFunction<
|
|
48
48
|
Env = unknown,
|
|
49
49
|
P extends string = string,
|
|
50
50
|
Data extends Record<string, unknown> = Record<string, unknown>,
|
|
51
|
-
PluginArgs = unknown
|
|
51
|
+
PluginArgs = unknown,
|
|
52
52
|
> = (
|
|
53
53
|
context: EventPluginContext<Env, P, Data, PluginArgs>
|
|
54
54
|
) => Response | Promise<Response>;
|
|
@@ -119,20 +119,26 @@ function* executeRequest(request: Request, relativePathname: string) {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
export default function (pluginArgs) {
|
|
122
|
+
export default function (pluginArgs: unknown) {
|
|
123
123
|
const onRequest: PagesPluginFunction = async (workerContext) => {
|
|
124
124
|
let { request } = workerContext;
|
|
125
|
-
const { env, next
|
|
125
|
+
const { env, next } = workerContext;
|
|
126
|
+
let { data } = workerContext;
|
|
126
127
|
|
|
127
128
|
const url = new URL(request.url);
|
|
129
|
+
// TODO: Replace this with something actually legible.
|
|
128
130
|
const relativePathname = `/${
|
|
129
|
-
url.pathname.
|
|
131
|
+
url.pathname.replace(workerContext.functionPath, "") || ""
|
|
130
132
|
}`.replace(/^\/\//, "/");
|
|
131
133
|
|
|
132
134
|
const handlerIterator = executeRequest(request, relativePathname);
|
|
133
135
|
const pluginNext = async (input?: RequestInfo, init?: RequestInit) => {
|
|
134
136
|
if (input !== undefined) {
|
|
135
|
-
|
|
137
|
+
let url = input;
|
|
138
|
+
if (typeof input === "string") {
|
|
139
|
+
url = new URL(input, request.url).toString();
|
|
140
|
+
}
|
|
141
|
+
request = new Request(url, init);
|
|
136
142
|
}
|
|
137
143
|
|
|
138
144
|
const result = handlerIterator.next();
|
|
@@ -140,11 +146,20 @@ export default function (pluginArgs) {
|
|
|
140
146
|
if (result.done === false) {
|
|
141
147
|
const { handler, params, path } = result.value;
|
|
142
148
|
const context = {
|
|
143
|
-
request,
|
|
149
|
+
request: new Request(request.clone()),
|
|
144
150
|
functionPath: workerContext.functionPath + path,
|
|
145
151
|
next: pluginNext,
|
|
146
152
|
params,
|
|
147
|
-
data
|
|
153
|
+
get data() {
|
|
154
|
+
return data;
|
|
155
|
+
},
|
|
156
|
+
set data(value) {
|
|
157
|
+
if (typeof value !== "object" || value === null) {
|
|
158
|
+
throw new Error("context.data must be an object");
|
|
159
|
+
}
|
|
160
|
+
// user has overriden context.data, so we need to merge it with the existing data
|
|
161
|
+
data = value;
|
|
162
|
+
},
|
|
148
163
|
pluginArgs,
|
|
149
164
|
env,
|
|
150
165
|
waitUntil: workerContext.waitUntil.bind(workerContext),
|
|
@@ -154,13 +169,9 @@ export default function (pluginArgs) {
|
|
|
154
169
|
|
|
155
170
|
const response = await handler(context);
|
|
156
171
|
|
|
157
|
-
|
|
158
|
-
return new Response(
|
|
159
|
-
[101, 204, 205, 304].includes(response.status) ? null : response.body,
|
|
160
|
-
{ ...response, headers: new Headers(response.headers) }
|
|
161
|
-
);
|
|
172
|
+
return cloneResponse(response);
|
|
162
173
|
} else {
|
|
163
|
-
return next();
|
|
174
|
+
return next(request);
|
|
164
175
|
}
|
|
165
176
|
};
|
|
166
177
|
|
|
@@ -169,3 +180,11 @@ export default function (pluginArgs) {
|
|
|
169
180
|
|
|
170
181
|
return onRequest;
|
|
171
182
|
}
|
|
183
|
+
|
|
184
|
+
// This makes a Response mutable
|
|
185
|
+
const cloneResponse = (response: Response) =>
|
|
186
|
+
// https://fetch.spec.whatwg.org/#null-body-status
|
|
187
|
+
new Response(
|
|
188
|
+
[101, 204, 205, 304].includes(response.status) ? null : response.body,
|
|
189
|
+
response
|
|
190
|
+
);
|
|
@@ -29,7 +29,7 @@ type EventContext<Env, P extends string, Data> = {
|
|
|
29
29
|
declare type PagesFunction<
|
|
30
30
|
Env = unknown,
|
|
31
31
|
P extends string = string,
|
|
32
|
-
Data extends Record<string, unknown> = Record<string, unknown
|
|
32
|
+
Data extends Record<string, unknown> = Record<string, unknown>,
|
|
33
33
|
> = (context: EventContext<Env, P, Data>) => Response | Promise<Response>;
|
|
34
34
|
/* end @cloudflare/workers-types */
|
|
35
35
|
|
|
@@ -120,7 +120,7 @@ export default {
|
|
|
120
120
|
) {
|
|
121
121
|
let request = originalRequest;
|
|
122
122
|
const handlerIterator = executeRequest(request);
|
|
123
|
-
|
|
123
|
+
let data = {}; // arbitrary data the user can set between functions
|
|
124
124
|
let isFailOpen = false;
|
|
125
125
|
|
|
126
126
|
const next = async (input?: RequestInfo, init?: RequestInit) => {
|
|
@@ -141,7 +141,16 @@ export default {
|
|
|
141
141
|
functionPath: path,
|
|
142
142
|
next,
|
|
143
143
|
params,
|
|
144
|
-
data
|
|
144
|
+
get data() {
|
|
145
|
+
return data;
|
|
146
|
+
},
|
|
147
|
+
set data(value) {
|
|
148
|
+
if (typeof value !== "object" || value === null) {
|
|
149
|
+
throw new Error("context.data must be an object");
|
|
150
|
+
}
|
|
151
|
+
// user has overriden context.data, so we need to merge it with the existing data
|
|
152
|
+
data = value;
|
|
153
|
+
},
|
|
145
154
|
env,
|
|
146
155
|
waitUntil: workerContext.waitUntil.bind(workerContext),
|
|
147
156
|
passThroughOnException: () => {
|