wrangler 0.0.0-e4047cab → 0.0.0-e4104915
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 +12 -14
- package/bin/wrangler.js +14 -67
- package/package.json +213 -192
- 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 +17 -0
- package/templates/gitignore +1 -0
- package/templates/init-tests/test-jest-new-worker.js +3 -5
- package/templates/init-tests/test-vitest-new-worker.js +3 -5
- package/templates/init-tests/test-vitest-new-worker.ts +25 -0
- package/templates/middleware/common.ts +9 -4
- package/templates/middleware/loader-modules.ts +64 -11
- package/templates/middleware/loader-sw.ts +2 -1
- package/templates/middleware/middleware-d1-beta.d.ts +3 -0
- package/templates/middleware/middleware-miniflare3-json-error.ts +18 -5
- package/templates/middleware/middleware-multiworker-dev.d.ts +4 -0
- package/templates/middleware/middleware-multiworker-dev.ts +68 -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 +4 -1
- package/templates/pages-dev-util.ts +4 -1
- package/templates/pages-shim.ts +1 -1
- package/templates/pages-template-plugin.ts +31 -12
- package/templates/pages-template-worker.ts +11 -2
- package/templates/startDevWorker/InspectorProxyWorker.ts +652 -0
- package/templates/startDevWorker/ProxyWorker.ts +252 -0
- package/templates/tsconfig-sanity.ts +11 -0
- package/templates/tsconfig.init.json +105 -0
- package/templates/tsconfig.json +5 -103
- package/wrangler-dist/InspectorProxyWorker.js +460 -0
- package/wrangler-dist/InspectorProxyWorker.js.map +6 -0
- package/wrangler-dist/ProxyWorker.js +186 -0
- package/wrangler-dist/ProxyWorker.js.map +6 -0
- package/wrangler-dist/cli.d.ts +23076 -462
- package/wrangler-dist/cli.js +134460 -136904
- package/wrangler-dist/wasm-sync.wasm +0 -0
- 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 -6321
- 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 -56
- 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 -3981
- package/src/__tests__/d1.test.ts +0 -80
- package/src/__tests__/delete.test.ts +0 -263
- package/src/__tests__/deployments.test.ts +0 -91
- package/src/__tests__/dev.test.tsx +0 -1536
- 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 -256
- 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 -31
- 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 -264
- 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__/logout.test.ts +0 -47
- 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-deployment-tail.test.ts +0 -820
- package/src/__tests__/pages.test.ts +0 -2442
- package/src/__tests__/parse.test.ts +0 -330
- package/src/__tests__/paths.test.ts +0 -39
- package/src/__tests__/publish.test.ts +0 -7633
- package/src/__tests__/pubsub.test.ts +0 -370
- package/src/__tests__/queues.test.ts +0 -522
- package/src/__tests__/r2.test.ts +0 -393
- package/src/__tests__/route.test.ts +0 -45
- package/src/__tests__/secret.test.ts +0 -644
- package/src/__tests__/tail.test.ts +0 -899
- package/src/__tests__/test-old-node-version.js +0 -31
- package/src/__tests__/type-generation.test.ts +0 -226
- package/src/__tests__/user.test.ts +0 -129
- 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 -210
- package/src/api/index.ts +0 -2
- package/src/bundle-reporter.tsx +0 -68
- package/src/bundle.ts +0 -823
- 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 -561
- package/src/config/index.ts +0 -334
- package/src/config/validation-helpers.ts +0 -597
- package/src/config/validation.ts +0 -2103
- package/src/config-cache.ts +0 -85
- package/src/create-worker-preview.ts +0 -282
- package/src/create-worker-upload-form.ts +0 -316
- package/src/d1/backups.tsx +0 -223
- package/src/d1/constants.ts +0 -2
- package/src/d1/create.tsx +0 -63
- package/src/d1/delete.tsx +0 -56
- package/src/d1/execute.tsx +0 -352
- package/src/d1/formatTimeAgo.ts +0 -14
- package/src/d1/index.ts +0 -101
- package/src/d1/list.tsx +0 -48
- package/src/d1/migrations/apply.tsx +0 -184
- package/src/d1/migrations/create.tsx +0 -77
- package/src/d1/migrations/helpers.ts +0 -147
- package/src/d1/migrations/index.tsx +0 -3
- package/src/d1/migrations/list.tsx +0 -79
- package/src/d1/migrations/options.ts +0 -18
- package/src/d1/options.ts +0 -22
- package/src/d1/types.tsx +0 -24
- package/src/d1/utils.ts +0 -48
- package/src/delete.ts +0 -108
- package/src/deployments.ts +0 -77
- package/src/deprecated/index.ts +0 -438
- package/src/dev/dev-vars.ts +0 -39
- package/src/dev/dev.tsx +0 -614
- package/src/dev/get-local-persistence-path.tsx +0 -31
- package/src/dev/local.tsx +0 -890
- package/src/dev/remote.tsx +0 -603
- package/src/dev/start-server.ts +0 -539
- 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 -904
- package/src/dialogs.tsx +0 -168
- 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 -687
- 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 -96
- package/src/miniflare-cli/README.md +0 -30
- package/src/miniflare-cli/assets.ts +0 -220
- 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 -270
- package/src/pages/constants.ts +0 -18
- package/src/pages/deployment-tails.tsx +0 -284
- package/src/pages/deployments.tsx +0 -84
- package/src/pages/dev.tsx +0 -706
- package/src/pages/errors.ts +0 -66
- package/src/pages/functions/buildPlugin.ts +0 -107
- package/src/pages/functions/buildWorker.ts +0 -166
- 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 -102
- package/src/pages/projects.tsx +0 -169
- package/src/pages/prompt-select-project.tsx +0 -31
- package/src/pages/publish.tsx +0 -451
- package/src/pages/types.ts +0 -41
- package/src/pages/upload.tsx +0 -426
- package/src/pages/utils.ts +0 -23
- package/src/parse.ts +0 -286
- package/src/paths.ts +0 -71
- package/src/proxy.ts +0 -694
- 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 -36
- package/src/queues/cli/commands/list.ts +0 -25
- package/src/queues/client.ts +0 -135
- package/src/queues/utils.ts +0 -18
- package/src/r2/constants.ts +0 -4
- package/src/r2/helpers.ts +0 -131
- package/src/r2/index.ts +0 -289
- package/src/routes.ts +0 -140
- package/src/secret/index.ts +0 -378
- package/src/selfsigned.d.ts +0 -29
- package/src/sites.tsx +0 -372
- package/src/tail/createTail.ts +0 -379
- 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 -173
- 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 -1198
- package/src/utils/collectKeyValues.ts +0 -14
- package/src/whoami.tsx +0 -169
- package/src/worker.ts +0 -245
- package/src/yargs-types.ts +0 -24
- package/src/zones.ts +0 -191
- package/templates/d1-beta-facade.js +0 -205
- 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,17 +1,30 @@
|
|
|
1
1
|
const urls = new Set();
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
const url =
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
function checkURL(request, init) {
|
|
4
|
+
const url =
|
|
5
|
+
request instanceof URL
|
|
6
|
+
? request
|
|
7
|
+
: new URL(
|
|
8
|
+
(typeof request === "string"
|
|
9
|
+
? new Request(request, init)
|
|
10
|
+
: request
|
|
11
|
+
).url
|
|
12
|
+
);
|
|
7
13
|
if (url.port && url.port !== "443" && url.protocol === "https:") {
|
|
8
14
|
if (!urls.has(url.toString())) {
|
|
9
15
|
urls.add(url.toString());
|
|
10
16
|
console.warn(
|
|
11
17
|
`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
|
|
18
|
+
` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command.\n`
|
|
13
19
|
);
|
|
14
20
|
}
|
|
15
21
|
}
|
|
16
|
-
return globalThis.fetch(request, init);
|
|
17
22
|
}
|
|
23
|
+
|
|
24
|
+
globalThis.fetch = new Proxy(globalThis.fetch, {
|
|
25
|
+
apply(target, thisArg, argArray) {
|
|
26
|
+
const [request, init] = argArray;
|
|
27
|
+
checkURL(request, init);
|
|
28
|
+
return Reflect.apply(target, thisArg, argArray);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare module "__ENTRY_POINT__" {
|
|
2
|
+
import type { Middleware } from "./middleware/common";
|
|
3
|
+
const worker: ExportedHandler & {
|
|
4
|
+
middleware?: Middleware[];
|
|
5
|
+
envWrappers: ((env: Record<string, unknown>) => Record<string, unknown>)[];
|
|
6
|
+
};
|
|
7
|
+
export default worker;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
declare module "__KV_ASSET_HANDLER__" {
|
|
11
|
+
export * from "@cloudflare/kv-asset-handler";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare module "__STATIC_CONTENT_MANIFEST" {
|
|
15
|
+
const manifest: string;
|
|
16
|
+
export default manifest;
|
|
17
|
+
}
|
package/templates/gitignore
CHANGED
|
@@ -4,11 +4,9 @@ describe("Worker", () => {
|
|
|
4
4
|
let worker;
|
|
5
5
|
|
|
6
6
|
beforeAll(async () => {
|
|
7
|
-
worker = await unstable_dev(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
{ disableExperimentalWarning: true }
|
|
11
|
-
);
|
|
7
|
+
worker = await unstable_dev("src/index.js", {
|
|
8
|
+
experimental: { disableExperimentalWarning: true },
|
|
9
|
+
});
|
|
12
10
|
});
|
|
13
11
|
|
|
14
12
|
afterAll(async () => {
|
|
@@ -5,11 +5,9 @@ describe("Worker", () => {
|
|
|
5
5
|
let worker;
|
|
6
6
|
|
|
7
7
|
beforeAll(async () => {
|
|
8
|
-
worker = await unstable_dev(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
{ disableExperimentalWarning: true }
|
|
12
|
-
);
|
|
8
|
+
worker = await unstable_dev("src/index.js", {
|
|
9
|
+
experimental: { disableExperimentalWarning: true },
|
|
10
|
+
});
|
|
13
11
|
});
|
|
14
12
|
|
|
15
13
|
afterAll(async () => {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { unstable_dev } from "wrangler";
|
|
2
|
+
import type { UnstableDevWorker } from "wrangler";
|
|
3
|
+
import { describe, expect, it, beforeAll, afterAll } from "vitest";
|
|
4
|
+
|
|
5
|
+
describe("Worker", () => {
|
|
6
|
+
let worker: UnstableDevWorker;
|
|
7
|
+
|
|
8
|
+
beforeAll(async () => {
|
|
9
|
+
worker = await unstable_dev("src/index.ts", {
|
|
10
|
+
experimental: { 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
|
+
});
|
|
@@ -5,13 +5,18 @@ export type Dispatcher = (
|
|
|
5
5
|
init: { cron?: string }
|
|
6
6
|
) => Awaitable<void>;
|
|
7
7
|
|
|
8
|
+
export type IncomingRequest = Request<
|
|
9
|
+
unknown,
|
|
10
|
+
IncomingRequestCfProperties<unknown>
|
|
11
|
+
>;
|
|
12
|
+
|
|
8
13
|
export interface MiddlewareContext {
|
|
9
14
|
dispatch: Dispatcher;
|
|
10
|
-
next(request:
|
|
15
|
+
next(request: IncomingRequest, env: any): Awaitable<Response>;
|
|
11
16
|
}
|
|
12
17
|
|
|
13
18
|
export type Middleware = (
|
|
14
|
-
request:
|
|
19
|
+
request: IncomingRequest,
|
|
15
20
|
env: any,
|
|
16
21
|
ctx: ExecutionContext,
|
|
17
22
|
middlewareCtx: MiddlewareContext
|
|
@@ -32,7 +37,7 @@ export function __facade_registerInternal__(
|
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
function __facade_invokeChain__(
|
|
35
|
-
request:
|
|
40
|
+
request: IncomingRequest,
|
|
36
41
|
env: any,
|
|
37
42
|
ctx: ExecutionContext,
|
|
38
43
|
dispatch: Dispatcher,
|
|
@@ -49,7 +54,7 @@ function __facade_invokeChain__(
|
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
export function __facade_invoke__(
|
|
52
|
-
request:
|
|
57
|
+
request: IncomingRequest,
|
|
53
58
|
env: any,
|
|
54
59
|
ctx: ExecutionContext,
|
|
55
60
|
dispatch: Dispatcher,
|
|
@@ -11,11 +11,9 @@ import {
|
|
|
11
11
|
__facade_register__,
|
|
12
12
|
} from "./common";
|
|
13
13
|
|
|
14
|
-
// @ts-expect-error We'll swap in the entry point during build
|
|
15
14
|
import worker from "__ENTRY_POINT__";
|
|
16
15
|
|
|
17
16
|
// We need to preserve all of the exports from the worker
|
|
18
|
-
// @ts-expect-error We'll swap in the entry point during build
|
|
19
17
|
export * from "__ENTRY_POINT__";
|
|
20
18
|
|
|
21
19
|
class __Facade_ScheduledController__ implements ScheduledController {
|
|
@@ -38,17 +36,68 @@ class __Facade_ScheduledController__ implements ScheduledController {
|
|
|
38
36
|
}
|
|
39
37
|
}
|
|
40
38
|
|
|
41
|
-
const __facade_modules_fetch__:
|
|
42
|
-
|
|
39
|
+
const __facade_modules_fetch__: ExportedHandlerFetchHandler = function (
|
|
40
|
+
request,
|
|
41
|
+
env,
|
|
42
|
+
ctx
|
|
43
|
+
) {
|
|
44
|
+
if (worker.fetch === undefined)
|
|
45
|
+
throw new Error("Handler does not export a fetch() function.");
|
|
43
46
|
return worker.fetch(request, env, ctx);
|
|
44
47
|
};
|
|
45
48
|
|
|
46
|
-
|
|
47
|
-
|
|
49
|
+
function getMaskedEnv(rawEnv: unknown) {
|
|
50
|
+
let env = rawEnv as Record<string, unknown>;
|
|
51
|
+
if (worker.envWrappers && worker.envWrappers.length > 0) {
|
|
52
|
+
for (const wrapFn of worker.envWrappers) {
|
|
53
|
+
env = wrapFn(env);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return env;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* This type is here to cause a type error if a new export handler is added to
|
|
61
|
+
* `ExportHandler` without it being included in the `facade` below.
|
|
62
|
+
*/
|
|
63
|
+
type MissingExportHandlers = Omit<
|
|
64
|
+
Required<ExportedHandler>,
|
|
65
|
+
"tail" | "trace" | "scheduled" | "queue" | "test" | "email" | "fetch"
|
|
66
|
+
>;
|
|
67
|
+
|
|
68
|
+
let registeredMiddleware = false;
|
|
69
|
+
|
|
70
|
+
const facade: ExportedHandler<unknown> & MissingExportHandlers = {
|
|
71
|
+
...(worker.tail && {
|
|
72
|
+
tail: maskHandlerEnv(worker.tail),
|
|
73
|
+
}),
|
|
74
|
+
...(worker.trace && {
|
|
75
|
+
trace: maskHandlerEnv(worker.trace),
|
|
76
|
+
}),
|
|
77
|
+
...(worker.scheduled && {
|
|
78
|
+
scheduled: maskHandlerEnv(worker.scheduled),
|
|
79
|
+
}),
|
|
80
|
+
...(worker.queue && {
|
|
81
|
+
queue: maskHandlerEnv(worker.queue),
|
|
82
|
+
}),
|
|
83
|
+
...(worker.test && {
|
|
84
|
+
test: maskHandlerEnv(worker.test),
|
|
85
|
+
}),
|
|
86
|
+
...(worker.email && {
|
|
87
|
+
email: maskHandlerEnv(worker.email),
|
|
88
|
+
}),
|
|
89
|
+
|
|
90
|
+
fetch(request, rawEnv, ctx) {
|
|
91
|
+
const env = getMaskedEnv(rawEnv);
|
|
48
92
|
// Get the chain of middleware from the worker object
|
|
49
93
|
if (worker.middleware && worker.middleware.length > 0) {
|
|
50
|
-
|
|
51
|
-
|
|
94
|
+
// Make sure we only register middleware once:
|
|
95
|
+
// https://github.com/cloudflare/workers-sdk/issues/2386#issuecomment-1614715911
|
|
96
|
+
if (!registeredMiddleware) {
|
|
97
|
+
registeredMiddleware = true;
|
|
98
|
+
for (const middleware of worker.middleware) {
|
|
99
|
+
__facade_register__(middleware);
|
|
100
|
+
}
|
|
52
101
|
}
|
|
53
102
|
|
|
54
103
|
const __facade_modules_dispatch__: Dispatcher = function (type, init) {
|
|
@@ -73,12 +122,16 @@ const facade: ExportedHandler<unknown> = {
|
|
|
73
122
|
// We didn't have any middleware so we can skip the invocation chain,
|
|
74
123
|
// and just call the fetch handler directly
|
|
75
124
|
|
|
76
|
-
// We "don't care" if this is undefined as we want to have the same
|
|
125
|
+
// We "don't care" if this is undefined as we want to have the same behavior
|
|
77
126
|
// as if the worker completely bypassed middleware.
|
|
78
|
-
return
|
|
127
|
+
return __facade_modules_fetch__(request, env, ctx);
|
|
79
128
|
}
|
|
80
129
|
},
|
|
81
|
-
scheduled: worker.scheduled,
|
|
82
130
|
};
|
|
83
131
|
|
|
132
|
+
type HandlerFn<D, R> = (data: D, env: unknown, ctx: ExecutionContext) => R;
|
|
133
|
+
function maskHandlerEnv<D, R>(handler: HandlerFn<D, R>): HandlerFn<D, R> {
|
|
134
|
+
return (data, env, ctx) => handler(data, getMaskedEnv(env), ctx);
|
|
135
|
+
}
|
|
136
|
+
|
|
84
137
|
export default facade;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Awaitable,
|
|
3
3
|
Dispatcher,
|
|
4
|
+
IncomingRequest,
|
|
4
5
|
Middleware,
|
|
5
6
|
__facade_invoke__,
|
|
6
7
|
__facade_register__,
|
|
@@ -206,7 +207,7 @@ __facade__originalAddEventListener__("fetch", (event) => {
|
|
|
206
207
|
|
|
207
208
|
event.respondWith(
|
|
208
209
|
__facade_invoke__(
|
|
209
|
-
event.request,
|
|
210
|
+
event.request as IncomingRequest,
|
|
210
211
|
globalThis,
|
|
211
212
|
ctx,
|
|
212
213
|
__facade_sw_dispatch__,
|
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
import type { Middleware } from "./common";
|
|
2
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
|
+
|
|
3
19
|
// See comment in `bundle.ts` for details on why this is needed
|
|
4
20
|
const jsonError: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
5
21
|
try {
|
|
6
22
|
return await middlewareCtx.next(request, env);
|
|
7
23
|
} catch (e: any) {
|
|
8
|
-
const error =
|
|
9
|
-
name: e?.name,
|
|
10
|
-
message: e?.message ?? String(e),
|
|
11
|
-
stack: e?.stack,
|
|
12
|
-
};
|
|
24
|
+
const error = reduceError(e);
|
|
13
25
|
return Response.json(error, {
|
|
14
26
|
status: 500,
|
|
15
27
|
headers: { "MF-Experimental-Error-Stack": "true" },
|
|
@@ -18,3 +30,4 @@ const jsonError: Middleware = async (request, env, _ctx, middlewareCtx) => {
|
|
|
18
30
|
};
|
|
19
31
|
|
|
20
32
|
export default jsonError;
|
|
33
|
+
export const wrap = undefined;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/// <reference path="middleware-multiworker-dev.d.ts"/>
|
|
3
|
+
|
|
4
|
+
import { workers } from "config:middleware/multiworker-dev";
|
|
5
|
+
import type { WorkerRegistry } from "../../src/dev-registry";
|
|
6
|
+
|
|
7
|
+
class Fetcher {
|
|
8
|
+
#name: string;
|
|
9
|
+
#details: WorkerRegistry[string];
|
|
10
|
+
constructor(name: string, details: WorkerRegistry[string]) {
|
|
11
|
+
this.#name = name;
|
|
12
|
+
this.#details = details;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async fetch(...reqArgs: Parameters<Fetcher["fetch"]>) {
|
|
16
|
+
const reqFromArgs = new Request(...reqArgs);
|
|
17
|
+
if (this.#details.headers) {
|
|
18
|
+
for (const [key, value] of Object.entries(this.#details.headers)) {
|
|
19
|
+
// In remote mode, you need to add a couple of headers
|
|
20
|
+
// to make sure it's talking to the 'dev' preview session
|
|
21
|
+
// (much like wrangler dev already does via proxy.ts)
|
|
22
|
+
reqFromArgs.headers.set(key, value);
|
|
23
|
+
}
|
|
24
|
+
return (env[this.#name] as Fetcher).fetch(reqFromArgs);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const url = new URL(reqFromArgs.url);
|
|
28
|
+
if (this.#details.protocol !== undefined) {
|
|
29
|
+
url.protocol = this.#details.protocol;
|
|
30
|
+
}
|
|
31
|
+
if (this.#details.host !== undefined) {
|
|
32
|
+
url.host = this.#details.host;
|
|
33
|
+
}
|
|
34
|
+
if (this.#details.port !== undefined) {
|
|
35
|
+
url.port = this.#details.port.toString();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const request = new Request(url.toString(), reqFromArgs);
|
|
39
|
+
return fetch(request);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function wrap(env: Record<string, unknown>) {
|
|
44
|
+
const facadeEnv = { ...env };
|
|
45
|
+
// For every Worker definition that's available,
|
|
46
|
+
// create a fetcher for it on the facade env.
|
|
47
|
+
// for const [name, binding] of env
|
|
48
|
+
// if Workers[name]
|
|
49
|
+
// const details = Workers[name];
|
|
50
|
+
|
|
51
|
+
for (const [name, details] of Object.entries(workers as WorkerRegistry)) {
|
|
52
|
+
if (details) {
|
|
53
|
+
facadeEnv[name] = new Fetcher(name, details);
|
|
54
|
+
} else {
|
|
55
|
+
// This means there's no dev binding available.
|
|
56
|
+
// Let's use whatever's available, or put a shim with a message.
|
|
57
|
+
facadeEnv[name] = facadeEnv[name] || {
|
|
58
|
+
async fetch() {
|
|
59
|
+
return new Response(
|
|
60
|
+
`You should start up wrangler dev --local on the ${name} worker`,
|
|
61
|
+
{ status: 404 }
|
|
62
|
+
);
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return facadeEnv;
|
|
68
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/// <reference path="middleware-serve-static-assets.d.ts"/>
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
getAssetFromKV,
|
|
5
|
+
NotFoundError,
|
|
6
|
+
MethodNotAllowedError,
|
|
7
|
+
serveSinglePageApp,
|
|
8
|
+
} from "@cloudflare/kv-asset-handler";
|
|
9
|
+
import type { Options } from "@cloudflare/kv-asset-handler";
|
|
10
|
+
import { spaMode, cacheControl } from "config:middleware/serve-static-assets";
|
|
11
|
+
import type * as kvAssetHandler from "@cloudflare/kv-asset-handler";
|
|
12
|
+
import manifest from "__STATIC_CONTENT_MANIFEST";
|
|
13
|
+
const ASSET_MANIFEST = JSON.parse(manifest);
|
|
14
|
+
|
|
15
|
+
import type { Middleware } from "./common";
|
|
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 {
|
|
@@ -7,7 +7,7 @@ import { isRoutingRuleMatch } from "./pages-dev-util";
|
|
|
7
7
|
// @ts-ignore routes are injected
|
|
8
8
|
const routes = __ROUTES__;
|
|
9
9
|
|
|
10
|
-
export default {
|
|
10
|
+
export default <ExportedHandler<{ ASSETS: Fetcher }>>{
|
|
11
11
|
fetch(request, env, context) {
|
|
12
12
|
const { pathname } = new URL(request.url);
|
|
13
13
|
|
|
@@ -19,6 +19,9 @@ export default {
|
|
|
19
19
|
|
|
20
20
|
for (const include of routes.include) {
|
|
21
21
|
if (isRoutingRuleMatch(pathname, include)) {
|
|
22
|
+
if (worker.fetch === undefined) {
|
|
23
|
+
throw new TypeError("Entry point missing `fetch` handler");
|
|
24
|
+
}
|
|
22
25
|
return worker.fetch(request, env, context);
|
|
23
26
|
}
|
|
24
27
|
}
|
|
@@ -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);
|
|
@@ -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
|
+
);
|
|
@@ -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: () => {
|