wrangler 0.0.0-e178d6fb → 0.0.0-e1c2f5b9

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 (239) hide show
  1. package/README.md +16 -2
  2. package/bin/wrangler.js +31 -11
  3. package/miniflare-dist/index.mjs +1340 -330
  4. package/package.json +40 -13
  5. package/src/__tests__/access.test.ts +25 -0
  6. package/src/__tests__/api-dev.test.ts +238 -0
  7. package/src/__tests__/api-devregistry.test.js +64 -0
  8. package/src/__tests__/api.test.ts +80 -0
  9. package/src/__tests__/configuration.test.ts +683 -470
  10. package/src/__tests__/d1.test.ts +123 -0
  11. package/src/__tests__/delete.test.ts +263 -0
  12. package/src/__tests__/deployments.test.ts +105 -0
  13. package/src/__tests__/dev.test.tsx +453 -70
  14. package/src/__tests__/dialogs.test.tsx +40 -0
  15. package/src/__tests__/generate.test.ts +235 -0
  16. package/src/__tests__/get-host-from-url.test.ts +16 -0
  17. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  18. package/src/__tests__/helpers/mock-cfetch.ts +92 -26
  19. package/src/__tests__/helpers/mock-console.ts +11 -2
  20. package/src/__tests__/helpers/mock-dialogs.ts +1 -1
  21. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
  22. package/src/__tests__/helpers/mock-known-routes.ts +7 -0
  23. package/src/__tests__/helpers/mock-kv.ts +1 -1
  24. package/src/__tests__/helpers/mock-oauth-flow.ts +74 -53
  25. package/src/__tests__/helpers/mock-process.ts +8 -13
  26. package/src/__tests__/helpers/msw/handlers/access.ts +13 -0
  27. package/src/__tests__/helpers/msw/handlers/deployments.ts +59 -0
  28. package/src/__tests__/helpers/msw/handlers/namespaces.ts +104 -0
  29. package/src/__tests__/helpers/msw/handlers/oauth.ts +31 -0
  30. package/src/__tests__/helpers/msw/handlers/r2.ts +80 -0
  31. package/src/__tests__/helpers/msw/handlers/script.ts +75 -0
  32. package/src/__tests__/helpers/msw/handlers/user.ts +63 -0
  33. package/src/__tests__/helpers/msw/handlers/zones.ts +22 -0
  34. package/src/__tests__/helpers/msw/index.ts +21 -0
  35. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
  36. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
  37. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
  38. package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
  39. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  40. package/src/__tests__/index.test.ts +103 -97
  41. package/src/__tests__/init.test.ts +1484 -382
  42. package/src/__tests__/jest.setup.ts +88 -5
  43. package/src/__tests__/kv.test.ts +655 -540
  44. package/src/__tests__/logout.test.ts +47 -0
  45. package/src/__tests__/metrics.test.ts +95 -45
  46. package/src/__tests__/middleware.scheduled.test.ts +145 -0
  47. package/src/__tests__/middleware.test.ts +750 -0
  48. package/src/__tests__/pages-deployment-tail.test.ts +884 -0
  49. package/src/__tests__/pages.test.ts +1301 -119
  50. package/src/__tests__/paths.test.ts +39 -0
  51. package/src/__tests__/publish.test.ts +2266 -1180
  52. package/src/__tests__/pubsub.test.ts +211 -88
  53. package/src/__tests__/queues.test.ts +522 -0
  54. package/src/__tests__/r2.test.ts +363 -203
  55. package/src/__tests__/secret.test.ts +261 -59
  56. package/src/__tests__/tail.test.ts +352 -151
  57. package/src/__tests__/test-old-node-version.js +3 -3
  58. package/src/__tests__/tsconfig-sanity.ts +12 -0
  59. package/src/__tests__/tsconfig.json +8 -0
  60. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  61. package/src/__tests__/type-generation.test.ts +233 -0
  62. package/src/__tests__/user.test.ts +59 -73
  63. package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
  64. package/src/__tests__/validate-dev-props.test.ts +56 -0
  65. package/src/__tests__/whoami.test.tsx +114 -66
  66. package/src/__tests__/worker-namespace.test.ts +154 -155
  67. package/src/api/dev.ts +170 -38
  68. package/src/api/index.ts +1 -0
  69. package/src/bundle-reporter.tsx +41 -2
  70. package/src/bundle.ts +668 -81
  71. package/src/cfetch/index.ts +40 -3
  72. package/src/cfetch/internal.ts +144 -32
  73. package/src/cli.ts +4 -3
  74. package/src/config/config.ts +27 -3
  75. package/src/config/environment.ts +131 -7
  76. package/src/config/index.ts +128 -8
  77. package/src/config/validation-helpers.ts +19 -6
  78. package/src/config/validation.ts +411 -14
  79. package/src/config-cache.ts +3 -2
  80. package/src/create-worker-preview.ts +31 -6
  81. package/src/create-worker-upload-form.ts +84 -22
  82. package/src/d1/backups.tsx +223 -0
  83. package/src/d1/constants.ts +2 -0
  84. package/src/d1/create.tsx +63 -0
  85. package/src/d1/delete.tsx +56 -0
  86. package/src/d1/execute.tsx +352 -0
  87. package/src/d1/formatTimeAgo.ts +14 -0
  88. package/src/d1/index.ts +101 -0
  89. package/src/d1/list.tsx +48 -0
  90. package/src/d1/migrations/apply.tsx +196 -0
  91. package/src/d1/migrations/create.tsx +77 -0
  92. package/src/d1/migrations/helpers.ts +147 -0
  93. package/src/d1/migrations/index.tsx +3 -0
  94. package/src/d1/migrations/list.tsx +79 -0
  95. package/src/d1/migrations/options.ts +18 -0
  96. package/src/d1/options.ts +22 -0
  97. package/src/d1/types.tsx +24 -0
  98. package/src/d1/utils.ts +48 -0
  99. package/src/delete.ts +108 -0
  100. package/src/deployments.ts +83 -0
  101. package/src/deprecated/index.ts +145 -0
  102. package/src/dev/dev-vars.ts +11 -8
  103. package/src/dev/dev.tsx +220 -58
  104. package/src/dev/get-local-persistence-path.tsx +31 -0
  105. package/src/dev/local.tsx +740 -181
  106. package/src/dev/remote.tsx +340 -123
  107. package/src/dev/start-server.ts +543 -0
  108. package/src/dev/use-esbuild.ts +61 -7
  109. package/src/dev/validate-dev-props.ts +31 -0
  110. package/src/dev-registry.tsx +201 -0
  111. package/src/dev.tsx +614 -258
  112. package/src/dialogs.tsx +41 -8
  113. package/src/{worker-namespace.ts → dispatch-namespace.ts} +23 -22
  114. package/src/docs/index.ts +97 -0
  115. package/src/entry.ts +3 -2
  116. package/src/environment-variables/factory.ts +88 -0
  117. package/src/environment-variables/misc-variables.ts +30 -0
  118. package/src/generate/index.ts +300 -0
  119. package/src/git-client.ts +100 -7
  120. package/src/index.tsx +249 -1560
  121. package/src/init.ts +626 -150
  122. package/src/inspect.ts +137 -32
  123. package/src/{metrics/is-ci.ts → is-ci.ts} +0 -0
  124. package/src/is-interactive.ts +4 -0
  125. package/src/jest.d.ts +4 -0
  126. package/src/{kv.ts → kv/helpers.ts} +3 -3
  127. package/src/kv/index.ts +596 -0
  128. package/src/logger.ts +27 -8
  129. package/src/metrics/index.ts +1 -0
  130. package/src/metrics/metrics-config.ts +4 -4
  131. package/src/metrics/metrics-dispatcher.ts +1 -0
  132. package/src/metrics/metrics-usage-headers.ts +24 -0
  133. package/src/metrics/send-event.ts +13 -8
  134. package/src/miniflare-cli/assets.ts +172 -465
  135. package/src/miniflare-cli/index.ts +149 -24
  136. package/src/miniflare-cli/tsconfig.json +9 -0
  137. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  138. package/src/miniflare-cli/types.ts +11 -0
  139. package/src/module-collection.ts +12 -3
  140. package/src/pages/build.tsx +108 -42
  141. package/src/pages/constants.ts +11 -0
  142. package/src/pages/deployment-tails.tsx +284 -0
  143. package/src/pages/deployments.tsx +9 -31
  144. package/src/pages/dev.tsx +417 -108
  145. package/src/pages/errors.ts +66 -0
  146. package/src/pages/functions/buildPlugin.ts +86 -84
  147. package/src/pages/functions/buildWorker.ts +121 -106
  148. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  149. package/src/pages/functions/routes-consolidation.ts +73 -0
  150. package/src/pages/functions/routes-transformation.test.ts +282 -0
  151. package/src/pages/functions/routes-transformation.ts +115 -0
  152. package/src/pages/functions/routes-validation.test.ts +403 -0
  153. package/src/pages/functions/routes-validation.ts +202 -0
  154. package/src/pages/functions/tsconfig.json +8 -0
  155. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  156. package/src/pages/functions.tsx +82 -0
  157. package/src/pages/hash.tsx +13 -0
  158. package/src/pages/index.tsx +73 -55
  159. package/src/pages/projects.tsx +9 -3
  160. package/src/pages/prompt-select-project.tsx +31 -0
  161. package/src/pages/publish.tsx +183 -60
  162. package/src/pages/types.ts +1 -0
  163. package/src/pages/upload.tsx +107 -56
  164. package/src/pages/utils.ts +13 -2
  165. package/src/paths.ts +49 -4
  166. package/src/proxy.ts +375 -157
  167. package/src/publish/index.ts +270 -0
  168. package/src/{publish.ts → publish/publish.ts} +431 -188
  169. package/src/pubsub/pubsub-commands.tsx +4 -3
  170. package/src/queues/cli/commands/consumer/add.ts +71 -0
  171. package/src/queues/cli/commands/consumer/index.ts +22 -0
  172. package/src/queues/cli/commands/consumer/remove.ts +38 -0
  173. package/src/queues/cli/commands/create.ts +25 -0
  174. package/src/queues/cli/commands/delete.ts +26 -0
  175. package/src/queues/cli/commands/index.ts +36 -0
  176. package/src/queues/cli/commands/list.ts +25 -0
  177. package/src/queues/client.ts +135 -0
  178. package/src/queues/utils.ts +18 -0
  179. package/src/r2/constants.ts +4 -0
  180. package/src/r2/helpers.ts +131 -0
  181. package/src/r2/index.ts +289 -0
  182. package/src/routes.ts +140 -0
  183. package/src/secret/index.ts +379 -0
  184. package/src/sites.tsx +3 -3
  185. package/src/tail/createTail.ts +379 -0
  186. package/src/tail/filters.ts +4 -6
  187. package/src/tail/index.ts +199 -284
  188. package/src/tail/printing.ts +43 -3
  189. package/src/tsconfig-sanity.ts +16 -0
  190. package/src/type-generation.ts +181 -0
  191. package/src/user/access.ts +68 -0
  192. package/src/user/auth-variables.ts +113 -0
  193. package/src/user/choose-account.tsx +1 -1
  194. package/src/user/index.ts +0 -1
  195. package/src/user/user.tsx +116 -49
  196. package/src/utils/collectKeyValues.ts +14 -0
  197. package/src/whoami.tsx +80 -2
  198. package/src/worker.ts +69 -9
  199. package/src/yargs-types.ts +24 -0
  200. package/src/zones.ts +124 -9
  201. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  202. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  203. package/templates/__tests__/tsconfig.json +8 -0
  204. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  205. package/templates/d1-beta-facade.js +205 -0
  206. package/templates/facade.d.ts +14 -0
  207. package/templates/first-party-worker-module-facade.ts +19 -0
  208. package/templates/format-dev-errors.ts +33 -0
  209. package/templates/init-tests/test-jest-new-worker.js +23 -0
  210. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  211. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  212. package/templates/middleware/common.ts +62 -0
  213. package/templates/middleware/loader-modules.ts +82 -0
  214. package/templates/middleware/loader-sw.ts +233 -0
  215. package/templates/middleware/middleware-miniflare3-json-error.ts +20 -0
  216. package/templates/middleware/middleware-pretty-error.ts +40 -0
  217. package/templates/middleware/middleware-scheduled.ts +15 -0
  218. package/templates/new-worker.js +1 -1
  219. package/templates/pages-dev-pipeline.ts +31 -0
  220. package/templates/pages-dev-util.ts +52 -0
  221. package/templates/pages-shim.ts +4 -1
  222. package/templates/pages-template-plugin.ts +21 -5
  223. package/templates/pages-template-worker.ts +37 -9
  224. package/templates/{static-asset-facade.js → serve-static-assets.ts} +23 -7
  225. package/templates/service-bindings-module-facade.js +54 -0
  226. package/templates/service-bindings-sw-facade.js +42 -0
  227. package/templates/tsconfig-sanity.ts +11 -0
  228. package/templates/tsconfig.init.json +106 -0
  229. package/templates/tsconfig.json +5 -102
  230. package/templates/tsconfig.tsbuildinfo +1 -0
  231. package/wrangler-dist/cli.d.ts +621 -42
  232. package/wrangler-dist/cli.js +144441 -102606
  233. package/src/environment-variables.ts +0 -35
  234. package/src/faye-websocket.d.ts +0 -6
  235. package/src/generate.ts +0 -33
  236. package/src/miniflare-cli/enum-keys.ts +0 -17
  237. package/src/preview.ts +0 -31
  238. package/src/r2.ts +0 -50
  239. package/src/user/env-vars.ts +0 -46
