wrangler 0.0.0-e30d1013 → 0.0.0-e311bbbf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) 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 +26 -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 -39
  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 -52
  15. package/src/__tests__/dev.test.tsx +198 -90
  16. package/src/__tests__/generate.test.ts +8 -5
  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 +127 -26
  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 +1620 -830
  61. package/src/__tests__/pubsub.test.ts +226 -100
  62. package/src/__tests__/queues.test.ts +237 -76
  63. package/src/__tests__/r2.test.ts +37 -56
  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 +11 -2
  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 +221 -128
  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 +73 -16
  87. package/src/config/index.ts +99 -30
  88. package/src/config/validation-helpers.ts +1 -1
  89. package/src/config/validation.ts +248 -9
  90. package/src/create-worker-preview.ts +19 -8
  91. package/src/create-worker-upload-form.ts +48 -5
  92. package/src/d1/backups.tsx +43 -42
  93. package/src/d1/create.tsx +26 -21
  94. package/src/d1/{delete.tsx → delete.ts} +11 -14
  95. package/src/d1/execute.tsx +183 -170
  96. package/src/d1/index.ts +7 -6
  97. package/src/d1/list.tsx +22 -10
  98. package/src/d1/migrations/apply.tsx +212 -0
  99. package/src/d1/migrations/create.tsx +79 -0
  100. package/src/d1/migrations/helpers.ts +172 -0
  101. package/src/d1/migrations/index.ts +3 -0
  102. package/src/d1/migrations/list.tsx +95 -0
  103. package/src/d1/migrations/options.ts +23 -0
  104. package/src/d1/options.ts +3 -3
  105. package/src/d1/splitter.ts +161 -0
  106. package/src/d1/{types.tsx → types.ts} +1 -0
  107. package/src/d1/utils.ts +2 -1
  108. package/src/delete.ts +8 -16
  109. package/src/deployments.ts +333 -42
  110. package/src/deprecated/index.ts +8 -302
  111. package/src/dev/dev.tsx +57 -44
  112. package/src/dev/local.tsx +248 -74
  113. package/src/dev/remote.tsx +32 -3
  114. package/src/dev/start-server.ts +81 -66
  115. package/src/dev/use-esbuild.ts +17 -18
  116. package/src/dev/validate-dev-props.ts +9 -0
  117. package/src/{dev-registry.tsx → dev-registry.ts} +2 -1
  118. package/src/dev.tsx +178 -117
  119. package/src/dialogs.ts +136 -0
  120. package/src/dispatch-namespace.ts +21 -17
  121. package/src/docs/index.ts +97 -0
  122. package/src/entry.ts +19 -11
  123. package/src/environment-variables/factory.ts +88 -0
  124. package/src/environment-variables/misc-variables.ts +30 -0
  125. package/src/generate/index.ts +298 -0
  126. package/src/git-client.ts +15 -4
  127. package/src/{index.tsx → index.ts} +134 -59
  128. package/src/init.ts +249 -187
  129. package/src/inspect.ts +16 -1
  130. package/src/jest.d.ts +4 -0
  131. package/src/kv/index.ts +15 -17
  132. package/src/logger.ts +32 -5
  133. package/src/metrics/metrics-config.ts +3 -3
  134. package/src/metrics/send-event.ts +6 -1
  135. package/src/miniflare-cli/assets.ts +64 -28
  136. package/src/miniflare-cli/index.ts +4 -7
  137. package/src/miniflare-cli/tsconfig.json +9 -0
  138. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  139. package/src/miniflare-cli/types.ts +11 -0
  140. package/src/module-collection.ts +91 -25
  141. package/src/mtls-certificate/cli.ts +155 -0
  142. package/src/pages/build.ts +410 -0
  143. package/src/pages/buildFunctions.ts +140 -0
  144. package/src/pages/deployment-tails.ts +281 -0
  145. package/src/pages/deployments.tsx +11 -33
  146. package/src/pages/{dev.tsx → dev.ts} +147 -139
  147. package/src/pages/errors.ts +1 -0
  148. package/src/pages/functions/buildPlugin.ts +61 -54
  149. package/src/pages/functions/buildWorker.ts +159 -33
  150. package/src/pages/functions/tsconfig.json +8 -0
  151. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  152. package/src/pages/{functions.tsx → functions.ts} +8 -4
  153. package/src/pages/{index.tsx → index.ts} +11 -3
  154. package/src/pages/projects.tsx +12 -22
  155. package/src/pages/prompt-select-project.tsx +31 -0
  156. package/src/pages/publish.tsx +46 -225
  157. package/src/pages/types.ts +6 -9
  158. package/src/pages/upload.tsx +58 -14
  159. package/src/pages/utils.ts +12 -1
  160. package/src/parse.ts +23 -1
  161. package/src/paths.ts +1 -1
  162. package/src/proxy.ts +5 -0
  163. package/src/publish/index.ts +20 -16
  164. package/src/publish/publish.ts +71 -46
  165. package/src/pubsub/{pubsub-commands.tsx → pubsub-commands.ts} +19 -20
  166. package/src/queues/cli/commands/consumer/add.ts +24 -24
  167. package/src/queues/cli/commands/consumer/index.ts +3 -6
  168. package/src/queues/cli/commands/consumer/remove.ts +11 -18
  169. package/src/queues/cli/commands/create.ts +8 -8
  170. package/src/queues/cli/commands/delete.ts +8 -8
  171. package/src/queues/cli/commands/index.ts +6 -4
  172. package/src/queues/cli/commands/list.ts +8 -8
  173. package/src/queues/client.ts +1 -0
  174. package/src/queues/utils.ts +18 -0
  175. package/src/r2/helpers.ts +1 -0
  176. package/src/r2/index.ts +28 -28
  177. package/src/secret/index.ts +14 -16
  178. package/src/{sites.tsx → sites.ts} +1 -1
  179. package/src/tail/createTail.ts +94 -3
  180. package/src/tail/filters.ts +1 -1
  181. package/src/tail/index.ts +8 -11
  182. package/src/tail/printing.ts +15 -0
  183. package/src/traverse-module-graph.ts +53 -0
  184. package/src/tsconfig-sanity.ts +16 -0
  185. package/src/type-generation.ts +28 -20
  186. package/src/user/access.ts +0 -1
  187. package/src/user/auth-variables.ts +113 -0
  188. package/src/user/choose-account.tsx +1 -31
  189. package/src/user/index.ts +0 -1
  190. package/src/user/{user.tsx → user.ts} +123 -82
  191. package/src/utils/render.ts +93 -0
  192. package/src/{whoami.tsx → whoami.ts} +37 -71
  193. package/src/worker.ts +30 -1
  194. package/src/yargs-types.ts +22 -5
  195. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  196. package/templates/__tests__/tsconfig.json +8 -0
  197. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  198. package/templates/checked-fetch.js +9 -3
  199. package/templates/d1-beta-facade.js +51 -3
  200. package/templates/facade.d.ts +14 -0
  201. package/templates/first-party-worker-module-facade.ts +4 -3
  202. package/templates/format-dev-errors.ts +8 -6
  203. package/templates/gitignore +1 -0
  204. package/templates/init-tests/test-jest-new-worker.js +3 -5
  205. package/templates/init-tests/test-vitest-new-worker.js +3 -5
  206. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  207. package/templates/middleware/loader-modules.ts +2 -2
  208. package/templates/middleware/loader-sw.ts +51 -31
  209. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  210. package/templates/new-worker.ts +3 -0
  211. package/templates/pages-dev-pipeline.ts +4 -1
  212. package/templates/pages-shim.ts +4 -1
  213. package/templates/pages-template-plugin.ts +19 -10
  214. package/templates/serve-static-assets.ts +17 -14
  215. package/templates/service-bindings-module-facade.js +1 -0
  216. package/templates/tsconfig-sanity.ts +11 -0
  217. package/templates/tsconfig.init.json +105 -0
  218. package/templates/tsconfig.json +5 -103
  219. package/templates/tsconfig.tsbuildinfo +1 -0
  220. package/wrangler-dist/cli.d.ts +820 -70
  221. package/wrangler-dist/cli.js +68161 -78780
  222. package/wrangler-dist/wasm-sync.wasm +0 -0
  223. package/src/__tests__/api-devregistry.test.js +0 -56
  224. package/src/__tests__/d1.test.ts +0 -74
  225. package/src/__tests__/dialogs.test.tsx +0 -40
  226. package/src/__tests__/helpers/mock-cfetch.ts +0 -333
  227. package/src/__tests__/pages.test.ts +0 -2387
  228. package/src/d1/migrations.tsx +0 -446
  229. package/src/dialogs.tsx +0 -169
  230. package/src/environment-variables.ts +0 -50
  231. package/src/pages/build.tsx +0 -270
  232. package/src/user/env-vars.ts +0 -46
  233. package/templates/experimental-local-cache-stubs.js +0 -27
  234. /package/src/{bundle-reporter.tsx → bundle-reporter.ts} +0 -0
  235. /package/src/dev/{get-local-persistence-path.tsx → get-local-persistence-path.ts} +0 -0
  236. /package/src/pages/{hash.tsx → hash.ts} +0 -0
