wrangler 0.0.0-e043479 → 0.0.0-e09abbc
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 +33 -14
- package/bin/wrangler.js +160 -28
- package/kv-asset-handler.js +1 -0
- package/miniflare-dist/index.mjs +5354 -0
- package/package.json +166 -136
- 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 +3942 -2178
- package/src/__tests__/dev.test.tsx +1191 -235
- package/src/__tests__/guess-worker-format.test.ts +76 -57
- package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
- package/src/__tests__/helpers/mock-account-id.ts +26 -22
- package/src/__tests__/helpers/mock-bin.ts +20 -20
- package/src/__tests__/helpers/mock-cfetch.ts +96 -92
- package/src/__tests__/helpers/mock-console.ts +59 -32
- package/src/__tests__/helpers/mock-dialogs.ts +121 -33
- package/src/__tests__/helpers/mock-http-server.ts +46 -0
- package/src/__tests__/helpers/mock-istty.ts +74 -0
- package/src/__tests__/helpers/mock-kv.ts +28 -35
- package/src/__tests__/helpers/mock-oauth-flow.ts +250 -0
- package/src/__tests__/helpers/mock-process.ts +39 -0
- package/src/__tests__/helpers/mock-stdin.ts +82 -77
- package/src/__tests__/helpers/mock-web-socket.ts +21 -21
- package/src/__tests__/helpers/run-in-tmp.ts +29 -20
- package/src/__tests__/helpers/run-wrangler.ts +8 -8
- package/src/__tests__/helpers/write-worker-source.ts +31 -0
- package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
- package/src/__tests__/https-options.test.ts +163 -0
- package/src/__tests__/index.test.ts +246 -850
- package/src/__tests__/init.test.ts +1992 -0
- package/src/__tests__/jest.setup.ts +85 -34
- package/src/__tests__/kv.test.ts +1402 -1139
- package/src/__tests__/logger.test.ts +141 -0
- package/src/__tests__/metrics.test.ts +445 -0
- package/src/__tests__/package-manager.test.ts +312 -165
- package/src/__tests__/pages.test.ts +1261 -0
- package/src/__tests__/parse.test.ts +253 -245
- package/src/__tests__/publish.test.ts +6611 -2079
- package/src/__tests__/pubsub.test.ts +367 -0
- package/src/__tests__/r2.test.ts +184 -149
- package/src/__tests__/route.test.ts +45 -0
- package/src/__tests__/secret.test.ts +474 -407
- package/src/__tests__/tail.test.ts +565 -431
- package/src/__tests__/test-old-node-version.js +31 -0
- package/src/__tests__/user.test.ts +143 -0
- package/src/__tests__/whoami.test.tsx +219 -75
- package/src/__tests__/worker-namespace.test.ts +327 -0
- package/src/abort.d.ts +3 -0
- package/src/api/dev.ts +86 -0
- package/src/api/index.ts +1 -0
- package/src/bundle-reporter.tsx +29 -0
- package/src/bundle.ts +196 -93
- package/src/cfetch/index.ts +83 -66
- package/src/cfetch/internal.ts +100 -84
- package/src/cli.ts +22 -14
- package/src/config/README.md +7 -7
- package/src/config/config.ts +223 -242
- package/src/config/diagnostics.ts +61 -61
- package/src/config/environment.ts +404 -256
- package/src/config/index.ts +218 -32
- package/src/config/validation-helpers.ts +436 -222
- package/src/config/validation.ts +1642 -907
- package/src/config-cache.ts +84 -0
- package/src/create-worker-preview.ts +255 -0
- package/src/create-worker-upload-form.ts +263 -0
- package/src/dev/dev-vars.ts +36 -0
- package/src/dev/dev.tsx +452 -0
- package/src/dev/local.tsx +373 -0
- package/src/dev/remote.tsx +386 -0
- package/src/dev/use-esbuild.ts +150 -0
- package/src/dev.tsx +576 -943
- package/src/dialogs.tsx +115 -57
- package/src/durable.ts +102 -0
- package/src/entry.ts +308 -37
- package/src/environment-variables.ts +25 -23
- package/src/errors.ts +11 -0
- package/src/faye-websocket.d.ts +6 -0
- package/src/generate.ts +33 -0
- package/src/git-client.ts +42 -0
- package/src/global-wrangler-config-path.ts +26 -0
- package/src/https-options.ts +127 -0
- package/src/index.tsx +1910 -2241
- package/src/init.ts +549 -0
- package/src/inspect.ts +603 -550
- package/src/intl-polyfill.d.ts +139 -0
- package/src/is-interactive.ts +12 -0
- package/src/kv.ts +430 -0
- package/src/logger.ts +73 -0
- package/src/metrics/index.ts +4 -0
- package/src/metrics/is-ci.ts +14 -0
- package/src/metrics/metrics-config.ts +239 -0
- package/src/metrics/metrics-dispatcher.ts +95 -0
- package/src/metrics/send-event.ts +92 -0
- package/src/miniflare-cli/README.md +30 -0
- package/src/miniflare-cli/assets.ts +543 -0
- package/src/miniflare-cli/enum-keys.ts +17 -0
- package/src/miniflare-cli/index.ts +85 -0
- package/src/miniflare-cli/request-context.ts +40 -0
- package/src/module-collection.ts +234 -146
- package/src/open-in-browser.ts +10 -6
- package/src/package-manager.ts +183 -90
- package/src/pages/build.tsx +204 -0
- package/src/pages/constants.ts +7 -0
- package/src/pages/deployments.tsx +106 -0
- package/src/pages/dev.tsx +401 -0
- package/src/pages/functions/buildPlugin.ts +105 -0
- package/src/pages/functions/buildWorker.ts +151 -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.ts +151 -0
- package/src/pages/index.tsx +84 -0
- package/src/pages/projects.tsx +163 -0
- package/src/pages/publish.tsx +338 -0
- package/src/pages/types.ts +40 -0
- package/src/pages/upload.tsx +396 -0
- package/src/pages/utils.ts +12 -0
- package/src/parse.ts +224 -121
- package/src/paths.ts +6 -6
- package/src/preview.ts +31 -0
- package/src/proxy.ts +413 -313
- package/src/publish.ts +773 -343
- package/src/pubsub/index.ts +286 -0
- package/src/pubsub/pubsub-commands.tsx +623 -0
- package/src/r2.ts +19 -19
- package/src/selfsigned.d.ts +29 -0
- package/src/sites.tsx +285 -151
- package/src/tail/filters.ts +108 -108
- package/src/tail/index.ts +217 -217
- package/src/tail/printing.ts +51 -46
- package/src/update-check.ts +19 -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 +1171 -0
- package/src/whoami.tsx +63 -41
- package/src/worker-namespace.ts +206 -0
- package/src/worker.ts +191 -0
- package/src/zones.ts +76 -0
- package/templates/checked-fetch.js +17 -0
- package/templates/gitignore +171 -0
- package/templates/new-worker-scheduled.js +17 -0
- package/templates/new-worker-scheduled.ts +32 -0
- package/templates/new-worker.js +3 -3
- package/templates/new-worker.ts +18 -3
- package/templates/no-op-worker.js +10 -0
- package/templates/pages-shim.ts +9 -0
- package/templates/pages-template-plugin.ts +155 -0
- package/templates/pages-template-worker.ts +161 -0
- package/templates/static-asset-facade.js +38 -36
- package/templates/tsconfig.json +95 -95
- package/wrangler-dist/cli.d.ts +327 -0
- package/wrangler-dist/cli.js +94947 -111199
- package/pages/functions/buildWorker.ts +0 -62
- package/pages/functions/filepath-routing.test.ts +0 -123
- package/pages/functions/filepath-routing.ts +0 -178
- package/pages/functions/identifiers.ts +0 -78
- package/pages/functions/routes.ts +0 -151
- package/pages/functions/template-worker.ts +0 -130
- package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
- package/src/__tests__/helpers/mock-user.ts +0 -27
- package/src/__tests__/logout.test.ts +0 -50
- package/src/__tests__/sentry.test.ts +0 -146
- package/src/api/form_data.ts +0 -217
- package/src/api/preview.ts +0 -147
- package/src/api/worker.ts +0 -186
- package/src/guess-worker-format.ts +0 -68
- package/src/kv.tsx +0 -339
- package/src/pages.tsx +0 -1045
- package/src/reporting.ts +0 -115
- package/src/user.tsx +0 -1063
- 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
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { match } from "path-to-regexp";
|
|
2
|
-
import type { HTTPMethod } from "./routes";
|
|
3
|
-
|
|
4
|
-
/* TODO: Grab these from @cloudflare/workers-types instead */
|
|
5
|
-
type Params<P extends string = string> = Record<P, string | string[]>;
|
|
6
|
-
|
|
7
|
-
type EventContext<Env, P extends string, Data> = {
|
|
8
|
-
request: Request;
|
|
9
|
-
waitUntil: (promise: Promise<unknown>) => void;
|
|
10
|
-
next: (input?: Request | string, init?: RequestInit) => Promise<Response>;
|
|
11
|
-
env: Env & { ASSETS: { fetch: typeof fetch } };
|
|
12
|
-
params: Params<P>;
|
|
13
|
-
data: Data;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
declare type PagesFunction<
|
|
17
|
-
Env = unknown,
|
|
18
|
-
P extends string = string,
|
|
19
|
-
Data extends Record<string, unknown> = Record<string, unknown>
|
|
20
|
-
> = (context: EventContext<Env, P, Data>) => Response | Promise<Response>;
|
|
21
|
-
/* end @cloudflare/workers-types */
|
|
22
|
-
|
|
23
|
-
type RouteHandler = {
|
|
24
|
-
routePath: string;
|
|
25
|
-
method?: HTTPMethod;
|
|
26
|
-
modules: PagesFunction[];
|
|
27
|
-
middlewares: PagesFunction[];
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// inject `routes` via ESBuild
|
|
31
|
-
declare const routes: RouteHandler[];
|
|
32
|
-
// define `__FALLBACK_SERVICE__` via ESBuild
|
|
33
|
-
declare const __FALLBACK_SERVICE__: string;
|
|
34
|
-
|
|
35
|
-
// expect an ASSETS fetcher binding pointing to the asset-server stage
|
|
36
|
-
type FetchEnv = {
|
|
37
|
-
[name: string]: { fetch: typeof fetch };
|
|
38
|
-
ASSETS: { fetch: typeof fetch };
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
type WorkerContext = {
|
|
42
|
-
waitUntil: (promise: Promise<unknown>) => void;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
function* executeRequest(request: Request, _env: FetchEnv) {
|
|
46
|
-
const requestPath = new URL(request.url).pathname;
|
|
47
|
-
|
|
48
|
-
// First, iterate through the routes (backwards) and execute "middlewares" on partial route matches
|
|
49
|
-
for (const route of [...routes].reverse()) {
|
|
50
|
-
if (route.method && route.method !== request.method) {
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const routeMatcher = match(route.routePath, { end: false });
|
|
55
|
-
const matchResult = routeMatcher(requestPath);
|
|
56
|
-
if (matchResult) {
|
|
57
|
-
for (const handler of route.middlewares.flat()) {
|
|
58
|
-
yield {
|
|
59
|
-
handler,
|
|
60
|
-
params: matchResult.params as Params,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Then look for the first exact route match and execute its "modules"
|
|
67
|
-
for (const route of routes) {
|
|
68
|
-
if (route.method && route.method !== request.method) {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const routeMatcher = match(route.routePath, { end: true });
|
|
73
|
-
const matchResult = routeMatcher(requestPath);
|
|
74
|
-
if (matchResult && route.modules.length) {
|
|
75
|
-
for (const handler of route.modules.flat()) {
|
|
76
|
-
yield {
|
|
77
|
-
handler,
|
|
78
|
-
params: matchResult.params as Params,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export default {
|
|
87
|
-
async fetch(request: Request, env: FetchEnv, workerContext: WorkerContext) {
|
|
88
|
-
const handlerIterator = executeRequest(request, env);
|
|
89
|
-
const data = {}; // arbitrary data the user can set between functions
|
|
90
|
-
const next = async (input?: RequestInfo, init?: RequestInit) => {
|
|
91
|
-
if (input !== undefined) {
|
|
92
|
-
request = new Request(input, init);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const result = handlerIterator.next();
|
|
96
|
-
// Note we can't use `!result.done` because this doesn't narrow to the correct type
|
|
97
|
-
if (result.done == false) {
|
|
98
|
-
const { handler, params } = result.value;
|
|
99
|
-
const context = {
|
|
100
|
-
request: new Request(request.clone()),
|
|
101
|
-
next,
|
|
102
|
-
params,
|
|
103
|
-
data,
|
|
104
|
-
env,
|
|
105
|
-
waitUntil: workerContext.waitUntil.bind(workerContext),
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
const response = await handler(context);
|
|
109
|
-
|
|
110
|
-
// https://fetch.spec.whatwg.org/#null-body-status
|
|
111
|
-
return new Response(
|
|
112
|
-
[101, 204, 205, 304].includes(response.status) ? null : response.body,
|
|
113
|
-
response
|
|
114
|
-
);
|
|
115
|
-
} else if (__FALLBACK_SERVICE__) {
|
|
116
|
-
// There are no more handlers so finish with the fallback service (`env.ASSETS.fetch` in Pages' case)
|
|
117
|
-
return env[__FALLBACK_SERVICE__].fetch(request);
|
|
118
|
-
} else {
|
|
119
|
-
// There was not fallback service so actually make the request to the origin.
|
|
120
|
-
return fetch(request);
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
try {
|
|
125
|
-
return next();
|
|
126
|
-
} catch (err) {
|
|
127
|
-
return new Response("Internal Error", { status: 500 });
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
};
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
|
|
5
|
-
export function writeUserConfig(
|
|
6
|
-
oauth_token?: string,
|
|
7
|
-
refresh_token?: string,
|
|
8
|
-
expiration_time?: string
|
|
9
|
-
) {
|
|
10
|
-
const lines: string[] = [];
|
|
11
|
-
if (oauth_token) {
|
|
12
|
-
lines.push(`oauth_token = "${oauth_token}"`);
|
|
13
|
-
}
|
|
14
|
-
if (refresh_token) {
|
|
15
|
-
lines.push(`refresh_token = "${refresh_token}"`);
|
|
16
|
-
}
|
|
17
|
-
if (expiration_time) {
|
|
18
|
-
lines.push(`expiration_time = "${expiration_time}"`);
|
|
19
|
-
}
|
|
20
|
-
const configPath = path.join(os.homedir(), ".wrangler/config");
|
|
21
|
-
mkdirSync(configPath, { recursive: true });
|
|
22
|
-
writeFileSync(
|
|
23
|
-
path.join(configPath, "default.toml"),
|
|
24
|
-
lines.join("\n"),
|
|
25
|
-
"utf-8"
|
|
26
|
-
);
|
|
27
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { existsSync } from "node:fs";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import fetchMock from "jest-fetch-mock";
|
|
5
|
-
import { initialise } from "../user";
|
|
6
|
-
import { mockConsoleMethods } from "./helpers/mock-console";
|
|
7
|
-
import { writeUserConfig } from "./helpers/mock-user";
|
|
8
|
-
import { runInTempDir } from "./helpers/run-in-tmp";
|
|
9
|
-
import { runWrangler } from "./helpers/run-wrangler";
|
|
10
|
-
|
|
11
|
-
describe("wrangler", () => {
|
|
12
|
-
runInTempDir({ homedir: "./home" });
|
|
13
|
-
const std = mockConsoleMethods();
|
|
14
|
-
|
|
15
|
-
describe("logout", () => {
|
|
16
|
-
it("should exit with a message stating the user is not logged in", async () => {
|
|
17
|
-
await initialise();
|
|
18
|
-
await runWrangler("logout");
|
|
19
|
-
expect(std.out).toMatchInlineSnapshot(`"Not logged in, exiting..."`);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it("should logout user that has been properly logged in", async () => {
|
|
23
|
-
writeUserConfig("some-oauth-tok", "some-refresh-tok");
|
|
24
|
-
|
|
25
|
-
// Mock out the response for a request to revoke the auth tokens,
|
|
26
|
-
// checking the form of the request is as expected.
|
|
27
|
-
fetchMock.mockResponseOnce(async (req) => {
|
|
28
|
-
expect(req.url).toEqual("https://dash.cloudflare.com/oauth2/revoke");
|
|
29
|
-
expect(req.method).toEqual("POST");
|
|
30
|
-
return "";
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
await initialise();
|
|
34
|
-
await runWrangler("logout");
|
|
35
|
-
|
|
36
|
-
expect(std.out).toMatchInlineSnapshot(`
|
|
37
|
-
"💁 Wrangler is configured with an OAuth token. The token has been successfully revoked
|
|
38
|
-
Removing ./home/.wrangler/config/default.toml.. success!"
|
|
39
|
-
`);
|
|
40
|
-
|
|
41
|
-
// Make sure that we made the request to logout.
|
|
42
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
43
|
-
|
|
44
|
-
// Make sure that logout removed the config file containing the auth tokens.
|
|
45
|
-
expect(
|
|
46
|
-
existsSync(path.join(os.homedir(), ".wrangler/config/default.toml"))
|
|
47
|
-
).toBe(false);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
});
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as fsp from "node:fs/promises";
|
|
3
|
-
import os from "node:os";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
import * as TOML from "@iarna/toml";
|
|
6
|
-
import * as Sentry from "@sentry/node";
|
|
7
|
-
import prompts from "prompts";
|
|
8
|
-
|
|
9
|
-
import { mockConsoleMethods } from "./helpers/mock-console";
|
|
10
|
-
import { runInTempDir } from "./helpers/run-in-tmp";
|
|
11
|
-
import { runWrangler } from "./helpers/run-wrangler";
|
|
12
|
-
const { reportError } = jest.requireActual("../reporting");
|
|
13
|
-
|
|
14
|
-
describe("Error Reporting", () => {
|
|
15
|
-
runInTempDir({ homedir: "./home" });
|
|
16
|
-
mockConsoleMethods();
|
|
17
|
-
const reportingTOMLPath = ".wrangler/config/reporting.toml";
|
|
18
|
-
|
|
19
|
-
const originalTTY = process.stdout.isTTY;
|
|
20
|
-
beforeEach(() => {
|
|
21
|
-
jest.mock("@sentry/node");
|
|
22
|
-
jest.spyOn(Sentry, "captureException");
|
|
23
|
-
process.stdout.isTTY = true;
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
afterEach(() => {
|
|
27
|
-
jest.unmock("@sentry/node");
|
|
28
|
-
jest.clearAllMocks();
|
|
29
|
-
process.stdout.isTTY = originalTTY;
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("should confirm user will allow error reporting usage", async () => {
|
|
33
|
-
jest.spyOn(prompts, "prompt").mockResolvedValue({ sentryDecision: true });
|
|
34
|
-
|
|
35
|
-
await reportError(new Error("test error"), "testFalse");
|
|
36
|
-
|
|
37
|
-
const { error_tracking_opt, error_tracking_opt_date } = TOML.parse(
|
|
38
|
-
await fsp.readFile(path.join(os.homedir(), reportingTOMLPath), "utf-8")
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
expect(error_tracking_opt).toBe(true);
|
|
42
|
-
expect(error_tracking_opt_date).toBeTruthy();
|
|
43
|
-
|
|
44
|
-
expect(Sentry.captureException).toHaveBeenCalledWith(
|
|
45
|
-
new Error("test error")
|
|
46
|
-
);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("should confirm user will disallow error reporting usage", async () => {
|
|
50
|
-
jest.spyOn(prompts, "prompt").mockResolvedValue({ sentryDecision: false });
|
|
51
|
-
await reportError(new Error("test error"), "testFalse");
|
|
52
|
-
|
|
53
|
-
const { error_tracking_opt, error_tracking_opt_date } = TOML.parse(
|
|
54
|
-
await fsp.readFile(path.join(os.homedir(), reportingTOMLPath), "utf-8")
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
expect(error_tracking_opt).toBe(false);
|
|
58
|
-
expect(error_tracking_opt_date).toBeTruthy();
|
|
59
|
-
|
|
60
|
-
expect(Sentry.captureException).not.toHaveBeenCalledWith(
|
|
61
|
-
new Error("test error"),
|
|
62
|
-
"testFalse"
|
|
63
|
-
);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it("should confirm user will allow 'once' error reporting usage", async () => {
|
|
67
|
-
jest.spyOn(prompts, "prompt").mockResolvedValue({ sentryDecision: "once" });
|
|
68
|
-
await runWrangler();
|
|
69
|
-
await reportError(new Error("test error"), "testFalse");
|
|
70
|
-
|
|
71
|
-
expect(fs.existsSync(path.join(os.homedir(), reportingTOMLPath))).toBe(
|
|
72
|
-
false
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
expect(Sentry.captureException).not.toHaveBeenCalledWith(
|
|
76
|
-
new Error("test error"),
|
|
77
|
-
"testFalse"
|
|
78
|
-
);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it("should not prompt w/ subsequent Errors after user disallows error reporting", async () => {
|
|
82
|
-
jest.spyOn(prompts, "prompt").mockResolvedValue({ sentryDecision: false });
|
|
83
|
-
await reportError(new Error("test error"), "testFalse");
|
|
84
|
-
|
|
85
|
-
expect(Sentry.captureException).not.toHaveBeenCalledWith(
|
|
86
|
-
new Error("test error"),
|
|
87
|
-
"testFalse"
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
await reportError(new Error("second test error"), "testFalse");
|
|
91
|
-
expect(Sentry.captureException).not.toHaveBeenCalledWith(
|
|
92
|
-
new Error("second test error"),
|
|
93
|
-
"testFalse"
|
|
94
|
-
);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it("should not prompt w/ subsequent Errors after user Always allows error reporting", async () => {
|
|
98
|
-
jest.spyOn(prompts, "prompt").mockResolvedValue({ sentryDecision: true });
|
|
99
|
-
await reportError(new Error("test error"), "testFalse");
|
|
100
|
-
|
|
101
|
-
expect(Sentry.captureException).toHaveBeenCalledWith(
|
|
102
|
-
new Error("test error")
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
await reportError(new Error("second test error"), "testFalse");
|
|
106
|
-
expect(Sentry.captureException).toHaveBeenCalledWith(
|
|
107
|
-
new Error("second test error")
|
|
108
|
-
);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it("should prompt w/ subsequent Errors after user allows error reporting once", async () => {
|
|
112
|
-
const promptSpy = jest
|
|
113
|
-
.spyOn(prompts, "prompt")
|
|
114
|
-
.mockResolvedValue({ sentryDecision: "once" });
|
|
115
|
-
await reportError(new Error("test error"), "testFalse");
|
|
116
|
-
|
|
117
|
-
expect(Sentry.captureException).toHaveBeenCalledWith(
|
|
118
|
-
new Error("test error")
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
await reportError(new Error("second test error"), "testFalse");
|
|
122
|
-
expect(Sentry.captureException).toHaveBeenCalledWith(
|
|
123
|
-
new Error("second test error")
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
expect(promptSpy).toBeCalledTimes(2);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("should not prompt in non-TTY environment", async () => {
|
|
130
|
-
process.stdout.isTTY = false;
|
|
131
|
-
|
|
132
|
-
await reportError(new Error("test error"), "testFalse");
|
|
133
|
-
|
|
134
|
-
const { error_tracking_opt, error_tracking_opt_date } = TOML.parse(
|
|
135
|
-
await fsp.readFile(path.join(os.homedir(), reportingTOMLPath), "utf-8")
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
expect(error_tracking_opt).toBe(false);
|
|
139
|
-
expect(error_tracking_opt_date).toBeTruthy();
|
|
140
|
-
|
|
141
|
-
expect(Sentry.captureException).not.toHaveBeenCalledWith(
|
|
142
|
-
new Error("test error")
|
|
143
|
-
);
|
|
144
|
-
process.stdout.isTTY = originalTTY;
|
|
145
|
-
});
|
|
146
|
-
});
|
package/src/api/form_data.ts
DELETED
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { FormData, File } from "undici";
|
|
3
|
-
import type {
|
|
4
|
-
CfWorkerInit,
|
|
5
|
-
CfModuleType,
|
|
6
|
-
CfDurableObjectMigrations,
|
|
7
|
-
} from "./worker.js";
|
|
8
|
-
|
|
9
|
-
export function toMimeType(type: CfModuleType): string {
|
|
10
|
-
switch (type) {
|
|
11
|
-
case "esm":
|
|
12
|
-
return "application/javascript+module";
|
|
13
|
-
case "commonjs":
|
|
14
|
-
return "application/javascript";
|
|
15
|
-
case "compiled-wasm":
|
|
16
|
-
return "application/wasm";
|
|
17
|
-
case "buffer":
|
|
18
|
-
return "application/octet-stream";
|
|
19
|
-
case "text":
|
|
20
|
-
return "text/plain";
|
|
21
|
-
default:
|
|
22
|
-
throw new TypeError("Unsupported module: " + type);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface WorkerMetadata {
|
|
27
|
-
/** The name of the entry point module. Only exists when the worker is in the ES module format */
|
|
28
|
-
main_module?: string;
|
|
29
|
-
/** The name of the entry point module. Only exists when the worker is in the Service Worker format */
|
|
30
|
-
body_part?: string;
|
|
31
|
-
compatibility_date?: string;
|
|
32
|
-
compatibility_flags?: string[];
|
|
33
|
-
usage_model?: "bundled" | "unbound";
|
|
34
|
-
migrations?: CfDurableObjectMigrations;
|
|
35
|
-
bindings: (
|
|
36
|
-
| { type: "kv_namespace"; name: string; namespace_id: string }
|
|
37
|
-
| { type: "plain_text"; name: string; text: string }
|
|
38
|
-
| { type: "json"; name: string; json: unknown }
|
|
39
|
-
| { type: "wasm_module"; name: string; part: string }
|
|
40
|
-
| { type: "text_blob"; name: string; part: string }
|
|
41
|
-
| {
|
|
42
|
-
type: "durable_object_namespace";
|
|
43
|
-
name: string;
|
|
44
|
-
class_name: string;
|
|
45
|
-
script_name?: string;
|
|
46
|
-
}
|
|
47
|
-
| { type: "r2_bucket"; name: string; bucket_name: string }
|
|
48
|
-
)[];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Creates a `FormData` upload from a `CfWorkerInit`.
|
|
53
|
-
*/
|
|
54
|
-
export function toFormData(worker: CfWorkerInit): FormData {
|
|
55
|
-
const formData = new FormData();
|
|
56
|
-
const {
|
|
57
|
-
main,
|
|
58
|
-
bindings,
|
|
59
|
-
migrations,
|
|
60
|
-
usage_model,
|
|
61
|
-
compatibility_date,
|
|
62
|
-
compatibility_flags,
|
|
63
|
-
} = worker;
|
|
64
|
-
|
|
65
|
-
let { modules } = worker;
|
|
66
|
-
|
|
67
|
-
const metadataBindings: WorkerMetadata["bindings"] = [];
|
|
68
|
-
|
|
69
|
-
bindings.kv_namespaces?.forEach(({ id, binding }) => {
|
|
70
|
-
metadataBindings.push({
|
|
71
|
-
name: binding,
|
|
72
|
-
type: "kv_namespace",
|
|
73
|
-
namespace_id: id,
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
bindings.durable_objects?.bindings.forEach(
|
|
78
|
-
({ name, class_name, script_name }) => {
|
|
79
|
-
metadataBindings.push({
|
|
80
|
-
name,
|
|
81
|
-
type: "durable_object_namespace",
|
|
82
|
-
class_name: class_name,
|
|
83
|
-
...(script_name && { script_name }),
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
bindings.r2_buckets?.forEach(({ binding, bucket_name }) => {
|
|
89
|
-
metadataBindings.push({
|
|
90
|
-
name: binding,
|
|
91
|
-
type: "r2_bucket",
|
|
92
|
-
bucket_name,
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
Object.entries(bindings.vars || {})?.forEach(([key, value]) => {
|
|
97
|
-
if (typeof value === "string") {
|
|
98
|
-
metadataBindings.push({ name: key, type: "plain_text", text: value });
|
|
99
|
-
} else {
|
|
100
|
-
metadataBindings.push({ name: key, type: "json", json: value });
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
for (const [name, filePath] of Object.entries(bindings.wasm_modules || {})) {
|
|
105
|
-
metadataBindings.push({
|
|
106
|
-
name,
|
|
107
|
-
type: "wasm_module",
|
|
108
|
-
part: name,
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
formData.set(
|
|
112
|
-
name,
|
|
113
|
-
new File([readFileSync(filePath)], filePath, {
|
|
114
|
-
type: "application/wasm",
|
|
115
|
-
})
|
|
116
|
-
);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
for (const [name, filePath] of Object.entries(bindings.text_blobs || {})) {
|
|
120
|
-
metadataBindings.push({
|
|
121
|
-
name,
|
|
122
|
-
type: "text_blob",
|
|
123
|
-
part: name,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
if (name !== "__STATIC_CONTENT_MANIFEST") {
|
|
127
|
-
formData.set(
|
|
128
|
-
name,
|
|
129
|
-
new File([readFileSync(filePath)], filePath, {
|
|
130
|
-
type: "text/plain",
|
|
131
|
-
})
|
|
132
|
-
);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (main.type === "commonjs") {
|
|
137
|
-
// This is a service-worker format worker.
|
|
138
|
-
for (const module of Object.values([...(modules || [])])) {
|
|
139
|
-
if (module.name === "__STATIC_CONTENT_MANIFEST") {
|
|
140
|
-
// Add the manifest to the form data.
|
|
141
|
-
formData.set(
|
|
142
|
-
module.name,
|
|
143
|
-
new File([module.content], module.name, {
|
|
144
|
-
type: "text/plain",
|
|
145
|
-
})
|
|
146
|
-
);
|
|
147
|
-
// And then remove it from the modules collection
|
|
148
|
-
modules = modules?.filter((m) => m !== module);
|
|
149
|
-
} else if (module.type === "compiled-wasm" || module.type === "text") {
|
|
150
|
-
// Convert all wasm/text modules into `wasm_module`/`text_blob` bindings.
|
|
151
|
-
// The "name" of the module is a file path. We use it
|
|
152
|
-
// to instead be a "part" of the body, and a reference
|
|
153
|
-
// that we can use inside our source. This identifier has to be a valid
|
|
154
|
-
// JS identifier, so we replace all non alphanumeric characters
|
|
155
|
-
// with an underscore.
|
|
156
|
-
const name = module.name.replace(/[^a-zA-Z0-9_$]/g, "_");
|
|
157
|
-
metadataBindings.push({
|
|
158
|
-
name,
|
|
159
|
-
type: module.type === "compiled-wasm" ? "wasm_module" : "text_blob",
|
|
160
|
-
part: name,
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// Add the module to the form data.
|
|
164
|
-
formData.set(
|
|
165
|
-
name,
|
|
166
|
-
new File([module.content], module.name, {
|
|
167
|
-
type:
|
|
168
|
-
module.type === "compiled-wasm"
|
|
169
|
-
? "application/wasm"
|
|
170
|
-
: "text/plain",
|
|
171
|
-
})
|
|
172
|
-
);
|
|
173
|
-
// And then remove it from the modules collection
|
|
174
|
-
modules = modules?.filter((m) => m !== module);
|
|
175
|
-
} else if (module.type === "buffer") {
|
|
176
|
-
throw new Error(
|
|
177
|
-
'The "buffer" module type is not yet supported in service worker format workers'
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (bindings.unsafe) {
|
|
184
|
-
// @ts-expect-error unsafe bindings don't need to match a specific type here
|
|
185
|
-
metadataBindings.push(...bindings.unsafe);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const metadata: WorkerMetadata = {
|
|
189
|
-
...(main.type !== "commonjs"
|
|
190
|
-
? { main_module: main.name }
|
|
191
|
-
: { body_part: main.name }),
|
|
192
|
-
bindings: metadataBindings,
|
|
193
|
-
...(compatibility_date && { compatibility_date }),
|
|
194
|
-
...(compatibility_flags && { compatibility_flags }),
|
|
195
|
-
...(usage_model && { usage_model }),
|
|
196
|
-
...(migrations && { migrations }),
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
formData.set("metadata", JSON.stringify(metadata));
|
|
200
|
-
|
|
201
|
-
if (main.type === "commonjs" && modules && modules.length > 0) {
|
|
202
|
-
throw new TypeError(
|
|
203
|
-
"More than one module can only be specified when type = 'esm'"
|
|
204
|
-
);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
for (const module of [main].concat(modules || [])) {
|
|
208
|
-
formData.set(
|
|
209
|
-
module.name,
|
|
210
|
-
new File([module.content], module.name, {
|
|
211
|
-
type: toMimeType(module.type ?? main.type ?? "esm"),
|
|
212
|
-
})
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return formData;
|
|
217
|
-
}
|