@@ -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,10 +1,10 @@
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
+ import { CI } from "../is-ci";
5
6
  import { logger } from "../logger";
6
7
  import { getMetricsDispatcher, getMetricsConfig } from "../metrics";
7
- import { CI } from "../metrics/is-ci";
8
8
  import {
9
9
  CURRENT_METRICS_DATE,
10
10
  readMetricsConfig,
@@ -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
16
  import { mockConfirm } 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 };
@@ -26,6 +26,9 @@ describe("metrics", () => {
26
26
  runInTempDir();
27
27
 
28
28
  beforeEach(() => {
29
+ // Tell jest to use the original version of the `getMetricsConfig()` function in these tests.
30
+ const mockMetricsConfig = jest.requireMock("../metrics/metrics-config");
31
+ mockMetricsConfig.useOriginal = true;
29
32
  global.SPARROW_SOURCE_KEY = "MOCK_KEY";
30
33
  logger.loggerLevel = "debug";
31
34
  // Create a node_modules directory to store config-cache files
@@ -33,8 +36,6 @@ describe("metrics", () => {
33
36
  });
34
37
  afterEach(() => {
35
38
  global.SPARROW_SOURCE_KEY = ORIGINAL_SPARROW_SOURCE_KEY;
36
- fetchMock.resetMocks();
37
- unsetAllMocks();
38
39
  purgeConfigCaches();
39
40
  });
40
41
 
@@ -53,28 +54,24 @@ describe("metrics", () => {
53
54
 
54
55
  describe("identify()", () => {
55
56
  it("should send a request to the default URL", async () => {
56
- const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
57
- fetchMock.mockResponse("");
58
- await dispatcher.identify({ a: 1, b: 2 });
59
- expect(fetchMock).toHaveBeenCalledTimes(1);
60
- const [url, { body, headers }] = fetchMock.mock.calls[0];
61
- expect(url).toEqual("https://sparrow.cloudflare.com/api/v1/identify");
62
- expect(JSON.parse(body)).toEqual(
63
- expect.objectContaining({
57
+ const request = mockMetricRequest(
58
+ {
64
59
  event: "identify",
65
60
  properties: {
66
61
  category: "Workers",
67
62
  wranglerVersion,
63
+ os: process.platform + ":" + process.arch,
68
64
  a: 1,
69
65
  b: 2,
70
66
  },
71
- })
72
- );
73
- expect(headers).toEqual(
74
- expect.objectContaining({
75
- "Sparrow-Source-Key": "MOCK_KEY",
76
- })
67
+ },
68
+ { "Sparrow-Source-Key": "MOCK_KEY" },
69
+ "identify"
77
70
  );
71
+ const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
72
+ await dispatcher.identify({ a: 1, b: 2 });
73
+
74
+ expect(request.count).toBe(1);
78
75
  expect(std.debug).toMatchInlineSnapshot(
79
76
  `"Metrics dispatcher: Posting data {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}"`
80
77
  );
@@ -84,12 +81,15 @@ describe("metrics", () => {
84
81
  });
85
82
 
86
83
  it("should write a debug log if the dispatcher is disabled", async () => {
84
+ const requests = mockMetricRequest({}, {}, "identify");
87
85
  const dispatcher = await getMetricsDispatcher({
88
86
  ...MOCK_DISPATCHER_OPTIONS,
89
87
  sendMetrics: false,
90
88
  });
91
89
  await dispatcher.identify({ a: 1, b: 2 });
92
- expect(fetchMock).toHaveBeenCalledTimes(0);
90
+ await flushPromises();
91
+
92
+ expect(requests.count).toBe(0);
93
93
  expect(std.debug).toMatchInlineSnapshot(
94
94
  `"Metrics dispatcher: Dispatching disabled - would have sent {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}."`
95
95
  );
@@ -99,12 +99,18 @@ describe("metrics", () => {
99
99
  });
100
100
 
101
101
  it("should write a debug log if the request fails", async () => {
102
+ msw.use(
103
+ rest.post("*/identify", async (req, res) => {
104
+ return res.networkError("BAD REQUEST");
105
+ })
106
+ );
107
+
102
108
  const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
103
- fetchMock.mockReject(new Error("BAD REQUEST"));
104
109
  await dispatcher.identify({ a: 1, b: 2 });
110
+ await flushPromises();
105
111
  expect(std.debug).toMatchInlineSnapshot(`
106
112
  "Metrics dispatcher: Posting data {\\"type\\":\\"identify\\",\\"name\\":\\"identify\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}
107
- Metrics dispatcher: Failed to send request: BAD REQUEST"
113
+ Metrics dispatcher: Failed to send request: request to https://sparrow.cloudflare.com/api/v1/identify failed, reason: BAD REQUEST"
108
114
  `);
109
115
  expect(std.out).toMatchInlineSnapshot(`""`);
110
116
  expect(std.warn).toMatchInlineSnapshot(`""`);
@@ -115,7 +121,6 @@ describe("metrics", () => {
115
121
  global.SPARROW_SOURCE_KEY = undefined;
116
122
  const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
117
123
  await dispatcher.identify({ a: 1, b: 2 });
118
- expect(fetchMock).toHaveBeenCalledTimes(0);
119
124
  expect(std.debug).toMatchInlineSnapshot(
120
125
  `"Metrics dispatcher: Source Key not provided. Be sure to initialize before sending events. { type: 'identify', name: 'identify', properties: { a: 1, b: 2 } }"`
121
126
  );
@@ -127,28 +132,26 @@ describe("metrics", () => {
127
132
 
128
133
  describe("sendEvent()", () => {
129
134
  it("should send a request to the default URL", async () => {
130
- const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
131
- fetchMock.mockResponse("");
132
- await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
133
- expect(fetchMock).toHaveBeenCalledTimes(1);
134
- const [url, { body, headers }] = fetchMock.mock.calls[0];
135
- expect(url).toEqual("https://sparrow.cloudflare.com/api/v1/event");
136
- expect(JSON.parse(body)).toEqual(
137
- expect.objectContaining({
135
+ const requests = mockMetricRequest(
136
+ {
138
137
  event: "some-event",
139
138
  properties: {
140
139
  category: "Workers",
141
140
  wranglerVersion,
141
+ os: process.platform + ":" + process.arch,
142
142
  a: 1,
143
143
  b: 2,
144
144
  },
145
- })
146
- );
147
- expect(headers).toEqual(
148
- expect.objectContaining({
145
+ },
146
+ {
149
147
  "Sparrow-Source-Key": "MOCK_KEY",
150
- })
148
+ },
149
+ "event"
151
150
  );
151
+ const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
152
+ await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
153
+
154
+ expect(requests.count).toBe(1);
152
155
  expect(std.debug).toMatchInlineSnapshot(
153
156
  `"Metrics dispatcher: Posting data {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}"`
154
157
  );
@@ -158,12 +161,16 @@ describe("metrics", () => {
158
161
  });
159
162
 
160
163
  it("should write a debug log if the dispatcher is disabled", async () => {
164
+ const requests = mockMetricRequest({}, {}, "event");
165
+
161
166
  const dispatcher = await getMetricsDispatcher({
162
167
  ...MOCK_DISPATCHER_OPTIONS,
163
168
  sendMetrics: false,
164
169
  });
165
170
  await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
166
- expect(fetchMock).toHaveBeenCalledTimes(0);
171
+ await flushPromises();
172
+
173
+ expect(requests.count).toBe(0);
167
174
  expect(std.debug).toMatchInlineSnapshot(
168
175
  `"Metrics dispatcher: Dispatching disabled - would have sent {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}."`
169
176
  );
@@ -173,12 +180,17 @@ describe("metrics", () => {
173
180
  });
174
181
 
175
182
  it("should write a debug log if the request fails", async () => {
183
+ msw.use(
184
+ rest.post("*/event", async (_, res) => {
185
+ return res.networkError("BAD REQUEST");
186
+ })
187
+ );
176
188
  const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
177
- fetchMock.mockReject(new Error("BAD REQUEST"));
178
189
  await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
190
+ await flushPromises();
179
191
  expect(std.debug).toMatchInlineSnapshot(`
180
192
  "Metrics dispatcher: Posting data {\\"type\\":\\"event\\",\\"name\\":\\"some-event\\",\\"properties\\":{\\"a\\":1,\\"b\\":2}}
181
- Metrics dispatcher: Failed to send request: BAD REQUEST"
193
+ Metrics dispatcher: Failed to send request: request to https://sparrow.cloudflare.com/api/v1/event failed, reason: BAD REQUEST"
182
194
  `);
183
195
  expect(std.out).toMatchInlineSnapshot(`""`);
184
196
  expect(std.warn).toMatchInlineSnapshot(`""`);
@@ -187,9 +199,11 @@ describe("metrics", () => {
187
199
 
188
200
  it("should write a warning log if no source key has been provided", async () => {
189
201
  global.SPARROW_SOURCE_KEY = undefined;
202
+ const requests = mockMetricRequest({}, {}, "event");
190
203
  const dispatcher = await getMetricsDispatcher(MOCK_DISPATCHER_OPTIONS);
191
204
  await dispatcher.sendEvent("some-event", { a: 1, b: 2 });
192
- expect(fetchMock).toHaveBeenCalledTimes(0);
205
+
206
+ expect(requests.count).toBe(0);
193
207
  expect(std.debug).toMatchInlineSnapshot(
194
208
  `"Metrics dispatcher: Source Key not provided. Be sure to initialize before sending events. { type: 'event', name: 'some-event', properties: { a: 1, b: 2 } }"`
195
209
  );
@@ -359,7 +373,7 @@ describe("metrics", () => {
359
373
 
360
374
  expect(std.out).toMatchInlineSnapshot(`
361
375
  "Usage metrics tracking has changed since you last granted permission.
362
- Your choice has been saved in the following file: home/.wrangler/config/metrics.json.
376
+ Your choice has been saved in the following file: test-xdg-config/metrics.json.
363
377
 
364
378
  You can override the user level setting for a project in \`wrangler.toml\`:
365
379
 
@@ -413,6 +427,8 @@ describe("metrics", () => {
413
427
  sendMetrics: true,
414
428
  offline: false,
415
429
  });
430
+ await flushPromises();
431
+
416
432
  expect(userId).toEqual("MOCK_USER_ID");
417
433
  expect(userRequests.count).toBe(1);
418
434
  });
@@ -433,13 +449,47 @@ describe("metrics", () => {
433
449
  function mockUserRequest() {
434
450
  const requests = { count: 0 };
435
451
  beforeEach(() => {
436
- setMockResponse("/user", () => {
437
- requests.count++;
438
- return { id: "MOCK_USER_ID" };
439
- });
452
+ msw.use(
453
+ ...mswSuccessOauthHandlers,
454
+ rest.get("*/user", (_, res, cxt) => {
455
+ requests.count++;
456
+ return res(
457
+ cxt.status(200),
458
+ cxt.json({
459
+ success: true,
460
+ errors: [],
461
+ messages: [],
462
+ result: { id: "MOCK_USER_ID" },
463
+ })
464
+ );
465
+ })
466
+ );
440
467
  });
441
468
  afterEach(() => {
442
469
  requests.count = 0;
443
470
  });
444
471
  return requests;
445
472
  }
473
+
474
+ function mockMetricRequest(
475
+ body: unknown,
476
+ header: unknown,
477
+ endpoint: "identify" | "event"
478
+ ) {
479
+ const requests = { count: 0 };
480
+ msw.use(
481
+ rest.post(`*/${endpoint}`, async (req, res, cxt) => {
482
+ requests.count++;
483
+ expect(await req.json()).toEqual(body);
484
+ expect(req.headers).toContain(header);
485
+ return res.once(cxt.status(200), cxt.json({}));
486
+ })
487
+ );
488
+
489
+ return requests;
490
+ }
491
+
492
+ // Forces a tick to allow the non-awaited fetch promise to resolve.
493
+ function flushPromises(): Promise<void> {
494
+ return new Promise((resolve) => setTimeout(resolve, 0));
495
+ }
@@ -0,0 +1,145 @@
1
+ import * as fs from "node:fs";
2
+ import { unstable_dev } from "../api";
3
+ import { runInTempDir } from "./helpers/run-in-tmp";
4
+
5
+ jest.unmock("undici");
6
+
7
+ describe("run scheduled events with middleware", () => {
8
+ describe("module workers", () => {
9
+ runInTempDir();
10
+
11
+ beforeEach(() => {
12
+ const scriptContent = `
13
+ export default {
14
+ fetch(request, env, ctx) {
15
+ const url = new URL(request.url);
16
+ if (url.pathname === "/__scheduled") {
17
+ return new Response("Fetch triggered at /__scheduled");
18
+ }
19
+ return new Response("Hello world!");
20
+ },
21
+ scheduled(controller, env, ctx) {
22
+ console.log("Doing something scheduled in modules...");
23
+ },
24
+ };
25
+ `;
26
+ fs.writeFileSync("index.js", scriptContent);
27
+ });
28
+
29
+ it("should not intercept when middleware is not enabled", async () => {
30
+ const worker = await unstable_dev("index.js", {
31
+ experimental: {
32
+ disableExperimentalWarning: true,
33
+ disableDevRegistry: true,
34
+ },
35
+ });
36
+
37
+ const resp = await worker.fetch("/__scheduled");
38
+ let text;
39
+ if (resp) text = await resp.text();
40
+ expect(text).toMatchInlineSnapshot(`"Fetch triggered at /__scheduled"`);
41
+ await worker.stop();
42
+ });
43
+
44
+ it("should intercept when middleware is enabled", async () => {
45
+ const worker = await unstable_dev("index.js", {
46
+ testScheduled: true,
47
+ experimental: {
48
+ disableExperimentalWarning: true,
49
+ disableDevRegistry: true,
50
+ },
51
+ });
52
+
53
+ const resp = await worker.fetch("/__scheduled");
54
+ let text;
55
+ if (resp) text = await resp.text();
56
+ expect(text).toMatchInlineSnapshot(`"Ran scheduled event"`);
57
+ await worker.stop();
58
+ });
59
+
60
+ it("should not trigger scheduled event on wrong route", async () => {
61
+ const worker = await unstable_dev("index.js", {
62
+ testScheduled: true,
63
+ experimental: {
64
+ disableExperimentalWarning: true,
65
+ disableDevRegistry: true,
66
+ },
67
+ });
68
+
69
+ const resp = await worker.fetch("/test");
70
+ let text;
71
+ if (resp) text = await resp.text();
72
+ expect(text).toMatchInlineSnapshot(`"Hello world!"`);
73
+ await worker.stop();
74
+ });
75
+ });
76
+
77
+ describe("service workers", () => {
78
+ runInTempDir();
79
+
80
+ beforeEach(() => {
81
+ const scriptContent = `
82
+ addEventListener("scheduled", (event) => {
83
+ console.log("Doing something scheduled in service worker...");
84
+ });
85
+
86
+ addEventListener("fetch", (event) => {
87
+ const url = new URL(event.request.url);
88
+ if (url.pathname === "/__scheduled") {
89
+ event.respondWith(new Response("Fetch triggered at /__scheduled"));
90
+ } else {
91
+ event.respondWith(new Response("Hello world!"));
92
+ }
93
+ });
94
+ `;
95
+ fs.writeFileSync("index.js", scriptContent);
96
+ });
97
+
98
+ it("should not intercept when middleware is not enabled", async () => {
99
+ const worker = await unstable_dev("index.js", {
100
+ experimental: {
101
+ disableExperimentalWarning: true,
102
+ disableDevRegistry: true,
103
+ },
104
+ });
105
+
106
+ const resp = await worker.fetch("/__scheduled");
107
+ let text;
108
+ if (resp) text = await resp.text();
109
+ expect(text).toMatchInlineSnapshot(`"Fetch triggered at /__scheduled"`);
110
+ await worker.stop();
111
+ });
112
+
113
+ it("should intercept when middleware is enabled", async () => {
114
+ const worker = await unstable_dev("index.js", {
115
+ testScheduled: true,
116
+ experimental: {
117
+ disableExperimentalWarning: true,
118
+ disableDevRegistry: true,
119
+ },
120
+ });
121
+
122
+ const resp = await worker.fetch("/__scheduled");
123
+ let text;
124
+ if (resp) text = await resp.text();
125
+ expect(text).toMatchInlineSnapshot(`"Ran scheduled event"`);
126
+ await worker.stop();
127
+ });
128
+
129
+ it("should not trigger scheduled event on wrong route", async () => {
130
+ const worker = await unstable_dev("index.js", {
131
+ testScheduled: true,
132
+ experimental: {
133
+ disableExperimentalWarning: true,
134
+ disableDevRegistry: true,
135
+ },
136
+ });
137
+
138
+ const resp = await worker.fetch("/test");
139
+ let text;
140
+ if (resp) text = await resp.text();
141
+ expect(text).toMatchInlineSnapshot(`"Hello world!"`);
142
+ await worker.stop();
143
+ });
144
+ });
145
+ });