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.
Files changed (237) hide show
  1. package/README.md +3 -3
  2. package/bin/wrangler.js +30 -10
  3. package/miniflare-dist/index.mjs +126 -74
  4. package/package.json +27 -19
  5. package/src/__tests__/api-dev.test.ts +65 -36
  6. package/src/__tests__/api-devregistry.test.ts +121 -0
  7. package/src/__tests__/api.test.ts +27 -5
  8. package/src/__tests__/configuration.test.ts +567 -86
  9. package/src/__tests__/d1/d1.test.ts +82 -0
  10. package/src/__tests__/d1/execute.test.ts +66 -0
  11. package/src/__tests__/d1/migrate.test.ts +157 -0
  12. package/src/__tests__/d1/splitter.test.ts +255 -0
  13. package/src/__tests__/delete.test.ts +91 -49
  14. package/src/__tests__/deployments.test.ts +330 -56
  15. package/src/__tests__/dev.test.tsx +198 -90
  16. package/src/__tests__/generate.test.ts +12 -10
  17. package/src/__tests__/guess-worker-format.test.ts +35 -0
  18. package/src/__tests__/helpers/end-event-loop.ts +6 -0
  19. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  20. package/src/__tests__/helpers/mock-console.ts +6 -0
  21. package/src/__tests__/helpers/mock-dialogs.ts +71 -85
  22. package/src/__tests__/helpers/mock-get-pages-upload-token.ts +25 -0
  23. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -5
  24. package/src/__tests__/helpers/mock-known-routes.ts +7 -2
  25. package/src/__tests__/helpers/mock-kv.ts +29 -16
  26. package/src/__tests__/helpers/mock-oauth-flow.ts +103 -92
  27. package/src/__tests__/helpers/mock-process.ts +8 -13
  28. package/src/__tests__/helpers/mock-set-timeout.ts +16 -0
  29. package/src/__tests__/helpers/msw/blob-worker.cjs +19 -0
  30. package/src/__tests__/helpers/msw/handlers/deployments.ts +128 -27
  31. package/src/__tests__/helpers/msw/handlers/namespaces.ts +18 -41
  32. package/src/__tests__/helpers/msw/handlers/oauth.ts +13 -18
  33. package/src/__tests__/helpers/msw/handlers/r2.ts +14 -34
  34. package/src/__tests__/helpers/msw/handlers/script.ts +9 -28
  35. package/src/__tests__/helpers/msw/handlers/user.ts +13 -24
  36. package/src/__tests__/helpers/msw/handlers/zones.ts +6 -8
  37. package/src/__tests__/helpers/msw/index.ts +32 -1
  38. package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
  39. package/src/__tests__/helpers/string-dynamic-values-matcher.ts +28 -0
  40. package/src/__tests__/helpers/worker-scripts/parent-worker.js +4 -1
  41. package/src/__tests__/index.test.ts +90 -72
  42. package/src/__tests__/init.test.ts +927 -631
  43. package/src/__tests__/jest.setup.ts +19 -42
  44. package/src/__tests__/kv.test.ts +355 -231
  45. package/src/__tests__/logger.test.ts +68 -2
  46. package/src/__tests__/logout.test.ts +47 -0
  47. package/src/__tests__/metrics.test.ts +94 -51
  48. package/src/__tests__/middleware.scheduled.test.ts +42 -32
  49. package/src/__tests__/middleware.test.ts +212 -122
  50. package/src/__tests__/mtls-certificates.test.ts +588 -0
  51. package/src/__tests__/pages/deployment-list.test.ts +80 -0
  52. package/src/__tests__/pages/functions-build.test.ts +452 -0
  53. package/src/__tests__/pages/pages.test.ts +81 -0
  54. package/src/__tests__/pages/project-create.test.ts +63 -0
  55. package/src/__tests__/pages/project-list.test.ts +110 -0
  56. package/src/__tests__/pages/project-upload.test.ts +500 -0
  57. package/src/__tests__/pages/publish.test.ts +2864 -0
  58. package/src/__tests__/pages-deployment-tail.test.ts +955 -0
  59. package/src/__tests__/parse.test.ts +106 -0
  60. package/src/__tests__/publish.test.ts +1615 -852
  61. package/src/__tests__/pubsub.test.ts +226 -100
  62. package/src/__tests__/queues.test.ts +238 -77
  63. package/src/__tests__/r2.test.ts +55 -57
  64. package/src/__tests__/secret.test.ts +179 -130
  65. package/src/__tests__/tail.test.ts +267 -109
  66. package/src/__tests__/test-old-node-version.js +3 -3
  67. package/src/__tests__/traverse-module-graph.test.ts +220 -0
  68. package/src/__tests__/tsconfig-sanity.ts +12 -0
  69. package/src/__tests__/tsconfig.json +8 -0
  70. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  71. package/src/__tests__/type-generation.test.ts +43 -26
  72. package/src/__tests__/user.test.ts +35 -72
  73. package/src/__tests__/whoami.test.tsx +8 -114
  74. package/src/__tests__/worker-namespace.test.ts +83 -69
  75. package/src/api/dev.ts +168 -60
  76. package/src/api/index.ts +10 -1
  77. package/src/api/mtls-certificate.ts +148 -0
  78. package/src/api/pages/create-worker-bundle-contents.ts +76 -0
  79. package/src/api/pages/index.ts +5 -0
  80. package/src/api/pages/publish.tsx +355 -0
  81. package/src/bundle.ts +263 -140
  82. package/src/cfetch/index.ts +0 -2
  83. package/src/cfetch/internal.ts +16 -21
  84. package/src/cli.ts +4 -4
  85. package/src/config/config.ts +14 -7
  86. package/src/config/environment.ts +79 -24
  87. package/src/config/index.ts +99 -38
  88. package/src/config/validation-helpers.ts +1 -1
  89. package/src/config/validation.ts +248 -19
  90. package/src/create-worker-preview.ts +19 -8
  91. package/src/create-worker-upload-form.ts +60 -22
  92. package/src/d1/backups.tsx +43 -42
  93. package/src/d1/constants.ts +2 -0
  94. package/src/d1/create.tsx +44 -30
  95. package/src/d1/{delete.tsx → delete.ts} +11 -14
  96. package/src/d1/execute.tsx +209 -151
  97. package/src/d1/index.ts +31 -7
  98. package/src/d1/list.tsx +22 -10
  99. package/src/d1/migrations/apply.tsx +212 -0
  100. package/src/d1/migrations/create.tsx +79 -0
  101. package/src/d1/migrations/helpers.ts +172 -0
  102. package/src/d1/migrations/index.ts +3 -0
  103. package/src/d1/migrations/list.tsx +95 -0
  104. package/src/d1/migrations/options.ts +23 -0
  105. package/src/d1/options.ts +12 -2
  106. package/src/d1/splitter.ts +161 -0
  107. package/src/d1/{types.tsx → types.ts} +11 -0
  108. package/src/d1/utils.ts +12 -2
  109. package/src/delete.ts +8 -16
  110. package/src/deployments.ts +340 -46
  111. package/src/deprecated/index.ts +8 -302
  112. package/src/dev/dev.tsx +57 -44
  113. package/src/dev/local.tsx +294 -91
  114. package/src/dev/remote.tsx +32 -3
  115. package/src/dev/start-server.ts +89 -68
  116. package/src/dev/use-esbuild.ts +17 -18
  117. package/src/dev/validate-dev-props.ts +9 -0
  118. package/src/{dev-registry.tsx → dev-registry.ts} +2 -1
  119. package/src/dev.tsx +178 -118
  120. package/src/dialogs.ts +136 -0
  121. package/src/dispatch-namespace.ts +21 -17
  122. package/src/docs/index.ts +97 -0
  123. package/src/entry.ts +19 -11
  124. package/src/environment-variables/factory.ts +88 -0
  125. package/src/environment-variables/misc-variables.ts +30 -0
  126. package/src/generate/index.ts +298 -0
  127. package/src/git-client.ts +15 -4
  128. package/src/{index.tsx → index.ts} +137 -63
  129. package/src/init.ts +249 -187
  130. package/src/inspect.ts +16 -1
  131. package/src/jest.d.ts +4 -0
  132. package/src/kv/index.ts +15 -17
  133. package/src/logger.ts +32 -5
  134. package/src/metrics/metrics-config.ts +3 -3
  135. package/src/metrics/send-event.ts +6 -1
  136. package/src/miniflare-cli/assets.ts +64 -28
  137. package/src/miniflare-cli/index.ts +4 -7
  138. package/src/miniflare-cli/tsconfig.json +9 -0
  139. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  140. package/src/miniflare-cli/types.ts +11 -0
  141. package/src/module-collection.ts +91 -25
  142. package/src/mtls-certificate/cli.ts +155 -0
  143. package/src/pages/build.ts +410 -0
  144. package/src/pages/buildFunctions.ts +140 -0
  145. package/src/pages/deployment-tails.ts +281 -0
  146. package/src/pages/deployments.tsx +11 -33
  147. package/src/pages/{dev.tsx → dev.ts} +147 -124
  148. package/src/pages/errors.ts +1 -0
  149. package/src/pages/functions/buildPlugin.ts +72 -69
  150. package/src/pages/functions/buildWorker.ts +249 -114
  151. package/src/pages/functions/tsconfig.json +8 -0
  152. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  153. package/src/pages/{functions.tsx → functions.ts} +8 -4
  154. package/src/pages/{index.tsx → index.ts} +11 -3
  155. package/src/pages/projects.tsx +12 -22
  156. package/src/pages/prompt-select-project.tsx +31 -0
  157. package/src/pages/publish.tsx +45 -214
  158. package/src/pages/types.ts +6 -9
  159. package/src/pages/upload.tsx +58 -14
  160. package/src/pages/utils.ts +14 -3
  161. package/src/parse.ts +23 -1
  162. package/src/paths.ts +1 -1
  163. package/src/proxy.ts +5 -0
  164. package/src/publish/index.ts +20 -16
  165. package/src/publish/publish.ts +72 -47
  166. package/src/pubsub/{pubsub-commands.tsx → pubsub-commands.ts} +19 -20
  167. package/src/queues/cli/commands/consumer/add.ts +24 -24
  168. package/src/queues/cli/commands/consumer/index.ts +3 -6
  169. package/src/queues/cli/commands/consumer/remove.ts +11 -18
  170. package/src/queues/cli/commands/create.ts +8 -8
  171. package/src/queues/cli/commands/delete.ts +8 -8
  172. package/src/queues/cli/commands/index.ts +6 -4
  173. package/src/queues/cli/commands/list.ts +8 -8
  174. package/src/queues/client.ts +1 -0
  175. package/src/queues/utils.ts +18 -0
  176. package/src/r2/constants.ts +4 -0
  177. package/src/r2/helpers.ts +1 -0
  178. package/src/r2/index.ts +40 -28
  179. package/src/secret/index.ts +14 -17
  180. package/src/{sites.tsx → sites.ts} +1 -1
  181. package/src/tail/createTail.ts +94 -3
  182. package/src/tail/filters.ts +1 -1
  183. package/src/tail/index.ts +8 -11
  184. package/src/tail/printing.ts +15 -0
  185. package/src/traverse-module-graph.ts +53 -0
  186. package/src/tsconfig-sanity.ts +16 -0
  187. package/src/type-generation.ts +79 -57
  188. package/src/user/access.ts +0 -1
  189. package/src/user/auth-variables.ts +113 -0
  190. package/src/user/choose-account.tsx +1 -31
  191. package/src/user/index.ts +0 -1
  192. package/src/user/{user.tsx → user.ts} +123 -82
  193. package/src/utils/render.ts +93 -0
  194. package/src/{whoami.tsx → whoami.ts} +37 -71
  195. package/src/worker.ts +35 -3
  196. package/src/yargs-types.ts +22 -5
  197. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  198. package/templates/__tests__/tsconfig.json +8 -0
  199. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  200. package/templates/checked-fetch.js +9 -3
  201. package/templates/d1-beta-facade.js +95 -25
  202. package/templates/facade.d.ts +14 -0
  203. package/templates/first-party-worker-module-facade.ts +4 -3
  204. package/templates/format-dev-errors.ts +8 -6
  205. package/templates/gitignore +1 -0
  206. package/templates/init-tests/test-jest-new-worker.js +3 -5
  207. package/templates/init-tests/test-vitest-new-worker.js +3 -5
  208. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  209. package/templates/middleware/loader-modules.ts +2 -2
  210. package/templates/middleware/loader-sw.ts +51 -31
  211. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  212. package/templates/new-worker.ts +3 -0
  213. package/templates/pages-dev-pipeline.ts +4 -1
  214. package/templates/pages-shim.ts +4 -1
  215. package/templates/pages-template-plugin.ts +19 -10
  216. package/templates/serve-static-assets.ts +17 -14
  217. package/templates/service-bindings-module-facade.js +1 -0
  218. package/templates/tsconfig-sanity.ts +11 -0
  219. package/templates/tsconfig.init.json +105 -0
  220. package/templates/tsconfig.json +5 -103
  221. package/templates/tsconfig.tsbuildinfo +1 -0
  222. package/wrangler-dist/cli.d.ts +826 -77
  223. package/wrangler-dist/cli.js +130734 -140838
  224. package/wrangler-dist/wasm-sync.wasm +0 -0
  225. package/src/__tests__/api-devregistry.test.js +0 -57
  226. package/src/__tests__/d1.test.ts +0 -72
  227. package/src/__tests__/dialogs.test.tsx +0 -40
  228. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  229. package/src/__tests__/pages.test.ts +0 -2223
  230. package/src/dialogs.tsx +0 -163
  231. package/src/environment-variables.ts +0 -50
  232. package/src/pages/build.tsx +0 -238
  233. package/src/user/env-vars.ts +0 -46
  234. package/templates/experimental-local-cache-stubs.js +0 -27
  235. /package/src/{bundle-reporter.tsx → bundle-reporter.ts} +0 -0
  236. /package/src/dev/{get-local-persistence-path.tsx → get-local-persistence-path.ts} +0 -0
  237. /package/src/pages/{hash.tsx → hash.ts} +0 -0
