wrangler 0.0.0-e7a0cd5b → 0.0.0-e7cf0caa
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 +27 -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 -86
- 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 -56
- package/src/__tests__/dev.test.tsx +198 -90
- package/src/__tests__/generate.test.ts +12 -10
- 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 +128 -27
- 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 +1615 -852
- package/src/__tests__/pubsub.test.ts +226 -100
- package/src/__tests__/queues.test.ts +238 -77
- package/src/__tests__/r2.test.ts +55 -57
- 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 +43 -26
- 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 +263 -140
- 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 +79 -24
- package/src/config/index.ts +99 -38
- package/src/config/validation-helpers.ts +1 -1
- package/src/config/validation.ts +248 -19
- package/src/create-worker-preview.ts +19 -8
- package/src/create-worker-upload-form.ts +60 -22
- package/src/d1/backups.tsx +43 -42
- package/src/d1/constants.ts +2 -0
- package/src/d1/create.tsx +44 -30
- package/src/d1/{delete.tsx → delete.ts} +11 -14
- package/src/d1/execute.tsx +209 -151
- package/src/d1/index.ts +31 -7
- 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 +12 -2
- package/src/d1/splitter.ts +161 -0
- package/src/d1/{types.tsx → types.ts} +11 -0
- package/src/d1/utils.ts +12 -2
- package/src/delete.ts +8 -16
- package/src/deployments.ts +340 -46
- package/src/deprecated/index.ts +8 -302
- package/src/dev/dev.tsx +57 -44
- package/src/dev/local.tsx +294 -91
- package/src/dev/remote.tsx +32 -3
- package/src/dev/start-server.ts +89 -68
- 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 -118
- 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} +137 -63
- 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 -124
- package/src/pages/errors.ts +1 -0
- package/src/pages/functions/buildPlugin.ts +72 -69
- package/src/pages/functions/buildWorker.ts +249 -114
- 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 +45 -214
- package/src/pages/types.ts +6 -9
- package/src/pages/upload.tsx +58 -14
- package/src/pages/utils.ts +14 -3
- 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 +72 -47
- 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/constants.ts +4 -0
- package/src/r2/helpers.ts +1 -0
- package/src/r2/index.ts +40 -28
- package/src/secret/index.ts +14 -17
- 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 +79 -57
- 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 +35 -3
- 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 +95 -25
- 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 +826 -77
- package/wrangler-dist/cli.js +130734 -140838
- package/wrangler-dist/wasm-sync.wasm +0 -0
- package/src/__tests__/api-devregistry.test.js +0 -57
- package/src/__tests__/d1.test.ts +0 -72
- package/src/__tests__/dialogs.test.tsx +0 -40
- package/src/__tests__/helpers/mock-cfetch.ts +0 -333
- package/src/__tests__/pages.test.ts +0 -2223
- package/src/dialogs.tsx +0 -163
- package/src/environment-variables.ts +0 -50
- package/src/pages/build.tsx +0 -238
- 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,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Logger } from "../logger";
|
|
2
2
|
import { mockConsoleMethods } from "./helpers/mock-console";
|
|
3
3
|
|
|
4
4
|
describe("logger", () => {
|
|
5
5
|
const std = mockConsoleMethods();
|
|
6
6
|
|
|
7
7
|
it("should add colored markers to error and warning messages", () => {
|
|
8
|
+
const logger = new Logger();
|
|
8
9
|
logger.loggerLevel = "debug";
|
|
9
10
|
logger.debug("This is a debug message");
|
|
10
11
|
logger.log("This is a log message");
|
|
@@ -27,6 +28,7 @@ describe("logger", () => {
|
|
|
27
28
|
|
|
28
29
|
describe("loggerLevel=debug", () => {
|
|
29
30
|
it("should render messages that are at or above the log level set in the logger", () => {
|
|
31
|
+
const logger = new Logger();
|
|
30
32
|
logger.loggerLevel = "debug";
|
|
31
33
|
logger.debug("This is a debug message");
|
|
32
34
|
logger.log("This is a log message");
|
|
@@ -50,6 +52,7 @@ describe("logger", () => {
|
|
|
50
52
|
|
|
51
53
|
describe("loggerLevel=log", () => {
|
|
52
54
|
it("should render messages that are at or above the log level set in the logger", () => {
|
|
55
|
+
const logger = new Logger();
|
|
53
56
|
logger.loggerLevel = "log";
|
|
54
57
|
logger.debug("This is a debug message");
|
|
55
58
|
logger.log("This is a log message");
|
|
@@ -73,6 +76,7 @@ describe("logger", () => {
|
|
|
73
76
|
|
|
74
77
|
describe("loggerLevel=warn", () => {
|
|
75
78
|
it("should render messages that are at or above the log level set in the logger", () => {
|
|
79
|
+
const logger = new Logger();
|
|
76
80
|
logger.loggerLevel = "warn";
|
|
77
81
|
logger.debug("This is a debug message");
|
|
78
82
|
logger.log("This is a log message");
|
|
@@ -96,6 +100,7 @@ describe("logger", () => {
|
|
|
96
100
|
|
|
97
101
|
describe("loggerLevel=error", () => {
|
|
98
102
|
it("should render messages that are at or above the log level set in the logger", () => {
|
|
103
|
+
const logger = new Logger();
|
|
99
104
|
logger.loggerLevel = "error";
|
|
100
105
|
logger.debug("This is a debug message");
|
|
101
106
|
logger.log("This is a log message");
|
|
@@ -122,7 +127,7 @@ describe("logger", () => {
|
|
|
122
127
|
});
|
|
123
128
|
|
|
124
129
|
it("should render messages that are at or above the log level set in the env var", () => {
|
|
125
|
-
logger
|
|
130
|
+
const logger = new Logger();
|
|
126
131
|
logger.debug("This is a debug message");
|
|
127
132
|
logger.log("This is a log message");
|
|
128
133
|
logger.warn("This is a warn message");
|
|
@@ -138,4 +143,65 @@ describe("logger", () => {
|
|
|
138
143
|
`);
|
|
139
144
|
});
|
|
140
145
|
});
|
|
146
|
+
|
|
147
|
+
describe("loggerLevelFromEnvVar case-insensitive", () => {
|
|
148
|
+
beforeEach(() => {
|
|
149
|
+
process.env.WRANGLER_LOG = "wARn";
|
|
150
|
+
});
|
|
151
|
+
afterEach(() => {
|
|
152
|
+
process.env.WRANGLER_LOG = undefined;
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it("should render messages that are at or above the log level set in the env var", () => {
|
|
156
|
+
const logger = new Logger();
|
|
157
|
+
logger.debug("This is a debug message");
|
|
158
|
+
logger.log("This is a log message");
|
|
159
|
+
logger.warn("This is a warn message");
|
|
160
|
+
logger.error("This is a error message");
|
|
161
|
+
|
|
162
|
+
expect(std.debug).toMatchInlineSnapshot(`""`);
|
|
163
|
+
expect(std.out).toMatchInlineSnapshot(`""`);
|
|
164
|
+
expect(std.warn).toMatchInlineSnapshot(`
|
|
165
|
+
"[33m▲ [43;33m[[43;30mWARNING[43;33m][0m [1mThis is a warn message[0m
|
|
166
|
+
|
|
167
|
+
"
|
|
168
|
+
`);
|
|
169
|
+
expect(std.err).toMatchInlineSnapshot(`
|
|
170
|
+
"[31mX [41;31m[[41;97mERROR[41;31m][0m [1mThis is a error message[0m
|
|
171
|
+
|
|
172
|
+
"
|
|
173
|
+
`);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe("loggerLevelFromEnvVar falls back to log on invalid level", () => {
|
|
178
|
+
beforeEach(() => {
|
|
179
|
+
process.env.WRANGLER_LOG = "everything";
|
|
180
|
+
});
|
|
181
|
+
afterEach(() => {
|
|
182
|
+
process.env.WRANGLER_LOG = undefined;
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("should render messages that are at or above the log level set in the env var", () => {
|
|
186
|
+
const logger = new Logger();
|
|
187
|
+
logger.debug("This is a debug message");
|
|
188
|
+
logger.log("This is a log message");
|
|
189
|
+
logger.warn("This is a warn message");
|
|
190
|
+
logger.error("This is a error message");
|
|
191
|
+
|
|
192
|
+
expect(std.debug).toMatchInlineSnapshot(`""`);
|
|
193
|
+
expect(std.out).toMatchInlineSnapshot(`"This is a log message"`);
|
|
194
|
+
expect(std.warn).toMatchInlineSnapshot(`
|
|
195
|
+
"Unrecognised WRANGLER_LOG value \\"everything\\", expected \\"none\\" | \\"error\\" | \\"warn\\" | \\"info\\" | \\"log\\" | \\"debug\\", defaulting to \\"log\\"...
|
|
196
|
+
[33m▲ [43;33m[[43;30mWARNING[43;33m][0m [1mThis is a warn message[0m
|
|
197
|
+
|
|
198
|
+
"
|
|
199
|
+
`);
|
|
200
|
+
expect(std.err).toMatchInlineSnapshot(`
|
|
201
|
+
"[31mX [41;31m[[41;97mERROR[41;31m][0m [1mThis is a error message[0m
|
|
202
|
+
|
|
203
|
+
"
|
|
204
|
+
`);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
141
207
|
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { rest } from "msw";
|
|
4
|
+
import { getGlobalWranglerConfigPath } from "../global-wrangler-config-path";
|
|
5
|
+
import { USER_AUTH_CONFIG_FILE, writeAuthConfigFile } from "../user";
|
|
6
|
+
import { mockConsoleMethods } from "./helpers/mock-console";
|
|
7
|
+
import { msw } from "./helpers/msw";
|
|
8
|
+
import { runInTempDir } from "./helpers/run-in-tmp";
|
|
9
|
+
import { runWrangler } from "./helpers/run-wrangler";
|
|
10
|
+
|
|
11
|
+
describe("logout", () => {
|
|
12
|
+
runInTempDir();
|
|
13
|
+
const std = mockConsoleMethods();
|
|
14
|
+
|
|
15
|
+
it("should exit with a message stating the user is not logged in", async () => {
|
|
16
|
+
await runWrangler("logout");
|
|
17
|
+
expect(std.out).toMatchInlineSnapshot(`"Not logged in, exiting..."`);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should logout user that has been properly logged in", async () => {
|
|
21
|
+
writeAuthConfigFile({
|
|
22
|
+
oauth_token: "some-oauth-tok",
|
|
23
|
+
refresh_token: "some-refresh-tok",
|
|
24
|
+
});
|
|
25
|
+
// Make sure that logout removed the config file containing the auth tokens.
|
|
26
|
+
const config = path.join(
|
|
27
|
+
getGlobalWranglerConfigPath(),
|
|
28
|
+
USER_AUTH_CONFIG_FILE
|
|
29
|
+
);
|
|
30
|
+
let counter = 0;
|
|
31
|
+
msw.use(
|
|
32
|
+
rest.post("*/oauth2/revoke", (_, response, context) => {
|
|
33
|
+
// Make sure that we made the request to logout.
|
|
34
|
+
counter += 1;
|
|
35
|
+
return response.once(context.status(200), context.text(""));
|
|
36
|
+
})
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
expect(fs.existsSync(config)).toBeTruthy();
|
|
40
|
+
|
|
41
|
+
await runWrangler("logout");
|
|
42
|
+
|
|
43
|
+
expect(std.out).toMatchInlineSnapshot(`"Successfully logged out."`);
|
|
44
|
+
expect(fs.existsSync(config)).toBeFalsy();
|
|
45
|
+
expect(counter).toBe(1);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { mkdirSync } from "node:fs";
|
|
2
|
-
import
|
|
2
|
+
import { rest } from "msw";
|
|
3
3
|
import { version as wranglerVersion } from "../../package.json";
|
|
4
4
|
import { purgeConfigCaches, saveToConfigCache } from "../config-cache";
|
|
5
5
|
import { CI } from "../is-ci";
|
|
@@ -12,10 +12,10 @@ import {
|
|
|
12
12
|
writeMetricsConfig,
|
|
13
13
|
} from "../metrics/metrics-config";
|
|
14
14
|
import { writeAuthConfigFile } from "../user";
|
|
15
|
-
import { setMockResponse, unsetAllMocks } from "./helpers/mock-cfetch";
|
|
16
15
|
import { mockConsoleMethods } from "./helpers/mock-console";
|
|
17
|
-
import { mockConfirm } from "./helpers/mock-dialogs";
|
|
16
|
+
import { mockConfirm, clearDialogs } from "./helpers/mock-dialogs";
|
|
18
17
|
import { useMockIsTTY } from "./helpers/mock-istty";
|
|
18
|
+
import { msw, mswSuccessOauthHandlers } from "./helpers/msw";
|
|
19
19
|
import { runInTempDir } from "./helpers/run-in-tmp";
|
|
20
20
|
|
|
21
21
|
declare const global: { SPARROW_SOURCE_KEY: string | undefined };
|
|
@@ -36,9 +36,8 @@ describe("metrics", () => {
|
|
|
36
36
|
});
|
|
37
37
|
afterEach(() => {
|
|
38
38
|
global.SPARROW_SOURCE_KEY = ORIGINAL_SPARROW_SOURCE_KEY;
|
|
39
|
-
fetchMock.resetMocks();
|
|
40
|
-
unsetAllMocks();
|
|
41
39
|
purgeConfigCaches();
|
|
40
|
+
clearDialogs();
|
|
42
41
|
});
|
|
43
42
|
|
|
44
43
|
describe("getMetricsDispatcher()", () => {
|
|
@@ -56,14 +55,8 @@ describe("metrics", () => {
|
|
|
56
55
|
|
|
57
56
|
describe("identify()", () => {
|
|
58
57
|
it("should send a request to the default URL", async () => {
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
await dispatcher.identify({ a: 1, b: 2 });
|
|
62
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
63
|
-
const [url, { body, headers }] = fetchMock.mock.calls[0];
|
|
64
|
-
expect(url).toEqual("https://sparrow.cloudflare.com/api/v1/identify");
|
|
65
|
-
expect(JSON.parse(body)).toEqual(
|
|
66
|
-
expect.objectContaining({
|
|
58
|
+
const request = mockMetricRequest(
|
|
59
|
+
{
|
|
67
60
|
event: "identify",
|
|
68
61
|
properties: {
|
|
69
62
|
category: "Workers",
|
|
@@ -72,13 +65,14 @@ describe("metrics", () => {
|
|
|
72
65
|
a: 1,
|
|
73
66
|
b: 2,
|
|
74
67
|
},
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
expect.objectContaining({
|
|
79
|
-
"Sparrow-Source-Key": "MOCK_KEY",
|
|
80
|
-
})
|
|
68
|
+
},
|
|
69
|
+
{ "Sparrow-Source-Key": "MOCK_KEY" },
|
|
70
|
+
"identify"
|
|
81
71
|
);
|
|
72
|
+
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
73
|
+
await dispatcher.identify({ a: 1, b: 2 });
|
|
74
|
+
|
|
75
|
+
expect(request.count).toBe(1);
|
|
82
76
|
expect(std.debug).toMatchInlineSnapshot(
|
|
83
77
|
`"Metrics dispatcher: Posting data {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}"`
|
|
84
78
|
);
|
|
@@ -88,12 +82,15 @@ describe("metrics", () => {
|
|
|
88
82
|
});
|
|
89
83
|
|
|
90
84
|
it("should write a debug log if the dispatcher is disabled", async () => {
|
|
85
|
+
const requests = mockMetricRequest({}, {}, "identify");
|
|
91
86
|
const dispatcher = await getMetricsDispatcher({
|
|
92
87
|
...MOCK_DISPATCHER_OPTIONS,
|
|
93
88
|
sendMetrics: false,
|
|
94
89
|
});
|
|
95
90
|
await dispatcher.identify({ a: 1, b: 2 });
|
|
96
|
-
|
|
91
|
+
await flushPromises();
|
|
92
|
+
|
|
93
|
+
expect(requests.count).toBe(0);
|
|
97
94
|
expect(std.debug).toMatchInlineSnapshot(
|
|
98
95
|
`"Metrics dispatcher: Dispatching disabled - would have sent {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}."`
|
|
99
96
|
);
|
|
@@ -103,12 +100,18 @@ describe("metrics", () => {
|
|
|
103
100
|
});
|
|
104
101
|
|
|
105
102
|
it("should write a debug log if the request fails", async () => {
|
|
103
|
+
msw.use(
|
|
104
|
+
rest.post("*/identify", async (req, res) => {
|
|
105
|
+
return res.networkError("BAD REQUEST");
|
|
106
|
+
})
|
|
107
|
+
);
|
|
108
|
+
|
|
106
109
|
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
107
|
-
fetchMock.mockReject(new Error("BAD REQUEST"));
|
|
108
110
|
await dispatcher.identify({ a: 1, b: 2 });
|
|
111
|
+
await flushPromises();
|
|
109
112
|
expect(std.debug).toMatchInlineSnapshot(`
|
|
110
113
|
"Metrics dispatcher: Posting data {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}
|
|
111
|
-
Metrics dispatcher: Failed to send request: BAD REQUEST"
|
|
114
|
+
Metrics dispatcher: Failed to send request: request to https://sparrow.cloudflare.com/api/v1/identify failed, reason: BAD REQUEST"
|
|
112
115
|
`);
|
|
113
116
|
expect(std.out).toMatchInlineSnapshot(`""`);
|
|
114
117
|
expect(std.warn).toMatchInlineSnapshot(`""`);
|
|
@@ -119,7 +122,6 @@ describe("metrics", () => {
|
|
|
119
122
|
global.SPARROW_SOURCE_KEY = undefined;
|
|
120
123
|
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
121
124
|
await dispatcher.identify({ a: 1, b: 2 });
|
|
122
|
-
expect(fetchMock).toHaveBeenCalledTimes(0);
|
|
123
125
|
expect(std.debug).toMatchInlineSnapshot(
|
|
124
126
|
`"Metrics dispatcher: Source Key not provided. Be sure to initialize before sending events. { type: 'identify', name: 'identify', properties: { a: 1, b: 2 } }"`
|
|
125
127
|
);
|
|
@@ -131,14 +133,8 @@ describe("metrics", () => {
|
|
|
131
133
|
|
|
132
134
|
describe("sendEvent()", () => {
|
|
133
135
|
it("should send a request to the default URL", async () => {
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
137
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
138
|
-
const [url, { body, headers }] = fetchMock.mock.calls[0];
|
|
139
|
-
expect(url).toEqual("https://sparrow.cloudflare.com/api/v1/event");
|
|
140
|
-
expect(JSON.parse(body)).toEqual(
|
|
141
|
-
expect.objectContaining({
|
|
136
|
+
const requests = mockMetricRequest(
|
|
137
|
+
{
|
|
142
138
|
event: "some-event",
|
|
143
139
|
properties: {
|
|
144
140
|
category: "Workers",
|
|
@@ -147,13 +143,16 @@ describe("metrics", () => {
|
|
|
147
143
|
a: 1,
|
|
148
144
|
b: 2,
|
|
149
145
|
},
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
expect(headers).toEqual(
|
|
153
|
-
expect.objectContaining({
|
|
146
|
+
},
|
|
147
|
+
{
|
|
154
148
|
"Sparrow-Source-Key": "MOCK_KEY",
|
|
155
|
-
}
|
|
149
|
+
},
|
|
150
|
+
"event"
|
|
156
151
|
);
|
|
152
|
+
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
153
|
+
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
154
|
+
|
|
155
|
+
expect(requests.count).toBe(1);
|
|
157
156
|
expect(std.debug).toMatchInlineSnapshot(
|
|
158
157
|
`"Metrics dispatcher: Posting data {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}"`
|
|
159
158
|
);
|
|
@@ -163,12 +162,16 @@ describe("metrics", () => {
|
|
|
163
162
|
});
|
|
164
163
|
|
|
165
164
|
it("should write a debug log if the dispatcher is disabled", async () => {
|
|
165
|
+
const requests = mockMetricRequest({}, {}, "event");
|
|
166
|
+
|
|
166
167
|
const dispatcher = await getMetricsDispatcher({
|
|
167
168
|
...MOCK_DISPATCHER_OPTIONS,
|
|
168
169
|
sendMetrics: false,
|
|
169
170
|
});
|
|
170
171
|
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
171
|
-
|
|
172
|
+
await flushPromises();
|
|
173
|
+
|
|
174
|
+
expect(requests.count).toBe(0);
|
|
172
175
|
expect(std.debug).toMatchInlineSnapshot(
|
|
173
176
|
`"Metrics dispatcher: Dispatching disabled - would have sent {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}."`
|
|
174
177
|
);
|
|
@@ -178,12 +181,17 @@ describe("metrics", () => {
|
|
|
178
181
|
});
|
|
179
182
|
|
|
180
183
|
it("should write a debug log if the request fails", async () => {
|
|
184
|
+
msw.use(
|
|
185
|
+
rest.post("*/event", async (_, res) => {
|
|
186
|
+
return res.networkError("BAD REQUEST");
|
|
187
|
+
})
|
|
188
|
+
);
|
|
181
189
|
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
182
|
-
fetchMock.mockReject(new Error("BAD REQUEST"));
|
|
183
190
|
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
191
|
+
await flushPromises();
|
|
184
192
|
expect(std.debug).toMatchInlineSnapshot(`
|
|
185
193
|
"Metrics dispatcher: Posting data {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}
|
|
186
|
-
Metrics dispatcher: Failed to send request: BAD REQUEST"
|
|
194
|
+
Metrics dispatcher: Failed to send request: request to https://sparrow.cloudflare.com/api/v1/event failed, reason: BAD REQUEST"
|
|
187
195
|
`);
|
|
188
196
|
expect(std.out).toMatchInlineSnapshot(`""`);
|
|
189
197
|
expect(std.warn).toMatchInlineSnapshot(`""`);
|
|
@@ -192,9 +200,11 @@ describe("metrics", () => {
|
|
|
192
200
|
|
|
193
201
|
it("should write a warning log if no source key has been provided", async () => {
|
|
194
202
|
global.SPARROW_SOURCE_KEY = undefined;
|
|
203
|
+
const requests = mockMetricRequest({}, {}, "event");
|
|
195
204
|
const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
|
|
196
205
|
await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
|
|
197
|
-
|
|
206
|
+
|
|
207
|
+
expect(requests.count).toBe(0);
|
|
198
208
|
expect(std.debug).toMatchInlineSnapshot(
|
|
199
209
|
`"Metrics dispatcher: Source Key not provided. Be sure to initialize before sending events. { type: 'event', name: 'some-event', properties: { a: 1, b: 2 } }"`
|
|
200
210
|
);
|
|
@@ -302,7 +312,7 @@ describe("metrics", () => {
|
|
|
302
312
|
});
|
|
303
313
|
|
|
304
314
|
it("should accept and store permission granting to send metrics if the user agrees", async () => {
|
|
305
|
-
|
|
315
|
+
mockConfirm({
|
|
306
316
|
text: "Would you like to help improve Wrangler by sending usage metrics to Cloudflare?",
|
|
307
317
|
result: true,
|
|
308
318
|
});
|
|
@@ -314,14 +324,13 @@ describe("metrics", () => {
|
|
|
314
324
|
).toMatchObject({
|
|
315
325
|
enabled: true,
|
|
316
326
|
});
|
|
317
|
-
checkConfirmations();
|
|
318
327
|
expect((await readMetricsConfig()).permission).toMatchObject({
|
|
319
328
|
enabled: true,
|
|
320
329
|
});
|
|
321
330
|
});
|
|
322
331
|
|
|
323
332
|
it("should accept and store permission declining to send metrics if the user declines", async () => {
|
|
324
|
-
|
|
333
|
+
mockConfirm({
|
|
325
334
|
text: "Would you like to help improve Wrangler by sending usage metrics to Cloudflare?",
|
|
326
335
|
result: false,
|
|
327
336
|
});
|
|
@@ -333,14 +342,13 @@ describe("metrics", () => {
|
|
|
333
342
|
).toMatchObject({
|
|
334
343
|
enabled: false,
|
|
335
344
|
});
|
|
336
|
-
checkConfirmations();
|
|
337
345
|
expect((await readMetricsConfig()).permission).toMatchObject({
|
|
338
346
|
enabled: false,
|
|
339
347
|
});
|
|
340
348
|
});
|
|
341
349
|
|
|
342
350
|
it("should ignore the config if the permission date is older than the current metrics date", async () => {
|
|
343
|
-
|
|
351
|
+
mockConfirm({
|
|
344
352
|
text: "Would you like to help improve Wrangler by sending usage metrics to Cloudflare?",
|
|
345
353
|
result: false,
|
|
346
354
|
});
|
|
@@ -356,7 +364,6 @@ describe("metrics", () => {
|
|
|
356
364
|
).toMatchObject({
|
|
357
365
|
enabled: false,
|
|
358
366
|
});
|
|
359
|
-
checkConfirmations();
|
|
360
367
|
const { permission } = await readMetricsConfig();
|
|
361
368
|
expect(permission?.enabled).toBe(false);
|
|
362
369
|
// The date should be updated to today's date
|
|
@@ -364,7 +371,7 @@ describe("metrics", () => {
|
|
|
364
371
|
|
|
365
372
|
expect(std.out).toMatchInlineSnapshot(`
|
|
366
373
|
"Usage metrics tracking has changed since you last granted permission.
|
|
367
|
-
Your choice has been saved in the following file:
|
|
374
|
+
Your choice has been saved in the following file: test-xdg-config/metrics.json.
|
|
368
375
|
|
|
369
376
|
You can override the user level setting for a project in \`wrangler.toml\`:
|
|
370
377
|
|
|
@@ -418,6 +425,8 @@ describe("metrics", () => {
|
|
|
418
425
|
sendMetrics: true,
|
|
419
426
|
offline: false,
|
|
420
427
|
});
|
|
428
|
+
await flushPromises();
|
|
429
|
+
|
|
421
430
|
expect(userId).toEqual("MOCK_USER_ID");
|
|
422
431
|
expect(userRequests.count).toBe(1);
|
|
423
432
|
});
|
|
@@ -438,13 +447,47 @@ describe("metrics", () => {
|
|
|
438
447
|
function mockUserRequest() {
|
|
439
448
|
const requests = { count: 0 };
|
|
440
449
|
beforeEach(() => {
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
450
|
+
msw.use(
|
|
451
|
+
...mswSuccessOauthHandlers,
|
|
452
|
+
rest.get("*/user", (_, res, cxt) => {
|
|
453
|
+
requests.count++;
|
|
454
|
+
return res(
|
|
455
|
+
cxt.status(200),
|
|
456
|
+
cxt.json({
|
|
457
|
+
success: true,
|
|
458
|
+
errors: [],
|
|
459
|
+
messages: [],
|
|
460
|
+
result: { id: "MOCK_USER_ID" },
|
|
461
|
+
})
|
|
462
|
+
);
|
|
463
|
+
})
|
|
464
|
+
);
|
|
445
465
|
});
|
|
446
466
|
afterEach(() => {
|
|
447
467
|
requests.count = 0;
|
|
448
468
|
});
|
|
449
469
|
return requests;
|
|
450
470
|
}
|
|
471
|
+
|
|
472
|
+
function mockMetricRequest(
|
|
473
|
+
body: unknown,
|
|
474
|
+
header: unknown,
|
|
475
|
+
endpoint: "identify" | "event"
|
|
476
|
+
) {
|
|
477
|
+
const requests = { count: 0 };
|
|
478
|
+
msw.use(
|
|
479
|
+
rest.post(`*/${endpoint}`, async (req, res, cxt) => {
|
|
480
|
+
requests.count++;
|
|
481
|
+
expect(await req.json()).toEqual(body);
|
|
482
|
+
expect(req.headers).toContain(header);
|
|
483
|
+
return res.once(cxt.status(200), cxt.json({}));
|
|
484
|
+
})
|
|
485
|
+
);
|
|
486
|
+
|
|
487
|
+
return requests;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// Forces a tick to allow the non-awaited fetch promise to resolve.
|
|
491
|
+
function flushPromises(): Promise<void> {
|
|
492
|
+
return new Promise((resolve) => setTimeout(resolve, 0));
|
|
493
|
+
}
|
|
@@ -19,7 +19,7 @@ describe("run scheduled events with middleware", () => {
|
|
|
19
19
|
return new Response("Hello world!");
|
|
20
20
|
},
|
|
21
21
|
scheduled(controller, env, ctx) {
|
|
22
|
-
|
|
22
|
+
// Doing something scheduled in modules...
|
|
23
23
|
},
|
|
24
24
|
};
|
|
25
25
|
`;
|
|
@@ -27,11 +27,12 @@ describe("run scheduled events with middleware", () => {
|
|
|
27
27
|
});
|
|
28
28
|
|
|
29
29
|
it("should not intercept when middleware is not enabled", async () => {
|
|
30
|
-
const worker = await unstable_dev(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
const worker = await unstable_dev("index.js", {
|
|
31
|
+
experimental: {
|
|
32
|
+
disableExperimentalWarning: true,
|
|
33
|
+
disableDevRegistry: true,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
35
36
|
|
|
36
37
|
const resp = await worker.fetch("/__scheduled");
|
|
37
38
|
let text;
|
|
@@ -41,11 +42,13 @@ describe("run scheduled events with middleware", () => {
|
|
|
41
42
|
});
|
|
42
43
|
|
|
43
44
|
it("should intercept when middleware is enabled", async () => {
|
|
44
|
-
const worker = await unstable_dev(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
const worker = await unstable_dev("index.js", {
|
|
46
|
+
experimental: {
|
|
47
|
+
disableExperimentalWarning: true,
|
|
48
|
+
disableDevRegistry: true,
|
|
49
|
+
testScheduled: true,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
49
52
|
|
|
50
53
|
const resp = await worker.fetch("/__scheduled");
|
|
51
54
|
let text;
|
|
@@ -55,11 +58,13 @@ describe("run scheduled events with middleware", () => {
|
|
|
55
58
|
});
|
|
56
59
|
|
|
57
60
|
it("should not trigger scheduled event on wrong route", async () => {
|
|
58
|
-
const worker = await unstable_dev(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
const worker = await unstable_dev("index.js", {
|
|
62
|
+
experimental: {
|
|
63
|
+
disableExperimentalWarning: true,
|
|
64
|
+
disableDevRegistry: true,
|
|
65
|
+
testScheduled: true,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
63
68
|
|
|
64
69
|
const resp = await worker.fetch("/test");
|
|
65
70
|
let text;
|
|
@@ -75,7 +80,7 @@ describe("run scheduled events with middleware", () => {
|
|
|
75
80
|
beforeEach(() => {
|
|
76
81
|
const scriptContent = `
|
|
77
82
|
addEventListener("scheduled", (event) => {
|
|
78
|
-
|
|
83
|
+
// Doing something scheduled in service worker...
|
|
79
84
|
});
|
|
80
85
|
|
|
81
86
|
addEventListener("fetch", (event) => {
|
|
@@ -91,11 +96,12 @@ describe("run scheduled events with middleware", () => {
|
|
|
91
96
|
});
|
|
92
97
|
|
|
93
98
|
it("should not intercept when middleware is not enabled", async () => {
|
|
94
|
-
const worker = await unstable_dev(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
+
const worker = await unstable_dev("index.js", {
|
|
100
|
+
experimental: {
|
|
101
|
+
disableExperimentalWarning: true,
|
|
102
|
+
disableDevRegistry: true,
|
|
103
|
+
},
|
|
104
|
+
});
|
|
99
105
|
|
|
100
106
|
const resp = await worker.fetch("/__scheduled");
|
|
101
107
|
let text;
|
|
@@ -105,11 +111,13 @@ describe("run scheduled events with middleware", () => {
|
|
|
105
111
|
});
|
|
106
112
|
|
|
107
113
|
it("should intercept when middleware is enabled", async () => {
|
|
108
|
-
const worker = await unstable_dev(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
const worker = await unstable_dev("index.js", {
|
|
115
|
+
experimental: {
|
|
116
|
+
disableExperimentalWarning: true,
|
|
117
|
+
disableDevRegistry: true,
|
|
118
|
+
testScheduled: true,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
113
121
|
|
|
114
122
|
const resp = await worker.fetch("/__scheduled");
|
|
115
123
|
let text;
|
|
@@ -119,11 +127,13 @@ describe("run scheduled events with middleware", () => {
|
|
|
119
127
|
});
|
|
120
128
|
|
|
121
129
|
it("should not trigger scheduled event on wrong route", async () => {
|
|
122
|
-
const worker = await unstable_dev(
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
130
|
+
const worker = await unstable_dev("index.js", {
|
|
131
|
+
experimental: {
|
|
132
|
+
disableExperimentalWarning: true,
|
|
133
|
+
disableDevRegistry: true,
|
|
134
|
+
testScheduled: true,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
127
137
|
|
|
128
138
|
const resp = await worker.fetch("/test");
|
|
129
139
|
let text;
|