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
@@ -1,15 +1,15 @@
1
1
  import { render } from "ink-testing-library";
2
+ import { rest } from "msw";
2
3
  import React from "react";
3
4
  import { writeAuthConfigFile } from "../user";
4
5
  import { getUserInfo, WhoAmI } from "../whoami";
5
- import {
6
- createFetchResult,
7
- setMockRawResponse,
8
- setMockResponse,
9
- unsetAllMocks,
10
- } from "./helpers/mock-cfetch";
11
6
  import { mockConsoleMethods } from "./helpers/mock-console";
12
7
  import { useMockIsTTY } from "./helpers/mock-istty";
8
+ import {
9
+ msw,
10
+ mswSuccessOauthHandlers,
11
+ mswSuccessUserHandlers,
12
+ } from "./helpers/msw";
13
13
  import { runInTempDir } from "./helpers/run-in-tmp";
14
14
  import type { UserInfo } from "../whoami";
15
15
 
@@ -21,12 +21,12 @@ describe("getUserInfo()", () => {
21
21
  const { setIsTTY } = useMockIsTTY();
22
22
 
23
23
  beforeEach(() => {
24
+ msw.use(...mswSuccessOauthHandlers, ...mswSuccessUserHandlers);
24
25
  setIsTTY(true);
25
26
  });
26
27
 
27
28
  afterEach(() => {
28
29
  process.env = ENV_COPY;
29
- unsetAllMocks();
30
30
  });
31
31
 
32
32
  it("should return undefined if there is no config file", async () => {
@@ -44,30 +44,54 @@ describe("getUserInfo()", () => {
44
44
  process.env = {
45
45
  CLOUDFLARE_API_TOKEN: "123456789",
46
46
  };
47
- setMockRawResponse("/user", () =>
48
- createFetchResult(undefined, false, [
49
- { code: 9109, message: "Uauthorized to access requested resource" },
50
- ])
47
+ msw.use(
48
+ rest.get("*/user", (_, res, ctx) => {
49
+ return res.once(
50
+ ctx.status(200),
51
+ ctx.json({
52
+ success: false,
53
+ errors: [
54
+ {
55
+ code: 9109,
56
+ message: "Uauthorized to access requested resource",
57
+ },
58
+ ],
59
+ messages: [],
60
+ result: {},
61
+ })
62
+ );
63
+ }),
64
+ rest.get("*/accounts", (request, res, ctx) => {
65
+ const headersObject = request.headers.all();
66
+ delete headersObject["user-agent"];
67
+
68
+ expect(headersObject).toMatchInlineSnapshot(`
69
+ Object {
70
+ "accept": "*/*",
71
+ "accept-encoding": "gzip,deflate",
72
+ "authorization": "Bearer 123456789",
73
+ "connection": "close",
74
+ "host": "api.cloudflare.com",
75
+ }
76
+ `);
77
+ return res.once(
78
+ ctx.status(200),
79
+ ctx.json({
80
+ success: true,
81
+ errors: [],
82
+ messages: [],
83
+ result: [],
84
+ })
85
+ );
86
+ })
51
87
  );
52
- setMockResponse("/accounts", () => []);
53
88
  const userInfo = await getUserInfo();
54
89
  expect(userInfo?.email).toBeUndefined();
55
90
  });
56
-
57
91
  it("should say it's using an API token when one is set", async () => {
58
92
  process.env = {
59
93
  CLOUDFLARE_API_TOKEN: "123456789",
60
94
  };
61
- setMockResponse("/user", () => {
62
- return { email: "user@example.com" };
63
- });
64
- setMockResponse("/accounts", () => {
65
- return [
66
- { name: "Account One", id: "account-1" },
67
- { name: "Account Two", id: "account-2" },
68
- { name: "Account Three", id: "account-3" },
69
- ];
70
- });
71
95
 
72
96
  const userInfo = await getUserInfo();
73
97
  expect(userInfo).toEqual({
@@ -87,13 +111,6 @@ describe("getUserInfo()", () => {
87
111
  CLOUDFLARE_API_KEY: "123456789",
88
112
  CLOUDFLARE_EMAIL: "user@example.com",
89
113
  };
90
- setMockResponse("/accounts", () => {
91
- return [
92
- { name: "Account One", id: "account-1" },
93
- { name: "Account Two", id: "account-2" },
94
- { name: "Account Three", id: "account-3" },
95
- ];
96
- });
97
114
 
98
115
  const userInfo = await getUserInfo();
99
116
  expect(userInfo).toEqual({
@@ -114,13 +131,6 @@ describe("getUserInfo()", () => {
114
131
  CLOUDFLARE_EMAIL: "user@example.com",
115
132
  CLOUDFLARE_API_TOKEN: "123456789",
116
133
  };
117
- setMockResponse("/accounts", () => {
118
- return [
119
- { name: "Account One", id: "account-1" },
120
- { name: "Account Two", id: "account-2" },
121
- { name: "Account Three", id: "account-3" },
122
- ];
123
- });
124
134
 
125
135
  const userInfo = await getUserInfo();
126
136
  expect(userInfo).toEqual({
@@ -145,18 +155,6 @@ describe("getUserInfo()", () => {
145
155
 
146
156
  it("should return the user's email and accounts if authenticated via config token", async () => {
147
157
  writeAuthConfigFile({ oauth_token: "some-oauth-token" });
148
-
149
- setMockResponse("/user", () => {
150
- return { email: "user@example.com" };
151
- });
152
- setMockResponse("/accounts", () => {
153
- return [
154
- { name: "Account One", id: "account-1" },
155
- { name: "Account Two", id: "account-2" },
156
- { name: "Account Three", id: "account-3" },
157
- ];
158
- });
159
-
160
158
  const userInfo = await getUserInfo();
161
159
 
162
160
  expect(userInfo).toEqual({
@@ -173,26 +171,17 @@ describe("getUserInfo()", () => {
173
171
 
174
172
  it("should display a warning message if the config file contains a legacy api_token field", async () => {
175
173
  writeAuthConfigFile({ api_token: "API_TOKEN" });
176
- setMockResponse("/user", () => {
177
- return { email: "user@example.com" };
178
- });
179
- setMockResponse("/accounts", () => {
180
- return [
181
- { name: "Account One", id: "account-1" },
182
- { name: "Account Two", id: "account-2" },
183
- { name: "Account Three", id: "account-3" },
184
- ];
185
- });
186
174
  await getUserInfo();
175
+
187
176
  expect(std.warn).toMatchInlineSnapshot(`
188
- "▲ [WARNING] It looks like you have used Wrangler 1's \`config\` command to login with an API token.
177
+ "▲ [WARNING] It looks like you have used Wrangler 1's \`config\` command to login with an API token.
189
178
 
190
- This is no longer supported in the current version of Wrangler.
191
- If you wish to authenticate via an API token then please set the \`CLOUDFLARE_API_TOKEN\`
192
- environment variable.
179
+ This is no longer supported in the current version of Wrangler.
180
+ If you wish to authenticate via an API token then please set the \`CLOUDFLARE_API_TOKEN\`
181
+ environment variable.
193
182
 
194
- "
195
- `);
183
+ "
184
+ `);
196
185
  });
197
186
  });
198
187
 
@@ -205,11 +194,43 @@ describe("WhoAmI component", () => {
205
194
  );
206
195
  });
207
196
 
208
- it("should display the user's email and accounts", async () => {
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 () => {
209
229
  const user: UserInfo = {
210
230
  authType: "OAuth Token",
211
231
  apiToken: "some-oauth-token",
212
232
  email: "user@example.com",
233
+ tokenPermissions: undefined,
213
234
  accounts: [
214
235
  { name: "Account One", id: "account-1" },
215
236
  { name: "Account Two", id: "account-2" },
@@ -227,4 +248,31 @@ describe("WhoAmI component", () => {
227
248
  expect(lastFrame()).toMatch(/Account Two .+ account-2/);
228
249
  expect(lastFrame()).toMatch(/Account Three .+ account-3/);
229
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
+ });
230
278
  });