wrangler 0.0.0-e30d1013 → 0.0.0-e311bbbf
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 +3 -3
- package/bin/wrangler.js +30 -10
- package/miniflare-dist/index.mjs +126 -74
- package/package.json +26 -19
- package/src/__tests__/api-dev.test.ts +65 -36
- package/src/__tests__/api-devregistry.test.ts +121 -0
- package/src/__tests__/api.test.ts +27 -5
- package/src/__tests__/configuration.test.ts +567 -39
- package/src/__tests__/d1/d1.test.ts +82 -0
- package/src/__tests__/d1/execute.test.ts +66 -0
- package/src/__tests__/d1/migrate.test.ts +157 -0
- package/src/__tests__/d1/splitter.test.ts +255 -0
- package/src/__tests__/delete.test.ts +91 -49
- package/src/__tests__/deployments.test.ts +330 -52
- package/src/__tests__/dev.test.tsx +198 -90
- package/src/__tests__/generate.test.ts +8 -5
- package/src/__tests__/guess-worker-format.test.ts +35 -0
- package/src/__tests__/helpers/end-event-loop.ts +6 -0
- package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
- package/src/__tests__/helpers/mock-console.ts +6 -0
- package/src/__tests__/helpers/mock-dialogs.ts +71 -85
- package/src/__tests__/helpers/mock-get-pages-upload-token.ts +25 -0
- package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -5
- package/src/__tests__/helpers/mock-known-routes.ts +7 -2
- package/src/__tests__/helpers/mock-kv.ts +29 -16
- package/src/__tests__/helpers/mock-oauth-flow.ts +103 -92
- package/src/__tests__/helpers/mock-process.ts +8 -13
- package/src/__tests__/helpers/mock-set-timeout.ts +16 -0
- package/src/__tests__/helpers/msw/blob-worker.cjs +19 -0
- package/src/__tests__/helpers/msw/handlers/deployments.ts +127 -26
- package/src/__tests__/helpers/msw/handlers/namespaces.ts +18 -41
- package/src/__tests__/helpers/msw/handlers/oauth.ts +13 -18
- package/src/__tests__/helpers/msw/handlers/r2.ts +14 -34
- package/src/__tests__/helpers/msw/handlers/script.ts +9 -28
- package/src/__tests__/helpers/msw/handlers/user.ts +13 -24
- package/src/__tests__/helpers/msw/handlers/zones.ts +6 -8
- package/src/__tests__/helpers/msw/index.ts +32 -1
- package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
- package/src/__tests__/helpers/string-dynamic-values-matcher.ts +28 -0
- package/src/__tests__/helpers/worker-scripts/parent-worker.js +4 -1
- package/src/__tests__/index.test.ts +90 -72
- package/src/__tests__/init.test.ts +927 -631
- package/src/__tests__/jest.setup.ts +19 -42
- package/src/__tests__/kv.test.ts +355 -231
- package/src/__tests__/logger.test.ts +68 -2
- package/src/__tests__/logout.test.ts +47 -0
- package/src/__tests__/metrics.test.ts +94 -51
- package/src/__tests__/middleware.scheduled.test.ts +42 -32
- package/src/__tests__/middleware.test.ts +212 -122
- package/src/__tests__/mtls-certificates.test.ts +588 -0
- package/src/__tests__/pages/deployment-list.test.ts +80 -0
- package/src/__tests__/pages/functions-build.test.ts +452 -0
- package/src/__tests__/pages/pages.test.ts +81 -0
- package/src/__tests__/pages/project-create.test.ts +63 -0
- package/src/__tests__/pages/project-list.test.ts +110 -0
- package/src/__tests__/pages/project-upload.test.ts +500 -0
- package/src/__tests__/pages/publish.test.ts +2864 -0
- package/src/__tests__/pages-deployment-tail.test.ts +955 -0
- package/src/__tests__/parse.test.ts +106 -0
- package/src/__tests__/publish.test.ts +1620 -830
- package/src/__tests__/pubsub.test.ts +226 -100
- package/src/__tests__/queues.test.ts +237 -76
- package/src/__tests__/r2.test.ts +37 -56
- package/src/__tests__/secret.test.ts +179 -130
- package/src/__tests__/tail.test.ts +267 -109
- package/src/__tests__/test-old-node-version.js +3 -3
- package/src/__tests__/traverse-module-graph.test.ts +220 -0
- package/src/__tests__/tsconfig-sanity.ts +12 -0
- package/src/__tests__/tsconfig.json +8 -0
- package/src/__tests__/tsconfig.tsbuildinfo +1 -0
- package/src/__tests__/type-generation.test.ts +11 -2
- package/src/__tests__/user.test.ts +35 -72
- package/src/__tests__/whoami.test.tsx +8 -114
- package/src/__tests__/worker-namespace.test.ts +83 -69
- package/src/api/dev.ts +168 -60
- package/src/api/index.ts +10 -1
- package/src/api/mtls-certificate.ts +148 -0
- package/src/api/pages/create-worker-bundle-contents.ts +76 -0
- package/src/api/pages/index.ts +5 -0
- package/src/api/pages/publish.tsx +355 -0
- package/src/bundle.ts +221 -128
- package/src/cfetch/index.ts +0 -2
- package/src/cfetch/internal.ts +16 -21
- package/src/cli.ts +4 -4
- package/src/config/config.ts +14 -7
- package/src/config/environment.ts +73 -16
- package/src/config/index.ts +99 -30
- package/src/config/validation-helpers.ts +1 -1
- package/src/config/validation.ts +248 -9
- package/src/create-worker-preview.ts +19 -8
- package/src/create-worker-upload-form.ts +48 -5
- package/src/d1/backups.tsx +43 -42
- package/src/d1/create.tsx +26 -21
- package/src/d1/{delete.tsx → delete.ts} +11 -14
- package/src/d1/execute.tsx +183 -170
- package/src/d1/index.ts +7 -6
- package/src/d1/list.tsx +22 -10
- package/src/d1/migrations/apply.tsx +212 -0
- package/src/d1/migrations/create.tsx +79 -0
- package/src/d1/migrations/helpers.ts +172 -0
- package/src/d1/migrations/index.ts +3 -0
- package/src/d1/migrations/list.tsx +95 -0
- package/src/d1/migrations/options.ts +23 -0
- package/src/d1/options.ts +3 -3
- package/src/d1/splitter.ts +161 -0
- package/src/d1/{types.tsx → types.ts} +1 -0
- package/src/d1/utils.ts +2 -1
- package/src/delete.ts +8 -16
- package/src/deployments.ts +333 -42
- package/src/deprecated/index.ts +8 -302
- package/src/dev/dev.tsx +57 -44
- package/src/dev/local.tsx +248 -74
- package/src/dev/remote.tsx +32 -3
- package/src/dev/start-server.ts +81 -66
- package/src/dev/use-esbuild.ts +17 -18
- package/src/dev/validate-dev-props.ts +9 -0
- package/src/{dev-registry.tsx → dev-registry.ts} +2 -1
- package/src/dev.tsx +178 -117
- package/src/dialogs.ts +136 -0
- package/src/dispatch-namespace.ts +21 -17
- package/src/docs/index.ts +97 -0
- package/src/entry.ts +19 -11
- package/src/environment-variables/factory.ts +88 -0
- package/src/environment-variables/misc-variables.ts +30 -0
- package/src/generate/index.ts +298 -0
- package/src/git-client.ts +15 -4
- package/src/{index.tsx → index.ts} +134 -59
- package/src/init.ts +249 -187
- package/src/inspect.ts +16 -1
- package/src/jest.d.ts +4 -0
- package/src/kv/index.ts +15 -17
- package/src/logger.ts +32 -5
- package/src/metrics/metrics-config.ts +3 -3
- package/src/metrics/send-event.ts +6 -1
- package/src/miniflare-cli/assets.ts +64 -28
- package/src/miniflare-cli/index.ts +4 -7
- package/src/miniflare-cli/tsconfig.json +9 -0
- package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
- package/src/miniflare-cli/types.ts +11 -0
- package/src/module-collection.ts +91 -25
- package/src/mtls-certificate/cli.ts +155 -0
- package/src/pages/build.ts +410 -0
- package/src/pages/buildFunctions.ts +140 -0
- package/src/pages/deployment-tails.ts +281 -0
- package/src/pages/deployments.tsx +11 -33
- package/src/pages/{dev.tsx → dev.ts} +147 -139
- package/src/pages/errors.ts +1 -0
- package/src/pages/functions/buildPlugin.ts +61 -54
- package/src/pages/functions/buildWorker.ts +159 -33
- package/src/pages/functions/tsconfig.json +8 -0
- package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
- package/src/pages/{functions.tsx → functions.ts} +8 -4
- package/src/pages/{index.tsx → index.ts} +11 -3
- package/src/pages/projects.tsx +12 -22
- package/src/pages/prompt-select-project.tsx +31 -0
- package/src/pages/publish.tsx +46 -225
- package/src/pages/types.ts +6 -9
- package/src/pages/upload.tsx +58 -14
- package/src/pages/utils.ts +12 -1
- package/src/parse.ts +23 -1
- package/src/paths.ts +1 -1
- package/src/proxy.ts +5 -0
- package/src/publish/index.ts +20 -16
- package/src/publish/publish.ts +71 -46
- package/src/pubsub/{pubsub-commands.tsx → pubsub-commands.ts} +19 -20
- package/src/queues/cli/commands/consumer/add.ts +24 -24
- package/src/queues/cli/commands/consumer/index.ts +3 -6
- package/src/queues/cli/commands/consumer/remove.ts +11 -18
- package/src/queues/cli/commands/create.ts +8 -8
- package/src/queues/cli/commands/delete.ts +8 -8
- package/src/queues/cli/commands/index.ts +6 -4
- package/src/queues/cli/commands/list.ts +8 -8
- package/src/queues/client.ts +1 -0
- package/src/queues/utils.ts +18 -0
- package/src/r2/helpers.ts +1 -0
- package/src/r2/index.ts +28 -28
- package/src/secret/index.ts +14 -16
- package/src/{sites.tsx → sites.ts} +1 -1
- package/src/tail/createTail.ts +94 -3
- package/src/tail/filters.ts +1 -1
- package/src/tail/index.ts +8 -11
- package/src/tail/printing.ts +15 -0
- package/src/traverse-module-graph.ts +53 -0
- package/src/tsconfig-sanity.ts +16 -0
- package/src/type-generation.ts +28 -20
- package/src/user/access.ts +0 -1
- package/src/user/auth-variables.ts +113 -0
- package/src/user/choose-account.tsx +1 -31
- package/src/user/index.ts +0 -1
- package/src/user/{user.tsx → user.ts} +123 -82
- package/src/utils/render.ts +93 -0
- package/src/{whoami.tsx → whoami.ts} +37 -71
- package/src/worker.ts +30 -1
- package/src/yargs-types.ts +22 -5
- package/templates/__tests__/tsconfig-sanity.ts +12 -0
- package/templates/__tests__/tsconfig.json +8 -0
- package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
- package/templates/checked-fetch.js +9 -3
- package/templates/d1-beta-facade.js +51 -3
- package/templates/facade.d.ts +14 -0
- package/templates/first-party-worker-module-facade.ts +4 -3
- package/templates/format-dev-errors.ts +8 -6
- 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/loader-modules.ts +2 -2
- package/templates/middleware/loader-sw.ts +51 -31
- package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
- package/templates/new-worker.ts +3 -0
- package/templates/pages-dev-pipeline.ts +4 -1
- package/templates/pages-shim.ts +4 -1
- package/templates/pages-template-plugin.ts +19 -10
- package/templates/serve-static-assets.ts +17 -14
- package/templates/service-bindings-module-facade.js +1 -0
- package/templates/tsconfig-sanity.ts +11 -0
- package/templates/tsconfig.init.json +105 -0
- package/templates/tsconfig.json +5 -103
- package/templates/tsconfig.tsbuildinfo +1 -0
- package/wrangler-dist/cli.d.ts +820 -70
- package/wrangler-dist/cli.js +68161 -78780
- package/wrangler-dist/wasm-sync.wasm +0 -0
- package/src/__tests__/api-devregistry.test.js +0 -56
- package/src/__tests__/d1.test.ts +0 -74
- package/src/__tests__/dialogs.test.tsx +0 -40
- package/src/__tests__/helpers/mock-cfetch.ts +0 -333
- package/src/__tests__/pages.test.ts +0 -2387
- package/src/d1/migrations.tsx +0 -446
- package/src/dialogs.tsx +0 -169
- package/src/environment-variables.ts +0 -50
- package/src/pages/build.tsx +0 -270
- package/src/user/env-vars.ts +0 -46
- package/templates/experimental-local-cache-stubs.js +0 -27
- /package/src/{bundle-reporter.tsx → bundle-reporter.ts} +0 -0
- /package/src/dev/{get-local-persistence-path.tsx → get-local-persistence-path.ts} +0 -0
- /package/src/pages/{hash.tsx → hash.ts} +0 -0
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { type Argv } from "yargs";
|
|
2
1
|
import { readConfig } from "../../../config";
|
|
3
2
|
import { logger } from "../../../logger";
|
|
4
3
|
import { listQueues } from "../../client";
|
|
4
|
+
import type {
|
|
5
|
+
CommonYargsArgv,
|
|
6
|
+
StrictYargsOptionsToInterface,
|
|
7
|
+
} from "../../../yargs-types";
|
|
5
8
|
|
|
6
|
-
|
|
7
|
-
config?: string;
|
|
8
|
-
page?: number;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function options(yargs: Argv): Argv<Args> {
|
|
9
|
+
export function options(yargs: CommonYargsArgv) {
|
|
12
10
|
return yargs.options({
|
|
13
11
|
page: {
|
|
14
12
|
type: "number",
|
|
@@ -17,7 +15,9 @@ export function options(yargs: Argv): Argv<Args> {
|
|
|
17
15
|
});
|
|
18
16
|
}
|
|
19
17
|
|
|
20
|
-
export async function handler(
|
|
18
|
+
export async function handler(
|
|
19
|
+
args: StrictYargsOptionsToInterface<typeof options>
|
|
20
|
+
) {
|
|
21
21
|
const config = readConfig(args.config, args);
|
|
22
22
|
|
|
23
23
|
const queues = await listQueues(config, args.page);
|
package/src/queues/client.ts
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { logger } from "../logger";
|
|
2
|
+
import { type ParseError } from "../parse";
|
|
3
|
+
import { getAccountId } from "../user";
|
|
4
|
+
|
|
5
|
+
const isFetchError = (err: unknown): err is ParseError => err instanceof Error;
|
|
6
|
+
|
|
7
|
+
export const HandleUnauthorizedError = async (_msg: string, err: Error) => {
|
|
8
|
+
//@ts-expect-error non-standard property on Error
|
|
9
|
+
if (isFetchError(err) && err.code === 10023) {
|
|
10
|
+
const accountId = await getAccountId();
|
|
11
|
+
if (accountId) {
|
|
12
|
+
return logger.log(
|
|
13
|
+
`Queues is not currently enabled on this account. Go to https://dash.cloudflare.com/${accountId}/workers/queues to enable it.`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
throw err;
|
|
18
|
+
};
|
package/src/r2/helpers.ts
CHANGED
package/src/r2/index.ts
CHANGED
|
@@ -19,22 +19,23 @@ import {
|
|
|
19
19
|
putR2Object,
|
|
20
20
|
} from "./helpers";
|
|
21
21
|
|
|
22
|
-
import type {
|
|
22
|
+
import type { CommonYargsArgv } from "../yargs-types";
|
|
23
23
|
import type { Readable } from "node:stream";
|
|
24
|
-
import type { BuilderCallback } from "yargs";
|
|
25
24
|
|
|
26
|
-
export
|
|
25
|
+
export function r2(r2Yargs: CommonYargsArgv) {
|
|
27
26
|
return r2Yargs
|
|
28
27
|
.command("object", "Manage R2 objects", (r2ObjectYargs) => {
|
|
29
28
|
return r2ObjectYargs
|
|
30
29
|
.command(
|
|
31
30
|
"get <objectPath>",
|
|
32
31
|
"Fetch an object from an R2 bucket",
|
|
33
|
-
(
|
|
34
|
-
return
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
(objectArgs) => {
|
|
33
|
+
return objectArgs
|
|
34
|
+
.positional("objectPath", {
|
|
35
|
+
describe:
|
|
36
|
+
"The source object path in the form of {bucket}/{key}",
|
|
37
|
+
type: "string",
|
|
38
|
+
})
|
|
38
39
|
.option("file", {
|
|
39
40
|
describe: "The destination file to create",
|
|
40
41
|
alias: "f",
|
|
@@ -51,10 +52,7 @@ export const r2: BuilderCallback<unknown, unknown> = (r2Yargs) => {
|
|
|
51
52
|
});
|
|
52
53
|
},
|
|
53
54
|
async (objectGetYargs) => {
|
|
54
|
-
const config = readConfig(
|
|
55
|
-
objectGetYargs.config as ConfigPath,
|
|
56
|
-
objectGetYargs
|
|
57
|
-
);
|
|
55
|
+
const config = readConfig(objectGetYargs.config, objectGetYargs);
|
|
58
56
|
const accountId = await requireAuth(config);
|
|
59
57
|
const { objectPath, pipe } = objectGetYargs;
|
|
60
58
|
const { bucket, key } = bucketAndKeyFromObjectPath(objectPath);
|
|
@@ -144,10 +142,7 @@ export const r2: BuilderCallback<unknown, unknown> = (r2Yargs) => {
|
|
|
144
142
|
async (objectPutYargs) => {
|
|
145
143
|
await printWranglerBanner();
|
|
146
144
|
|
|
147
|
-
const config = readConfig(
|
|
148
|
-
objectPutYargs.config as ConfigPath,
|
|
149
|
-
objectPutYargs
|
|
150
|
-
);
|
|
145
|
+
const config = readConfig(objectPutYargs.config, objectPutYargs);
|
|
151
146
|
const accountId = await requireAuth(config);
|
|
152
147
|
const { objectPath, file, pipe, ...options } = objectPutYargs;
|
|
153
148
|
const { bucket, key } = bucketAndKeyFromObjectPath(objectPath);
|
|
@@ -210,7 +205,7 @@ export const r2: BuilderCallback<unknown, unknown> = (r2Yargs) => {
|
|
|
210
205
|
const { objectPath } = args;
|
|
211
206
|
await printWranglerBanner();
|
|
212
207
|
|
|
213
|
-
const config = readConfig(args.config
|
|
208
|
+
const config = readConfig(args.config, args);
|
|
214
209
|
const accountId = await requireAuth(config);
|
|
215
210
|
const { bucket, key } = bucketAndKeyFromObjectPath(objectPath);
|
|
216
211
|
logger.log(`Deleting object "${key}" from bucket "${bucket}".`);
|
|
@@ -235,7 +230,7 @@ export const r2: BuilderCallback<unknown, unknown> = (r2Yargs) => {
|
|
|
235
230
|
async (args) => {
|
|
236
231
|
await printWranglerBanner();
|
|
237
232
|
|
|
238
|
-
const config = readConfig(args.config
|
|
233
|
+
const config = readConfig(args.config, args);
|
|
239
234
|
|
|
240
235
|
const accountId = await requireAuth(config);
|
|
241
236
|
|
|
@@ -248,16 +243,21 @@ export const r2: BuilderCallback<unknown, unknown> = (r2Yargs) => {
|
|
|
248
243
|
}
|
|
249
244
|
);
|
|
250
245
|
|
|
251
|
-
r2BucketYargs.command(
|
|
252
|
-
|
|
246
|
+
r2BucketYargs.command(
|
|
247
|
+
"list",
|
|
248
|
+
"List R2 buckets",
|
|
249
|
+
(listArgs) => listArgs,
|
|
250
|
+
async (args) => {
|
|
251
|
+
const config = readConfig(args.config, args);
|
|
253
252
|
|
|
254
|
-
|
|
253
|
+
const accountId = await requireAuth(config);
|
|
255
254
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
255
|
+
logger.log(JSON.stringify(await listR2Buckets(accountId), null, 2));
|
|
256
|
+
await metrics.sendMetricsEvent("list r2 buckets", {
|
|
257
|
+
sendMetrics: config.send_metrics,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
261
|
|
|
262
262
|
r2BucketYargs.command(
|
|
263
263
|
"delete <name>",
|
|
@@ -272,7 +272,7 @@ export const r2: BuilderCallback<unknown, unknown> = (r2Yargs) => {
|
|
|
272
272
|
async (args) => {
|
|
273
273
|
await printWranglerBanner();
|
|
274
274
|
|
|
275
|
-
const config = readConfig(args.config
|
|
275
|
+
const config = readConfig(args.config, args);
|
|
276
276
|
|
|
277
277
|
const accountId = await requireAuth(config);
|
|
278
278
|
|
|
@@ -286,4 +286,4 @@ export const r2: BuilderCallback<unknown, unknown> = (r2Yargs) => {
|
|
|
286
286
|
);
|
|
287
287
|
return r2BucketYargs;
|
|
288
288
|
});
|
|
289
|
-
}
|
|
289
|
+
}
|
package/src/secret/index.ts
CHANGED
|
@@ -13,14 +13,12 @@ import * as metrics from "../metrics";
|
|
|
13
13
|
import { parseJSON, readFileSync } from "../parse";
|
|
14
14
|
import { requireAuth } from "../user";
|
|
15
15
|
|
|
16
|
-
import type { ConfigPath } from "../index";
|
|
17
16
|
import type {
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
CommonYargsArgv,
|
|
18
|
+
StrictYargsOptionsToInterface,
|
|
20
19
|
} from "../yargs-types";
|
|
21
|
-
import type { Argv } from "yargs";
|
|
22
20
|
|
|
23
|
-
export const secret = (secretYargs:
|
|
21
|
+
export const secret = (secretYargs: CommonYargsArgv) => {
|
|
24
22
|
return secretYargs
|
|
25
23
|
.option("legacy-env", {
|
|
26
24
|
type: "boolean",
|
|
@@ -44,7 +42,7 @@ export const secret = (secretYargs: Argv<CommonYargsOptions>) => {
|
|
|
44
42
|
},
|
|
45
43
|
async (args) => {
|
|
46
44
|
await printWranglerBanner();
|
|
47
|
-
const config = readConfig(args.config
|
|
45
|
+
const config = readConfig(args.config, args);
|
|
48
46
|
|
|
49
47
|
const scriptName = getLegacyScriptName(args, config);
|
|
50
48
|
if (!scriptName) {
|
|
@@ -58,7 +56,7 @@ export const secret = (secretYargs: Argv<CommonYargsOptions>) => {
|
|
|
58
56
|
const isInteractive = process.stdin.isTTY;
|
|
59
57
|
const secretValue = trimTrailingWhitespace(
|
|
60
58
|
isInteractive
|
|
61
|
-
? await prompt("Enter a secret value:",
|
|
59
|
+
? await prompt("Enter a secret value:", { isSecret: true })
|
|
62
60
|
: await readFromStdin()
|
|
63
61
|
);
|
|
64
62
|
|
|
@@ -102,18 +100,21 @@ export const secret = (secretYargs: Argv<CommonYargsOptions>) => {
|
|
|
102
100
|
},
|
|
103
101
|
bindings: {
|
|
104
102
|
kv_namespaces: [],
|
|
103
|
+
send_email: [],
|
|
105
104
|
vars: {},
|
|
106
105
|
durable_objects: { bindings: [] },
|
|
107
106
|
queues: [],
|
|
108
107
|
r2_buckets: [],
|
|
109
108
|
d1_databases: [],
|
|
110
109
|
services: [],
|
|
110
|
+
analytics_engine_datasets: [],
|
|
111
111
|
wasm_modules: {},
|
|
112
112
|
text_blobs: {},
|
|
113
113
|
data_blobs: {},
|
|
114
114
|
dispatch_namespaces: [],
|
|
115
|
+
mtls_certificates: [],
|
|
115
116
|
logfwdr: { schema: undefined, bindings: [] },
|
|
116
|
-
unsafe:
|
|
117
|
+
unsafe: { bindings: undefined, metadata: undefined },
|
|
117
118
|
},
|
|
118
119
|
modules: [],
|
|
119
120
|
migrations: undefined,
|
|
@@ -171,7 +172,7 @@ export const secret = (secretYargs: Argv<CommonYargsOptions>) => {
|
|
|
171
172
|
});
|
|
172
173
|
},
|
|
173
174
|
async (args) => {
|
|
174
|
-
const config = readConfig(args.config
|
|
175
|
+
const config = readConfig(args.config, args);
|
|
175
176
|
|
|
176
177
|
const scriptName = getLegacyScriptName(args, config);
|
|
177
178
|
if (!scriptName) {
|
|
@@ -221,7 +222,7 @@ export const secret = (secretYargs: Argv<CommonYargsOptions>) => {
|
|
|
221
222
|
});
|
|
222
223
|
},
|
|
223
224
|
async (args) => {
|
|
224
|
-
const config = readConfig(args.config
|
|
225
|
+
const config = readConfig(args.config, args);
|
|
225
226
|
|
|
226
227
|
const scriptName = getLegacyScriptName(args, config);
|
|
227
228
|
if (!scriptName) {
|
|
@@ -245,7 +246,7 @@ export const secret = (secretYargs: Argv<CommonYargsOptions>) => {
|
|
|
245
246
|
);
|
|
246
247
|
};
|
|
247
248
|
|
|
248
|
-
export const secretBulkOptions = (yargs:
|
|
249
|
+
export const secretBulkOptions = (yargs: CommonYargsArgv) => {
|
|
249
250
|
return yargs
|
|
250
251
|
.positional("json", {
|
|
251
252
|
describe: `The JSON file of key-value pairs to upload, in form {"key": value, ...}`,
|
|
@@ -300,14 +301,11 @@ function readFromStdin(): Promise<string> {
|
|
|
300
301
|
});
|
|
301
302
|
}
|
|
302
303
|
|
|
303
|
-
type SecretBulkArgs =
|
|
304
|
+
type SecretBulkArgs = StrictYargsOptionsToInterface<typeof secretBulkOptions>;
|
|
304
305
|
|
|
305
306
|
export const secretBulkHandler = async (secretBulkArgs: SecretBulkArgs) => {
|
|
306
307
|
await printWranglerBanner();
|
|
307
|
-
const config = readConfig(
|
|
308
|
-
secretBulkArgs.config as ConfigPath,
|
|
309
|
-
secretBulkArgs
|
|
310
|
-
);
|
|
308
|
+
const config = readConfig(secretBulkArgs.config, secretBulkArgs);
|
|
311
309
|
|
|
312
310
|
const scriptName = getLegacyScriptName(secretBulkArgs, config);
|
|
313
311
|
if (!scriptName) {
|
|
@@ -56,7 +56,7 @@ function hashFileContent(hasher: XXHashAPI, content: string): string {
|
|
|
56
56
|
* Create a hashed asset key for the given asset.
|
|
57
57
|
*
|
|
58
58
|
* The key will change if the file path or content of the asset changes.
|
|
59
|
-
* The algorithm used here matches that of Wrangler
|
|
59
|
+
* The algorithm used here matches that of Wrangler v1.
|
|
60
60
|
*/
|
|
61
61
|
function hashAsset(
|
|
62
62
|
hasher: XXHashAPI,
|
package/src/tail/createTail.ts
CHANGED
|
@@ -7,6 +7,8 @@ export { translateCLICommandToFilterMessage } from "./filters";
|
|
|
7
7
|
export { jsonPrintLogs, prettyPrintLogs } from "./printing";
|
|
8
8
|
import type { Request } from "undici";
|
|
9
9
|
|
|
10
|
+
const TRACE_VERSION = "trace-v1";
|
|
11
|
+
|
|
10
12
|
/**
|
|
11
13
|
* When creating a Tail, the response from the API contains
|
|
12
14
|
* - an ID used for identifying the tail
|
|
@@ -59,6 +61,68 @@ function makeDeleteTailUrl(
|
|
|
59
61
|
: `/accounts/${accountId}/workers/scripts/${workerName}/tails/${tailId}`;
|
|
60
62
|
}
|
|
61
63
|
|
|
64
|
+
interface CreatePagesTailOptions {
|
|
65
|
+
accountId: string;
|
|
66
|
+
projectName: string;
|
|
67
|
+
deploymentId: string;
|
|
68
|
+
filters: TailFilterMessage;
|
|
69
|
+
debug?: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Create and connect to a Pages Function Tail.
|
|
74
|
+
*
|
|
75
|
+
* Under the hood, this function
|
|
76
|
+
* - Registers a new Tail with the API
|
|
77
|
+
* - Connects to the tail worker
|
|
78
|
+
* - Sends any filters over the connection
|
|
79
|
+
*
|
|
80
|
+
* @returns a websocket connection, an expiration, and a function to call to delete the tail
|
|
81
|
+
*/
|
|
82
|
+
export async function createPagesTail({
|
|
83
|
+
accountId,
|
|
84
|
+
projectName,
|
|
85
|
+
deploymentId,
|
|
86
|
+
filters,
|
|
87
|
+
debug = false,
|
|
88
|
+
}: CreatePagesTailOptions) {
|
|
89
|
+
const tailRecord = await fetchResult<TailCreationApiResponse>(
|
|
90
|
+
`/accounts/${accountId}/pages/projects/${projectName}/deployments/${deploymentId}/tails`,
|
|
91
|
+
{
|
|
92
|
+
method: "POST",
|
|
93
|
+
body: JSON.stringify(filters),
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const deleteTail = async () =>
|
|
98
|
+
fetchResult(
|
|
99
|
+
`/accounts/${accountId}/pages/projects/${projectName}/deployments/${deploymentId}/tails/${tailRecord.id}`,
|
|
100
|
+
{ method: "DELETE" }
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const tail = new WebSocket(tailRecord.url, TRACE_VERSION, {
|
|
104
|
+
headers: {
|
|
105
|
+
"Sec-WebSocket-Protocol": TRACE_VERSION, // needs to be `trace-v1` to be accepted
|
|
106
|
+
"User-Agent": `wrangler-js/${packageVersion}`,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// send filters when we open up
|
|
111
|
+
tail.on("open", () => {
|
|
112
|
+
tail.send(
|
|
113
|
+
JSON.stringify({ debug: debug }),
|
|
114
|
+
{ binary: false, compress: false, mask: false, fin: true },
|
|
115
|
+
(err) => {
|
|
116
|
+
if (err) {
|
|
117
|
+
throw err;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return { tail, deleteTail, expiration: tailRecord.expires_at };
|
|
124
|
+
}
|
|
125
|
+
|
|
62
126
|
/**
|
|
63
127
|
* Create and connect to a tail.
|
|
64
128
|
*
|
|
@@ -102,9 +166,9 @@ export async function createTail(
|
|
|
102
166
|
}
|
|
103
167
|
|
|
104
168
|
// connect to the tail
|
|
105
|
-
const tail = new WebSocket(websocketUrl,
|
|
169
|
+
const tail = new WebSocket(websocketUrl, TRACE_VERSION, {
|
|
106
170
|
headers: {
|
|
107
|
-
"Sec-WebSocket-Protocol":
|
|
171
|
+
"Sec-WebSocket-Protocol": TRACE_VERSION, // needs to be `trace-v1` to be accepted
|
|
108
172
|
"User-Agent": `wrangler-js/${packageVersion}`,
|
|
109
173
|
},
|
|
110
174
|
});
|
|
@@ -178,11 +242,18 @@ export type TailEventMessage = {
|
|
|
178
242
|
* The event that triggered the worker. In the case of an HTTP request,
|
|
179
243
|
* this will be a RequestEvent. If it's a cron trigger, it'll be a
|
|
180
244
|
* ScheduledEvent. If it's a durable object alarm, it's an AlarmEvent.
|
|
245
|
+
* If it's a email, it'a an EmailEvent
|
|
181
246
|
*
|
|
182
247
|
* Until workers-types exposes individual types for export, we'll have
|
|
183
248
|
* to just re-define these types ourselves.
|
|
184
249
|
*/
|
|
185
|
-
event:
|
|
250
|
+
event:
|
|
251
|
+
| RequestEvent
|
|
252
|
+
| ScheduledEvent
|
|
253
|
+
| AlarmEvent
|
|
254
|
+
| EmailEvent
|
|
255
|
+
| undefined
|
|
256
|
+
| null;
|
|
186
257
|
};
|
|
187
258
|
|
|
188
259
|
/**
|
|
@@ -313,3 +384,23 @@ export type AlarmEvent = {
|
|
|
313
384
|
*/
|
|
314
385
|
scheduledTime: string;
|
|
315
386
|
};
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* An event that was triggered from an email
|
|
390
|
+
*/
|
|
391
|
+
export type EmailEvent = {
|
|
392
|
+
/**
|
|
393
|
+
* Who sent the email
|
|
394
|
+
*/
|
|
395
|
+
mailFrom: string;
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Who was the email sent to
|
|
399
|
+
*/
|
|
400
|
+
rcptTo: string;
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Size of the email in bytes
|
|
404
|
+
*/
|
|
405
|
+
rawSize: number;
|
|
406
|
+
};
|
package/src/tail/filters.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* These are the filters we accept in the CLI. They
|
|
10
|
-
* were copied directly from
|
|
10
|
+
* were copied directly from Wrangler v1 in order to
|
|
11
11
|
* maintain compatability, so they aren't actually the exact
|
|
12
12
|
* filters we need to send up to the tail worker. They generally map 1:1,
|
|
13
13
|
* but often require some transformation or
|
package/src/tail/index.ts
CHANGED
|
@@ -3,7 +3,7 @@ import onExit from "signal-exit";
|
|
|
3
3
|
|
|
4
4
|
import { fetchResult, fetchScriptContent } from "../cfetch";
|
|
5
5
|
import { readConfig } from "../config";
|
|
6
|
-
import {
|
|
6
|
+
import { confirm } from "../dialogs";
|
|
7
7
|
import {
|
|
8
8
|
isLegacyEnv,
|
|
9
9
|
printWranglerBanner,
|
|
@@ -20,16 +20,14 @@ import {
|
|
|
20
20
|
translateCLICommandToFilterMessage,
|
|
21
21
|
} from "./createTail";
|
|
22
22
|
import type { WorkerMetadata } from "../create-worker-upload-form";
|
|
23
|
-
import type { ConfigPath } from "../index";
|
|
24
23
|
import type {
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
CommonYargsArgv,
|
|
25
|
+
StrictYargsOptionsToInterface,
|
|
27
26
|
} from "../yargs-types";
|
|
28
27
|
import type { TailCLIFilters } from "./createTail";
|
|
29
28
|
import type { RawData } from "ws";
|
|
30
|
-
import type { Argv } from "yargs";
|
|
31
29
|
|
|
32
|
-
export function tailOptions(yargs:
|
|
30
|
+
export function tailOptions(yargs: CommonYargsArgv) {
|
|
33
31
|
return yargs
|
|
34
32
|
.positional("worker", {
|
|
35
33
|
describe: "Name or route of the worker to tail",
|
|
@@ -86,13 +84,13 @@ export function tailOptions(yargs: Argv<CommonYargsOptions>) {
|
|
|
86
84
|
});
|
|
87
85
|
}
|
|
88
86
|
|
|
89
|
-
type TailArgs =
|
|
87
|
+
type TailArgs = StrictYargsOptionsToInterface<typeof tailOptions>;
|
|
90
88
|
|
|
91
89
|
export async function tailHandler(args: TailArgs) {
|
|
92
90
|
if (args.format === "pretty") {
|
|
93
91
|
await printWranglerBanner();
|
|
94
92
|
}
|
|
95
|
-
const config = readConfig(args.config
|
|
93
|
+
const config = readConfig(args.config, args);
|
|
96
94
|
await metrics.sendMetricsEvent("begin log stream", {
|
|
97
95
|
sendMetrics: config.send_metrics,
|
|
98
96
|
});
|
|
@@ -121,7 +119,7 @@ export async function tailHandler(args: TailArgs) {
|
|
|
121
119
|
status: args.status as ("ok" | "error" | "canceled")[] | undefined,
|
|
122
120
|
header: args.header,
|
|
123
121
|
method: args.method,
|
|
124
|
-
samplingRate: args
|
|
122
|
+
samplingRate: args.samplingRate,
|
|
125
123
|
search: args.search,
|
|
126
124
|
clientIp: args.ip,
|
|
127
125
|
};
|
|
@@ -144,8 +142,7 @@ export async function tailHandler(args: TailArgs) {
|
|
|
144
142
|
`Beginning log collection requires restarting the Durable Objects associated with ${scriptName}. Any WebSocket connections or other non-persisted state will be lost as part of this restart.`
|
|
145
143
|
);
|
|
146
144
|
|
|
147
|
-
|
|
148
|
-
if (!shouldContinue) {
|
|
145
|
+
if (!(await confirm("Would you like to continue?"))) {
|
|
149
146
|
return;
|
|
150
147
|
}
|
|
151
148
|
}
|
package/src/tail/printing.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { logger } from "../logger";
|
|
2
2
|
import type {
|
|
3
3
|
AlarmEvent,
|
|
4
|
+
EmailEvent,
|
|
4
5
|
RequestEvent,
|
|
5
6
|
ScheduledEvent,
|
|
6
7
|
TailEventMessage,
|
|
@@ -30,6 +31,16 @@ export function prettyPrintLogs(data: WebSocket.RawData): void {
|
|
|
30
31
|
? `${requestMethod} ${url} - ${outcome} @ ${datetime}`
|
|
31
32
|
: `[missing request] - ${outcome} @ ${datetime}`
|
|
32
33
|
);
|
|
34
|
+
} else if (isEmailEvent(eventMessage.event)) {
|
|
35
|
+
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
36
|
+
const datetime = new Date(eventMessage.eventTimestamp).toLocaleString();
|
|
37
|
+
const mailFrom = eventMessage.event.mailFrom;
|
|
38
|
+
const rcptTo = eventMessage.event.rcptTo;
|
|
39
|
+
const rawSize = eventMessage.event.rawSize;
|
|
40
|
+
|
|
41
|
+
logger.log(
|
|
42
|
+
`Email from:${mailFrom} to:${rcptTo} size:${rawSize} @ ${datetime} - ${outcome}`
|
|
43
|
+
);
|
|
33
44
|
} else if (isAlarmEvent(eventMessage.event)) {
|
|
34
45
|
const outcome = prettifyOutcome(eventMessage.outcome);
|
|
35
46
|
const datetime = new Date(
|
|
@@ -74,6 +85,10 @@ function isScheduledEvent(
|
|
|
74
85
|
return Boolean(event && "cron" in event);
|
|
75
86
|
}
|
|
76
87
|
|
|
88
|
+
function isEmailEvent(event: TailEventMessage["event"]): event is EmailEvent {
|
|
89
|
+
return Boolean(event && "mailFrom" in event);
|
|
90
|
+
}
|
|
91
|
+
|
|
77
92
|
/**
|
|
78
93
|
* Check to see if an event sent from a worker is an AlarmEvent.
|
|
79
94
|
*
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { logger } from "./logger";
|
|
5
|
+
import { matchFiles, parseRules } from "./module-collection";
|
|
6
|
+
import type { BundleResult } from "./bundle";
|
|
7
|
+
import type { Config } from "./config";
|
|
8
|
+
import type { Entry } from "./entry";
|
|
9
|
+
|
|
10
|
+
async function getFiles(root: string, relativeTo: string): Promise<string[]> {
|
|
11
|
+
const files = [];
|
|
12
|
+
for (const file of await readdir(root, { withFileTypes: true })) {
|
|
13
|
+
if (file.isDirectory()) {
|
|
14
|
+
files.push(...(await getFiles(path.join(root, file.name), relativeTo)));
|
|
15
|
+
} else {
|
|
16
|
+
files.push(path.relative(relativeTo, path.join(root, file.name)));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return files;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export default async function traverseModuleGraph(
|
|
23
|
+
entry: Entry,
|
|
24
|
+
rules: Config["rules"]
|
|
25
|
+
): Promise<BundleResult> {
|
|
26
|
+
const files = await getFiles(entry.moduleRoot, entry.moduleRoot);
|
|
27
|
+
const relativeEntryPoint = path.relative(entry.moduleRoot, entry.file);
|
|
28
|
+
|
|
29
|
+
const modules = (await matchFiles(files, entry.moduleRoot, parseRules(rules)))
|
|
30
|
+
.filter((m) => m.name !== relativeEntryPoint)
|
|
31
|
+
.map((m) => ({
|
|
32
|
+
...m,
|
|
33
|
+
name: m.name,
|
|
34
|
+
}));
|
|
35
|
+
|
|
36
|
+
const bundleType = entry.format === "modules" ? "esm" : "commonjs";
|
|
37
|
+
|
|
38
|
+
if (modules.length > 0) {
|
|
39
|
+
logger.info(`Uploading additional modules:`);
|
|
40
|
+
modules.forEach(({ name, type }) => {
|
|
41
|
+
logger.info(`- ${chalk.blue(name)} (${chalk.green(type ?? "")})`);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
modules,
|
|
47
|
+
dependencies: {},
|
|
48
|
+
resolvedEntryPointPath: entry.file,
|
|
49
|
+
bundleType,
|
|
50
|
+
stop: undefined,
|
|
51
|
+
sourceMapPath: undefined,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// `@types/node` should be included
|
|
2
|
+
Buffer.from("test");
|
|
3
|
+
|
|
4
|
+
// @ts-expect-error `@types/jest` should NOT be included
|
|
5
|
+
test("test");
|
|
6
|
+
|
|
7
|
+
// @ts-expect-error `@cloudflare/workers-types` should NOT be included
|
|
8
|
+
const _handler: ExportedHandler = {};
|
|
9
|
+
// @ts-expect-error `@cloudflare/workers-types` should NOT be included
|
|
10
|
+
new HTMLRewriter();
|
|
11
|
+
|
|
12
|
+
// @ts-expect-error `fetch` should NOT be included as our minimum supported
|
|
13
|
+
// Node version is 16.13.0 which does not include `fetch` on the global scope
|
|
14
|
+
void fetch("http://localhost/");
|
|
15
|
+
|
|
16
|
+
export {};
|