@@ -1,10 +1,11 @@
1
- import { logger } from "../logger";
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.loggerLevel = "error";
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
+ "▲ [WARNING] This is a warn message
166
+
167
+ "
168
+ `);
169
+ expect(std.err).toMatchInlineSnapshot(`
170
+ "X [ERROR] This is a error message
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
+ ▲ [WARNING] This is a warn message
197
+
198
+ "
199
+ `);
200
+ expect(std.err).toMatchInlineSnapshot(`
201
+ "X [ERROR] This is a error message
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 fetchMock from "jest-fetch-mock";
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 dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
60
- fetchMock.mockResponse("");
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
- expect(headers).toEqual(
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
- expect(fetchMock).toHaveBeenCalledTimes(0);
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 dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
135
- fetchMock.mockResponse("");
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
- expect(fetchMock).toHaveBeenCalledTimes(0);
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
- expect(fetchMock).toHaveBeenCalledTimes(0);
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
- const checkConfirmations = mockConfirm({
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
- const checkConfirmations = mockConfirm({
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
- const checkConfirmations = mockConfirm({
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: home/.wrangler/config/metrics.json.
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
- setMockResponse("/user", () => {
442
- requests.count++;
443
- return { id: "MOCK_USER_ID" };
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
- console.log("Doing something scheduled in modules...");
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
- "index.js",
32
- {},
33
- { disableExperimentalWarning: true }
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
- "index.js",
46
- { testScheduled: true },
47
- { disableExperimentalWarning: true }
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
- "index.js",
60
- { testScheduled: true },
61
- { disableExperimentalWarning: true }
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
- console.log("Doing something scheduled in service worker...");
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
- "index.js",
96
- {},
97
- { disableExperimentalWarning: true }
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
- "index.js",
110
- { testScheduled: true },
111
- { disableExperimentalWarning: true }
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
- "index.js",
124
- { testScheduled: true },
125
- { disableExperimentalWarning: true }
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;