@@ -1,18 +1,22 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import fetchMock from "jest-fetch-mock";
4
- import { getGlobalWranglerConfigPath } from "../global-wrangler-config-path";
1
+ import { rest } from "msw";
5
2
  import { CI } from "../is-ci";
6
3
  import {
7
4
  loginOrRefreshIfRequired,
8
5
  readAuthConfigFile,
9
6
  requireAuth,
10
- USER_AUTH_CONFIG_FILE,
11
7
  writeAuthConfigFile,
12
8
  } from "../user";
13
9
  import { mockConsoleMethods } from "./helpers/mock-console";
14
10
  import { useMockIsTTY } from "./helpers/mock-istty";
15
- import { mockOAuthFlow } from "./helpers/mock-oauth-flow";
11
+ import {
12
+ mockExchangeRefreshTokenForAccessToken,
13
+ mockOAuthFlow,
14
+ } from "./helpers/mock-oauth-flow";
15
+ import {
16
+ msw,
17
+ mswSuccessOauthHandlers,
18
+ mswSuccessUserHandlers,
19
+ } from "./helpers/msw";
16
20
  import { runInTempDir } from "./helpers/run-in-tmp";
17
21
  import { runWrangler } from "./helpers/run-wrangler";
18
22
  import type { Config } from "../config";
@@ -22,41 +26,43 @@ describe("User", () => {
22
26
  let isCISpy: jest.SpyInstance;
23
27
  runInTempDir();
24
28
  const std = mockConsoleMethods();
25
- const {
26
- mockOAuthServerCallback,
27
- mockGrantAccessToken,
28
- mockGrantAuthorization,
29
- mockRevokeAuthorization,
30
- mockExchangeRefreshTokenForAccessToken,
31
- } = mockOAuthFlow();
32
-
29
+ // TODO: Implement these two mocks with MSW
30
+ const { mockOAuthServerCallback } = mockOAuthFlow();
33
31
  const { setIsTTY } = useMockIsTTY();
34
32
 
35
33
  beforeEach(() => {
34
+ msw.use(...mswSuccessOauthHandlers, ...mswSuccessUserHandlers);
36
35
  isCISpy = jest.spyOn(CI, "isCI").mockReturnValue(false);
37
36
  });
38
37
 
39
38
  describe("login", () => {
40
39
  it("should login a user when `wrangler login` is run", async () => {
41
- mockOAuthServerCallback();
42
- const accessTokenRequest = mockGrantAccessToken({ respondWith: "ok" });
43
- mockGrantAuthorization({ respondWith: "success" });
40
+ mockOAuthServerCallback("success");
41
+
42
+ let counter = 0;
43
+ msw.use(
44
+ rest.post("*/oauth2/token", async (_, response, context) => {
45
+ counter += 1;
46
+
47
+ return response.once(
48
+ context.json({
49
+ access_token: "test-access-token",
50
+ expires_in: 100000,
51
+ refresh_token: "test-refresh-token",
52
+ scope: "account:read",
53
+ })
54
+ );
55
+ })
56
+ );
44
57
 
45
58
  await runWrangler("login");
46
59
 
47
- expect(accessTokenRequest.actual.url).toEqual(
48
- accessTokenRequest.expected.url
49
- );
50
- expect(accessTokenRequest.actual.method).toEqual(
51
- accessTokenRequest.expected.method
52
- );
53
-
60
+ expect(counter).toBe(1);
54
61
  expect(std.out).toMatchInlineSnapshot(`
55
62
  "Attempting to login via OAuth...
56
- Opening a link in your default browser: https://dash.cloudflare.com/oauth2/auth?response_type=code&client_id=54d11594-84e4-41aa-b438-e81b8fa78ee7&redirect_uri=http%3A%2F%2Flocalhost%3A8976%2Foauth%2Fcallback&scope=account%3Aread%20user%3Aread%20workers%3Awrite%20workers_kv%3Awrite%20workers_routes%3Awrite%20workers_scripts%3Awrite%20workers_tail%3Aread%20d1%3Awrite%20pages%3Awrite%20zone%3Aread%20offline_access&state=MOCK_STATE_PARAM&code_challenge=MOCK_CODE_CHALLENGE&code_challenge_method=S256
63
+ Opening a link in your default browser: https://dash.cloudflare.com/oauth2/auth?response_type=code&client_id=54d11594-84e4-41aa-b438-e81b8fa78ee7&redirect_uri=http%3A%2F%2Flocalhost%3A8976%2Foauth%2Fcallback&scope=account%3Aread%20user%3Aread%20workers%3Awrite%20workers_kv%3Awrite%20workers_routes%3Awrite%20workers_scripts%3Awrite%20workers_tail%3Aread%20d1%3Awrite%20pages%3Awrite%20zone%3Aread%20ssl_certs%3Awrite%20offline_access&state=MOCK_STATE_PARAM&code_challenge=MOCK_CODE_CHALLENGE&code_challenge_method=S256
57
64
  Successfully logged in."
58
65
  `);
59
-
60
66
  expect(readAuthConfigFile()).toEqual<UserAuthConfig>({
61
67
  api_token: undefined,
62
68
  oauth_token: "test-access-token",
@@ -67,71 +73,28 @@ describe("User", () => {
67
73
  });
68
74
  });
69
75
 
70
- describe("logout", () => {
71
- it("should exit with a message stating the user is not logged in", async () => {
72
- await runWrangler("logout");
73
- expect(std.out).toMatchInlineSnapshot(`"Not logged in, exiting..."`);
74
- });
75
-
76
- it("should logout user that has been properly logged in", async () => {
77
- writeAuthConfigFile({
78
- oauth_token: "some-oauth-tok",
79
- refresh_token: "some-refresh-tok",
80
- });
81
- const outcome = mockRevokeAuthorization();
82
-
83
- await runWrangler("logout");
84
-
85
- expect(outcome.actual.url).toEqual(
86
- "https://dash.cloudflare.com/oauth2/revoke"
87
- );
88
- expect(outcome.actual.method).toEqual("POST");
89
-
90
- expect(std.out).toMatchInlineSnapshot(`"Successfully logged out."`);
91
-
92
- // Make sure that we made the request to logout.
93
- expect(fetchMock).toHaveBeenCalledTimes(1);
94
-
95
- // Make sure that logout removed the config file containing the auth tokens.
96
- const config = path.join(
97
- getGlobalWranglerConfigPath(),
98
- USER_AUTH_CONFIG_FILE
99
- );
100
- expect(fs.existsSync(config)).toBeFalsy();
101
- });
102
- });
103
-
104
- // TODO: Improve OAuth mocking to handle `/token` endpoints from different calls
105
- it("should handle errors for failed token refresh", async () => {
76
+ it("should handle errors for failed token refresh in a non-interactive environment", async () => {
106
77
  setIsTTY(false);
107
78
  writeAuthConfigFile({
108
79
  oauth_token: "hunter2",
109
80
  refresh_token: "Order 66",
110
81
  });
111
- mockExchangeRefreshTokenForAccessToken({
112
- respondWith: "badResponse",
113
- });
82
+ mockExchangeRefreshTokenForAccessToken({ respondWith: "refreshError" });
114
83
 
115
84
  // Handles the requireAuth error throw from failed login that is unhandled due to directly calling it here
116
85
  await expect(
117
86
  requireAuth({} as Config)
118
87
  ).rejects.toThrowErrorMatchingInlineSnapshot(
119
- `"In a non-interactive environment, it's necessary to set a CLOUDFLARE_API_TOKEN environment variable for wrangler to work. Please go to https://developers.cloudflare.com/api/tokens/create/ for instructions on how to create an api token, and assign its value to CLOUDFLARE_API_TOKEN."`
88
+ `"In a non-interactive environment, it's necessary to set a CLOUDFLARE_API_TOKEN environment variable for wrangler to work. Please go to https://developers.cloudflare.com/fundamentals/api/get-started/create-token/ for instructions on how to create an api token, and assign its value to CLOUDFLARE_API_TOKEN."`
120
89
  );
121
90
  });
122
91
 
123
92
  it("should confirm no error message when refresh is successful", async () => {
124
93
  setIsTTY(false);
125
- mockOAuthServerCallback();
126
94
  writeAuthConfigFile({
127
95
  oauth_token: "hunter2",
128
96
  refresh_token: "Order 66",
129
97
  });
130
- mockGrantAuthorization({ respondWith: "success" });
131
-
132
- mockExchangeRefreshTokenForAccessToken({
133
- respondWith: "refreshSuccess",
134
- });
135
98
 
136
99
  // Handles the requireAuth error throw from failed login that is unhandled due to directly calling it here
137
100
  await expect(requireAuth({} as Config)).rejects.toThrowError();
@@ -1,17 +1,15 @@
1
- import { render } from "ink-testing-library";
2
1
  import { rest } from "msw";
3
- import React from "react";
4
2
  import { writeAuthConfigFile } from "../user";
5
- import { getUserInfo, WhoAmI } from "../whoami";
3
+ import { getUserInfo } from "../whoami";
6
4
  import { mockConsoleMethods } from "./helpers/mock-console";
7
5
  import { useMockIsTTY } from "./helpers/mock-istty";
8
6
  import {
7
+ createFetchResult,
9
8
  msw,
10
9
  mswSuccessOauthHandlers,
11
10
  mswSuccessUserHandlers,
12
11
  } from "./helpers/msw";
13
12
  import { runInTempDir } from "./helpers/run-in-tmp";
14
- import type { UserInfo } from "../whoami";
15
13
 
16
14
  describe("getUserInfo()", () => {
17
15
  const ENV_COPY = process.env;
@@ -47,18 +45,14 @@ describe("getUserInfo()", () => {
47
45
  msw.use(
48
46
  rest.get("*/user", (_, res, ctx) => {
49
47
  return res.once(
50
- ctx.status(200),
51
- ctx.json({
52
- success: false,
53
- errors: [
48
+ ctx.json(
49
+ createFetchResult({}, false, [
54
50
  {
55
51
  code: 9109,
56
52
  message: "Uauthorized to access requested resource",
57
53
  },
58
- ],
59
- messages: [],
60
- result: {},
61
- })
54
+ ])
55
+ )
62
56
  );
63
57
  }),
64
58
  rest.get("*/accounts", (request, res, ctx) => {
@@ -74,15 +68,7 @@ describe("getUserInfo()", () => {
74
68
  "host": "api.cloudflare.com",
75
69
  }
76
70
  `);
77
- return res.once(
78
- ctx.status(200),
79
- ctx.json({
80
- success: true,
81
- errors: [],
82
- messages: [],
83
- result: [],
84
- })
85
- );
71
+ return res.once(ctx.json(createFetchResult([])));
86
72
  })
87
73
  );
88
74
  const userInfo = await getUserInfo();
@@ -174,7 +160,7 @@ describe("getUserInfo()", () => {
174
160
  await getUserInfo();
175
161
 
176
162
  expect(std.warn).toMatchInlineSnapshot(`
177
- "▲ [WARNING] It looks like you have used Wrangler 1's \`config\` command to login with an API token.
163
+ "▲ [WARNING] It looks like you have used Wrangler v1's \`config\` command to login with an API token.
178
164
 
179
165
  This is no longer supported in the current version of Wrangler.
180
166
  If you wish to authenticate via an API token then please set the \`CLOUDFLARE_API_TOKEN\`
@@ -184,95 +170,3 @@ describe("getUserInfo()", () => {
184
170
  `);
185
171
  });
186
172
  });
187
-
188
- describe("WhoAmI component", () => {
189
- it("should return undefined if there is no user", async () => {
190
- const { lastFrame } = render(<WhoAmI user={undefined}></WhoAmI>);
191
-
192
- expect(lastFrame()).toMatchInlineSnapshot(
193
- `"You are not authenticated. Please run \`wrangler login\`."`
194
- );
195
- });
196
-
197
- it("should display the user's email, accounts and OAuth scopes", async () => {
198
- const user: UserInfo = {
199
- authType: "OAuth Token",
200
- apiToken: "some-oauth-token",
201
- email: "user@example.com",
202
- tokenPermissions: ["scope1:read", "scope2:write", "scope3"],
203
- accounts: [
204
- { name: "Account One", id: "account-1" },
205
- { name: "Account Two", id: "account-2" },
206
- { name: "Account Three", id: "account-3" },
207
- ],
208
- };
209
-
210
- const { lastFrame } = render(<WhoAmI user={user}></WhoAmI>);
211
-
212
- expect(lastFrame()).toContain(
213
- "You are logged in with an OAuth Token, associated with the email 'user@example.com'!"
214
- );
215
- expect(lastFrame()).toMatch(/Account Name .+ Account ID/);
216
- expect(lastFrame()).toMatch(/Account One .+ account-1/);
217
- expect(lastFrame()).toMatch(/Account Two .+ account-2/);
218
- expect(lastFrame()).toMatch(/Account Three .+ account-3/);
219
- expect(lastFrame()).toContain(
220
- "Token Permissions: If scopes are missing, you may need to logout and re-login."
221
- );
222
- expect(lastFrame()).toContain("- scope1 (read)");
223
- expect(lastFrame()).toContain("- scope2 (write)");
224
- expect(lastFrame()).toContain("- scope3");
225
- });
226
-
227
- // For the case where the cache hasn't updated to include the scopes array
228
- it("should display the user's email and accounts, but no OAuth scopes if none provided", async () => {
229
- const user: UserInfo = {
230
- authType: "OAuth Token",
231
- apiToken: "some-oauth-token",
232
- email: "user@example.com",
233
- tokenPermissions: undefined,
234
- accounts: [
235
- { name: "Account One", id: "account-1" },
236
- { name: "Account Two", id: "account-2" },
237
- { name: "Account Three", id: "account-3" },
238
- ],
239
- };
240
-
241
- const { lastFrame } = render(<WhoAmI user={user}></WhoAmI>);
242
-
243
- expect(lastFrame()).toContain(
244
- "You are logged in with an OAuth Token, associated with the email 'user@example.com'!"
245
- );
246
- expect(lastFrame()).toMatch(/Account Name .+ Account ID/);
247
- expect(lastFrame()).toMatch(/Account One .+ account-1/);
248
- expect(lastFrame()).toMatch(/Account Two .+ account-2/);
249
- expect(lastFrame()).toMatch(/Account Three .+ account-3/);
250
- });
251
-
252
- it("should display the user's email, accounts and link to view token permissions for non-OAuth tokens", async () => {
253
- const user: UserInfo = {
254
- authType: "API Token",
255
- apiToken: "some-api-token",
256
- email: "user@example.com",
257
- tokenPermissions: undefined,
258
- accounts: [
259
- { name: "Account One", id: "account-1" },
260
- { name: "Account Two", id: "account-2" },
261
- { name: "Account Three", id: "account-3" },
262
- ],
263
- };
264
-
265
- const { lastFrame } = render(<WhoAmI user={user}></WhoAmI>);
266
-
267
- expect(lastFrame()).toContain(
268
- "You are logged in with an API Token, associated with the email 'user@example.com'!"
269
- );
270
- expect(lastFrame()).toMatch(/Account Name .+ Account ID/);
271
- expect(lastFrame()).toMatch(/Account One .+ account-1/);
272
- expect(lastFrame()).toMatch(/Account Two .+ account-2/);
273
- expect(lastFrame()).toMatch(/Account Three .+ account-3/);
274
- expect(lastFrame()).toContain(
275
- "To see token permissions visit https://dash.cloudflare.com/profile/api-tokens"
276
- );
277
- });
278
- });
@@ -1,7 +1,11 @@
1
1
  import { rest } from "msw";
2
2
  import { mockAccountId, mockApiToken } from "./helpers/mock-account-id";
3
3
  import { mockConsoleMethods } from "./helpers/mock-console";
4
- import { msw, mswSuccessNamespacesHandlers } from "./helpers/msw";
4
+ import {
5
+ createFetchResult,
6
+ msw,
7
+ mswSuccessNamespacesHandlers,
8
+ } from "./helpers/msw";
5
9
  import { runInTempDir } from "./helpers/run-in-tmp";
6
10
  import { runWrangler } from "./helpers/run-wrangler";
7
11
 
@@ -13,7 +17,7 @@ describe("dispatch-namespace", () => {
13
17
  mockAccountId();
14
18
  mockApiToken();
15
19
 
16
- it("should should display a list of available subcommands, for dispatch-namespace with no subcommand", async () => {
20
+ it("should display a list of available subcommands, for dispatch-namespace with no subcommand", async () => {
17
21
  await runWrangler("dispatch-namespace");
18
22
 
19
23
  // wait a tick for the help menu to be printed
@@ -23,6 +27,7 @@ describe("dispatch-namespace", () => {
23
27
  Object {
24
28
  "debug": "",
25
29
  "err": "",
30
+ "info": "",
26
31
  "out": "wrangler dispatch-namespace
27
32
 
28
33
  📦 Interact with a dispatch namespace
@@ -35,10 +40,11 @@ describe("dispatch-namespace", () => {
35
40
  wrangler dispatch-namespace rename <old-name> <new-name> Rename a dispatch namespace
36
41
 
37
42
  Flags:
38
- -c, --config Path to .toml configuration file [string]
39
- -e, --env Environment to use for operations and .env files [string]
40
- -h, --help Show help [boolean]
41
- -v, --version Show version number [boolean]",
43
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
44
+ -c, --config Path to .toml configuration file [string]
45
+ -e, --env Environment to use for operations and .env files [string]
46
+ -h, --help Show help [boolean]
47
+ -v, --version Show version number [boolean]",
42
48
  "warn": "",
43
49
  }
44
50
  `);
@@ -49,22 +55,23 @@ describe("dispatch-namespace", () => {
49
55
  let counter = 0;
50
56
  msw.use(
51
57
  rest.post(
52
- "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
53
- (req, res, cxt) => {
58
+ "*/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
59
+ (req, res, ctx) => {
54
60
  counter++;
55
61
  const { namespaceNameParam } = req.params;
56
62
  expect(counter).toBe(1);
57
63
  expect(namespaceNameParam).toBe(namespaceName);
58
64
  return res.once(
59
- cxt.status(200),
60
- cxt.json({
61
- namespace_id: "some-namespace-id",
62
- namespace_name: "namespace-name",
63
- created_on: "2022-06-29T14:30:08.16152Z",
64
- created_by: "1fc1df98cc4420fe00367c3ab68c1639",
65
- modified_on: "2022-06-29T14:30:08.16152Z",
66
- modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
67
- })
65
+ ctx.json(
66
+ createFetchResult({
67
+ namespace_id: "some-namespace-id",
68
+ namespace_name: "namespace-name",
69
+ created_on: "2022-06-29T14:30:08.16152Z",
70
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
71
+ modified_on: "2022-06-29T14:30:08.16152Z",
72
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
73
+ })
74
+ )
68
75
  );
69
76
  }
70
77
  )
@@ -87,10 +94,11 @@ describe("dispatch-namespace", () => {
87
94
  name Name of the dispatch namespace [string] [required]
88
95
 
89
96
  Flags:
90
- -c, --config Path to .toml configuration file [string]
91
- -e, --env Environment to use for operations and .env files [string]
92
- -h, --help Show help [boolean]
93
- -v, --version Show version number [boolean]"
97
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
98
+ -c, --config Path to .toml configuration file [string]
99
+ -e, --env Environment to use for operations and .env files [string]
100
+ -h, --help Show help [boolean]
101
+ -v, --version Show version number [boolean]"
94
102
  `);
95
103
  });
96
104
 
@@ -108,13 +116,13 @@ describe("dispatch-namespace", () => {
108
116
  let counter = 0;
109
117
  msw.use(
110
118
  rest.delete(
111
- "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
112
- (req, res, cxt) => {
119
+ "*/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
120
+ (req, res, ctx) => {
113
121
  counter++;
114
122
  const { namespaceNameParam } = req.params;
115
123
  expect(counter).toBe(1);
116
124
  expect(namespaceNameParam).toBe(namespaceName);
117
- return res.once(cxt.status(200), cxt.json(null));
125
+ return res.once(ctx.json(null));
118
126
  }
119
127
  )
120
128
  );
@@ -136,10 +144,11 @@ describe("dispatch-namespace", () => {
136
144
  name Name of the dispatch namespace [string] [required]
137
145
 
138
146
  Flags:
139
- -c, --config Path to .toml configuration file [string]
140
- -e, --env Environment to use for operations and .env files [string]
141
- -h, --help Show help [boolean]
142
- -v, --version Show version number [boolean]"
147
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
148
+ -c, --config Path to .toml configuration file [string]
149
+ -e, --env Environment to use for operations and .env files [string]
150
+ -h, --help Show help [boolean]
151
+ -v, --version Show version number [boolean]"
143
152
  `);
144
153
  });
145
154
 
@@ -157,22 +166,23 @@ describe("dispatch-namespace", () => {
157
166
  let counter = 0;
158
167
  msw.use(
159
168
  rest.get(
160
- "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
161
- (req, res, cxt) => {
169
+ "*/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
170
+ (req, res, ctx) => {
162
171
  counter++;
163
172
  const { namespaceNameParam } = req.params;
164
173
  expect(counter).toBe(1);
165
174
  expect(namespaceNameParam).toBe(namespaceName);
166
175
  return res.once(
167
- cxt.status(200),
168
- cxt.json({
169
- namespace_id: "some-namespace-id",
170
- namespace_name: "namespace-name",
171
- created_on: "2022-06-29T14:30:08.16152Z",
172
- created_by: "1fc1df98cc4420fe00367c3ab68c1639",
173
- modified_on: "2022-06-29T14:30:08.16152Z",
174
- modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
175
- })
176
+ ctx.json(
177
+ createFetchResult({
178
+ namespace_id: "some-namespace-id",
179
+ namespace_name: "namespace-name",
180
+ created_on: "2022-06-29T14:30:08.16152Z",
181
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
182
+ modified_on: "2022-06-29T14:30:08.16152Z",
183
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
184
+ })
185
+ )
176
186
  );
177
187
  }
178
188
  )
@@ -195,10 +205,11 @@ describe("dispatch-namespace", () => {
195
205
  name Name of the dispatch namespace [string] [required]
196
206
 
197
207
  Flags:
198
- -c, --config Path to .toml configuration file [string]
199
- -e, --env Environment to use for operations and .env files [string]
200
- -h, --help Show help [boolean]
201
- -v, --version Show version number [boolean]"
208
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
209
+ -c, --config Path to .toml configuration file [string]
210
+ -e, --env Environment to use for operations and .env files [string]
211
+ -h, --help Show help [boolean]
212
+ -v, --version Show version number [boolean]"
202
213
  `);
203
214
  });
204
215
 
@@ -223,22 +234,23 @@ describe("dispatch-namespace", () => {
223
234
  let counter = 0;
224
235
  msw.use(
225
236
  rest.get(
226
- "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
227
- (req, res, cxt) => {
237
+ "*/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
238
+ (req, res, ctx) => {
228
239
  counter++;
229
240
  const { namespaceNameParam } = req.params;
230
241
  expect(counter).toBe(1);
231
242
  expect(namespaceNameParam).toBe(namespaceName);
232
243
  return res.once(
233
- cxt.status(200),
234
- cxt.json({
235
- namespace_id: "some-namespace-id",
236
- namespace_name: "namespace-name",
237
- created_on: "2022-06-29T14:30:08.16152Z",
238
- created_by: "1fc1df98cc4420fe00367c3ab68c1639",
239
- modified_on: "2022-06-29T14:30:08.16152Z",
240
- modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
241
- })
244
+ ctx.json(
245
+ createFetchResult({
246
+ namespace_id: "some-namespace-id",
247
+ namespace_name: "namespace-name",
248
+ created_on: "2022-06-29T14:30:08.16152Z",
249
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
250
+ modified_on: "2022-06-29T14:30:08.16152Z",
251
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
252
+ })
253
+ )
242
254
  );
243
255
  }
244
256
  )
@@ -266,22 +278,23 @@ describe("dispatch-namespace", () => {
266
278
  let counter = 0;
267
279
  msw.use(
268
280
  rest.put(
269
- "/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
270
- (req, res, cxt) => {
281
+ "*/accounts/:accountId/workers/dispatch/namespaces/:namespaceNameParam",
282
+ (req, res, ctx) => {
271
283
  counter++;
272
284
  const { namespaceNameParam } = req.params;
273
285
  expect(counter).toBe(1);
274
286
  expect(namespaceNameParam).toBe(namespaceName);
275
287
  return res.once(
276
- cxt.status(200),
277
- cxt.json({
278
- namespace_id: "some-namespace-id",
279
- namespace_name: "namespace-name",
280
- created_on: "2022-06-29T14:30:08.16152Z",
281
- created_by: "1fc1df98cc4420fe00367c3ab68c1639",
282
- modified_on: "2022-06-29T14:30:08.16152Z",
283
- modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
284
- })
288
+ ctx.json(
289
+ createFetchResult({
290
+ namespace_id: "some-namespace-id",
291
+ namespace_name: "namespace-name",
292
+ created_on: "2022-06-29T14:30:08.16152Z",
293
+ created_by: "1fc1df98cc4420fe00367c3ab68c1639",
294
+ modified_on: "2022-06-29T14:30:08.16152Z",
295
+ modified_by: "1fc1df98cc4420fe00367c3ab68c1639",
296
+ })
297
+ )
285
298
  );
286
299
  }
287
300
  )
@@ -305,10 +318,11 @@ describe("dispatch-namespace", () => {
305
318
  new-name New name of the dispatch namespace [string] [required]
306
319
 
307
320
  Flags:
308
- -c, --config Path to .toml configuration file [string]
309
- -e, --env Environment to use for operations and .env files [string]
310
- -h, --help Show help [boolean]
311
- -v, --version Show version number [boolean]"
321
+ -j, --experimental-json-config Experimental: Support wrangler.json [boolean]
322
+ -c, --config Path to .toml configuration file [string]
323
+ -e, --env Environment to use for operations and .env files [string]
324
+ -h, --help Show help [boolean]
325
+ -v, --version Show version number [boolean]"
312
326
  `);
313
327
  });
314
328