wrangler 0.0.0-fe5dcfd → 0.0.0-ff2e7cb

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 (195) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +33 -14
  3. package/bin/wrangler.js +126 -25
  4. package/kv-asset-handler.js +1 -0
  5. package/miniflare-dist/index.mjs +4893 -0
  6. package/package.json +156 -127
  7. package/src/__tests__/config-cache.test.ts +36 -0
  8. package/src/__tests__/configuration.test.ts +3829 -0
  9. package/src/__tests__/dev.test.tsx +1155 -63
  10. package/src/__tests__/guess-worker-format.test.ts +85 -0
  11. package/src/__tests__/{clipboardy-mock.js → helpers/clipboardy-mock.js} +0 -0
  12. package/src/__tests__/helpers/cmd-shim.d.ts +11 -0
  13. package/src/__tests__/helpers/faye-websocket.d.ts +6 -0
  14. package/src/__tests__/helpers/mock-account-id.ts +48 -0
  15. package/src/__tests__/helpers/mock-bin.ts +36 -0
  16. package/src/__tests__/helpers/mock-cfetch.ts +211 -0
  17. package/src/__tests__/helpers/mock-console.ts +97 -0
  18. package/src/__tests__/helpers/mock-dialogs.ts +153 -0
  19. package/src/__tests__/helpers/mock-http-server.ts +46 -0
  20. package/src/__tests__/helpers/mock-istty.ts +74 -0
  21. package/src/__tests__/helpers/mock-kv.ts +33 -0
  22. package/src/__tests__/helpers/mock-oauth-flow.ts +250 -0
  23. package/src/__tests__/helpers/mock-process.ts +39 -0
  24. package/src/__tests__/helpers/mock-stdin.ts +108 -0
  25. package/src/__tests__/helpers/mock-web-socket.ts +29 -0
  26. package/src/__tests__/helpers/run-in-tmp.ts +39 -0
  27. package/src/__tests__/helpers/run-wrangler.ts +16 -0
  28. package/src/__tests__/helpers/write-worker-source.ts +31 -0
  29. package/src/__tests__/helpers/write-wrangler-toml.ts +17 -0
  30. package/src/__tests__/https-options.test.ts +130 -0
  31. package/src/__tests__/index.test.ts +222 -251
  32. package/src/__tests__/init.test.ts +1992 -0
  33. package/src/__tests__/jest.setup.ts +95 -10
  34. package/src/__tests__/kv.test.ts +1361 -941
  35. package/src/__tests__/logger.test.ts +141 -0
  36. package/src/__tests__/package-manager.test.ts +353 -0
  37. package/src/__tests__/pages.test.ts +1254 -0
  38. package/src/__tests__/parse.test.ts +330 -0
  39. package/src/__tests__/publish.test.ts +6481 -705
  40. package/src/__tests__/pubsub.test.ts +276 -0
  41. package/src/__tests__/r2.test.ts +233 -0
  42. package/src/__tests__/route.test.ts +45 -0
  43. package/src/__tests__/secret.test.ts +486 -0
  44. package/src/__tests__/tail.test.ts +690 -0
  45. package/src/__tests__/user.test.ts +143 -0
  46. package/src/__tests__/whoami.test.tsx +212 -122
  47. package/src/abort.d.ts +3 -0
  48. package/src/api/dev.ts +39 -0
  49. package/src/api/index.ts +1 -0
  50. package/src/bundle-reporter.tsx +29 -0
  51. package/src/bundle.ts +212 -0
  52. package/src/cfetch/index.ts +88 -77
  53. package/src/cfetch/internal.ts +124 -46
  54. package/src/cli.ts +24 -6
  55. package/src/config/README.md +107 -0
  56. package/src/config/config.ts +243 -0
  57. package/src/config/diagnostics.ts +80 -0
  58. package/src/config/environment.ts +430 -0
  59. package/src/config/index.ts +225 -0
  60. package/src/config/validation-helpers.ts +584 -0
  61. package/src/config/validation.ts +1693 -0
  62. package/src/config-cache.ts +44 -0
  63. package/src/create-worker-preview.ts +199 -0
  64. package/src/create-worker-upload-form.ts +254 -0
  65. package/src/dev/dev-vars.ts +36 -0
  66. package/src/dev/dev.tsx +417 -0
  67. package/src/dev/local.tsx +350 -0
  68. package/src/dev/remote.tsx +294 -0
  69. package/src/dev/use-esbuild.ts +150 -0
  70. package/src/dev.tsx +515 -768
  71. package/src/dialogs.tsx +117 -59
  72. package/src/durable.ts +102 -0
  73. package/src/entry.ts +328 -0
  74. package/src/environment-variables.ts +35 -0
  75. package/src/errors.ts +11 -0
  76. package/src/generate.ts +33 -0
  77. package/src/git-client.ts +42 -0
  78. package/src/https-options.ts +123 -0
  79. package/src/index.tsx +1835 -1948
  80. package/src/init.ts +549 -0
  81. package/src/inspect.ts +615 -496
  82. package/src/intl-polyfill.d.ts +139 -0
  83. package/src/kv.ts +408 -0
  84. package/src/logger.ts +73 -0
  85. package/src/miniflare-cli/README.md +30 -0
  86. package/src/miniflare-cli/enum-keys.ts +17 -0
  87. package/src/miniflare-cli/index.ts +52 -0
  88. package/src/miniflare-cli/request-context.ts +40 -0
  89. package/src/module-collection.ts +247 -53
  90. package/src/open-in-browser.ts +17 -0
  91. package/src/package-manager.ts +174 -0
  92. package/src/pages/build.tsx +202 -0
  93. package/src/pages/constants.ts +7 -0
  94. package/src/pages/deployments.tsx +101 -0
  95. package/src/pages/dev.tsx +964 -0
  96. package/src/pages/functions/buildPlugin.ts +105 -0
  97. package/src/pages/functions/buildWorker.ts +151 -0
  98. package/src/pages/functions/filepath-routing.test.ts +234 -0
  99. package/src/pages/functions/filepath-routing.ts +189 -0
  100. package/src/pages/functions/identifiers.ts +78 -0
  101. package/src/pages/functions/routes.ts +151 -0
  102. package/src/pages/index.tsx +84 -0
  103. package/src/pages/projects.tsx +157 -0
  104. package/src/pages/publish.tsx +335 -0
  105. package/src/pages/types.ts +40 -0
  106. package/src/pages/upload.tsx +384 -0
  107. package/src/pages/utils.ts +12 -0
  108. package/src/parse.ts +286 -0
  109. package/src/paths.ts +26 -0
  110. package/src/preview.ts +31 -0
  111. package/src/proxy.ts +428 -254
  112. package/src/publish.ts +749 -365
  113. package/src/pubsub/index.ts +286 -0
  114. package/src/pubsub/pubsub-commands.tsx +604 -0
  115. package/src/r2.ts +50 -0
  116. package/src/selfsigned.d.ts +29 -0
  117. package/src/sites.tsx +294 -165
  118. package/src/tail/filters.ts +279 -0
  119. package/src/tail/index.ts +299 -0
  120. package/src/tail/printing.ts +67 -0
  121. package/src/update-check.ts +19 -0
  122. package/src/user/choose-account.tsx +60 -0
  123. package/src/user/env-vars.ts +46 -0
  124. package/src/user/generate-auth-url.ts +33 -0
  125. package/src/user/generate-random-state.ts +16 -0
  126. package/src/user/index.ts +3 -0
  127. package/src/user/user.tsx +1130 -0
  128. package/src/whoami.tsx +62 -41
  129. package/src/worker.ts +185 -0
  130. package/src/zones.ts +76 -0
  131. package/templates/checked-fetch.js +17 -0
  132. package/templates/gitignore +171 -0
  133. package/templates/new-worker-scheduled.js +17 -0
  134. package/templates/new-worker-scheduled.ts +32 -0
  135. package/templates/new-worker.js +15 -0
  136. package/templates/new-worker.ts +30 -0
  137. package/templates/no-op-worker.js +10 -0
  138. package/templates/pages-template-plugin.ts +155 -0
  139. package/templates/pages-template-worker.ts +161 -0
  140. package/templates/static-asset-facade.js +43 -0
  141. package/templates/tsconfig.json +105 -0
  142. package/wrangler-dist/cli.js +117167 -114038
  143. package/pages/functions/buildWorker.ts +0 -62
  144. package/pages/functions/filepath-routing.test.ts +0 -39
  145. package/pages/functions/filepath-routing.ts +0 -228
  146. package/pages/functions/identifiers.ts +0 -78
  147. package/pages/functions/routes.ts +0 -158
  148. package/pages/functions/template-worker.ts +0 -136
  149. package/src/__tests__/mock-cfetch.ts +0 -173
  150. package/src/__tests__/mock-dialogs.ts +0 -65
  151. package/src/__tests__/run-in-tmp.ts +0 -19
  152. package/src/__tests__/run-wrangler.ts +0 -32
  153. package/src/api/form_data.ts +0 -131
  154. package/src/api/preview.ts +0 -128
  155. package/src/api/worker.ts +0 -155
  156. package/src/config.ts +0 -646
  157. package/src/kv.tsx +0 -276
  158. package/src/pages.tsx +0 -1040
  159. package/src/tail.tsx +0 -73
  160. package/src/user.tsx +0 -1019
  161. package/static-asset-facade.js +0 -47
  162. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  163. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  164. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  165. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  166. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  167. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  168. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  169. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  170. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  171. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  172. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  173. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  174. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  175. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  176. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  177. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  178. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  179. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  180. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  181. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  182. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  183. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  184. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  185. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  186. package/vendor/wrangler-mime/LICENSE +0 -21
  187. package/vendor/wrangler-mime/Mime.js +0 -97
  188. package/vendor/wrangler-mime/README.md +0 -187
  189. package/vendor/wrangler-mime/cli.js +0 -46
  190. package/vendor/wrangler-mime/index.js +0 -4
  191. package/vendor/wrangler-mime/lite.js +0 -4
  192. package/vendor/wrangler-mime/package.json +0 -52
  193. package/vendor/wrangler-mime/types/other.js +0 -1
  194. package/vendor/wrangler-mime/types/standard.js +0 -1
  195. package/wrangler-dist/cli.js.map +0 -7
@@ -0,0 +1,130 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import { resolve } from "node:path";
4
+ import { getHttpsOptions } from "../https-options";
5
+ import { mockConsoleMethods } from "./helpers/mock-console";
6
+ import { runInTempDir } from "./helpers/run-in-tmp";
7
+
8
+ describe("getHttpsOptions()", () => {
9
+ runInTempDir({ homedir: "./home" });
10
+ const std = mockConsoleMethods();
11
+
12
+ it("should use cached values if they have not expired", async () => {
13
+ fs.mkdirSync(resolve(os.homedir(), ".wrangler/local-cert"), {
14
+ recursive: true,
15
+ });
16
+ fs.writeFileSync(
17
+ resolve(os.homedir(), ".wrangler/local-cert/key.pem"),
18
+ "PRIVATE KEY"
19
+ );
20
+ fs.writeFileSync(
21
+ resolve(os.homedir(), ".wrangler/local-cert/cert.pem"),
22
+ "PUBLIC KEY"
23
+ );
24
+ const result = await getHttpsOptions();
25
+ expect(result.key).toEqual("PRIVATE KEY");
26
+ expect(result.cert).toEqual("PUBLIC KEY");
27
+ expect(std.out).toMatchInlineSnapshot(`""`);
28
+ expect(std.warn).toMatchInlineSnapshot(`""`);
29
+ expect(std.err).toMatchInlineSnapshot(`""`);
30
+ });
31
+
32
+ it("should generate and cache new keys if none are cached", async () => {
33
+ const result = await getHttpsOptions();
34
+ const key = fs.readFileSync(
35
+ resolve(os.homedir(), ".wrangler/local-cert/key.pem"),
36
+ "utf8"
37
+ );
38
+ const cert = fs.readFileSync(
39
+ resolve(os.homedir(), ".wrangler/local-cert/cert.pem"),
40
+ "utf8"
41
+ );
42
+ expect(result.key).toEqual(key);
43
+ expect(result.cert).toEqual(cert);
44
+ expect(std.out).toMatchInlineSnapshot(
45
+ `"Generating new self-signed certificate..."`
46
+ );
47
+ expect(std.warn).toMatchInlineSnapshot(`""`);
48
+ expect(std.err).toMatchInlineSnapshot(`""`);
49
+ });
50
+
51
+ it("should generate and cache new keys if cached files have expired", async () => {
52
+ fs.mkdirSync(resolve(os.homedir(), ".wrangler/local-cert"), {
53
+ recursive: true,
54
+ });
55
+ const ORIGINAL_KEY = "EXPIRED PRIVATE KEY";
56
+ const ORIGINAL_CERT = "EXPIRED PUBLIC KEY";
57
+ fs.writeFileSync(
58
+ resolve(os.homedir(), ".wrangler/local-cert/key.pem"),
59
+ ORIGINAL_KEY
60
+ );
61
+ fs.writeFileSync(
62
+ resolve(os.homedir(), ".wrangler/local-cert/cert.pem"),
63
+ ORIGINAL_CERT
64
+ );
65
+ mockStatSync(/\.pem$/, { mtimeMs: new Date(2000).valueOf() });
66
+
67
+ const result = await getHttpsOptions();
68
+ const key = fs.readFileSync(
69
+ resolve(os.homedir(), ".wrangler/local-cert/key.pem"),
70
+ "utf8"
71
+ );
72
+ const cert = fs.readFileSync(
73
+ resolve(os.homedir(), ".wrangler/local-cert/cert.pem"),
74
+ "utf8"
75
+ );
76
+ expect(key).not.toEqual(ORIGINAL_KEY);
77
+ expect(cert).not.toEqual(ORIGINAL_CERT);
78
+ expect(result.key).toEqual(key);
79
+ expect(result.cert).toEqual(cert);
80
+ expect(std.out).toMatchInlineSnapshot(
81
+ `"Generating new self-signed certificate..."`
82
+ );
83
+ expect(std.warn).toMatchInlineSnapshot(`""`);
84
+ expect(std.err).toMatchInlineSnapshot(`""`);
85
+ });
86
+
87
+ it("should warn if not able to write to the cache", async () => {
88
+ mockWriteFileSyncThrow(/\.pem$/);
89
+ await getHttpsOptions();
90
+ expect(
91
+ fs.existsSync(resolve(os.homedir(), ".wrangler/local-cert/key.pem"))
92
+ ).toBe(false);
93
+ expect(
94
+ fs.existsSync(resolve(os.homedir(), ".wrangler/local-cert/cert.pem"))
95
+ ).toBe(false);
96
+ expect(std.out).toMatchInlineSnapshot(
97
+ `"Generating new self-signed certificate..."`
98
+ );
99
+ expect(std.warn).toMatchInlineSnapshot(`
100
+ "▲ [WARNING] Unable to cache generated self-signed certificate in home/.wrangler/local-cert.
101
+
102
+ ERROR: Cannot write file
103
+
104
+ "
105
+ `);
106
+ expect(std.err).toMatchInlineSnapshot(`""`);
107
+ });
108
+ });
109
+
110
+ function mockStatSync(matcher: RegExp, stats: Partial<fs.Stats>) {
111
+ const originalStatSync = jest.requireActual("node:fs").statSync;
112
+ jest.spyOn(fs, "statSync").mockImplementation((statPath, options) => {
113
+ return matcher.test(statPath.toString())
114
+ ? (stats as fs.Stats)
115
+ : originalStatSync(statPath, options);
116
+ });
117
+ }
118
+
119
+ function mockWriteFileSyncThrow(matcher: RegExp) {
120
+ const originalWriteFileSync = jest.requireActual("node:fs").writeFileSync;
121
+ jest
122
+ .spyOn(fs, "writeFileSync")
123
+ .mockImplementation((filePath, data, options) => {
124
+ if (matcher.test(filePath.toString())) {
125
+ throw new Error("ERROR: Cannot write file");
126
+ } else {
127
+ return originalWriteFileSync(filePath, data, options);
128
+ }
129
+ });
130
+ }
@@ -1,289 +1,260 @@
1
- import * as fsp from "node:fs/promises";
2
- import * as TOML from "@iarna/toml";
3
- import { mockConfirm } from "./mock-dialogs";
4
- import { runWrangler } from "./run-wrangler";
5
- import { runInTempDir } from "./run-in-tmp";
6
- import * as fs from "node:fs";
1
+ import { getPackageManager } from "../package-manager";
2
+ import { mockConsoleMethods } from "./helpers/mock-console";
3
+ import { runInTempDir } from "./helpers/run-in-tmp";
4
+ import { runWrangler } from "./helpers/run-wrangler";
5
+ import { writeWorkerSource } from "./helpers/write-worker-source";
6
+ import writeWranglerToml from "./helpers/write-wrangler-toml";
7
+ import type { PackageManager } from "../package-manager";
7
8
 
8
9
  describe("wrangler", () => {
9
- runInTempDir();
10
-
11
- describe("no command", () => {
12
- it("should display a list of available commands", async () => {
13
- const { stdout, stderr } = await runWrangler();
14
-
15
- expect(stdout).toMatchInlineSnapshot(`
10
+ let mockPackageManager: PackageManager;
11
+ runInTempDir();
12
+
13
+ beforeEach(() => {
14
+ mockPackageManager = {
15
+ cwd: process.cwd(),
16
+ // @ts-expect-error we're making a fake package manager here
17
+ type: "mockpm",
18
+ addDevDeps: jest.fn(),
19
+ install: jest.fn(),
20
+ };
21
+ (getPackageManager as jest.Mock).mockResolvedValue(mockPackageManager);
22
+ });
23
+
24
+ const std = mockConsoleMethods();
25
+
26
+ describe("no command", () => {
27
+ it("should display a list of available commands", async () => {
28
+ await runWrangler();
29
+
30
+ expect(std.out).toMatchInlineSnapshot(`
16
31
  "wrangler
17
32
 
18
33
  Commands:
19
34
  wrangler init [name] 📥 Create a wrangler.toml configuration file
20
- wrangler whoami 🕵️ Retrieve your user info and test your auth config
21
- wrangler dev <filename> 👂 Start a local server for developing your worker
35
+ wrangler dev [script] 👂 Start a local server for developing your worker
22
36
  wrangler publish [script] 🆙 Publish your Worker to Cloudflare.
23
- wrangler tail [name] 🦚 Starts a log tailing session for a deployed Worker.
37
+ wrangler tail [name] 🦚 Starts a log tailing session for a published Worker.
24
38
  wrangler secret 🤫 Generate a secret that can be referenced in the worker script
25
39
  wrangler kv:namespace 🗂️ Interact with your Workers KV Namespaces
26
40
  wrangler kv:key 🔑 Individually manage Workers KV key-value pairs
27
41
  wrangler kv:bulk 💪 Interact with multiple Workers KV key-value pairs at once
28
42
  wrangler pages ⚡️ Configure Cloudflare Pages
43
+ wrangler r2 📦 Interact with an R2 store
44
+ wrangler pubsub 📮 Interact and manage Pub/Sub Brokers
45
+ wrangler login 🔓 Login to Cloudflare
46
+ wrangler logout 🚪 Logout from Cloudflare
47
+ wrangler whoami 🕵️ Retrieve your user info and test your auth config
29
48
 
30
49
  Flags:
31
50
  -c, --config Path to .toml configuration file [string]
32
51
  -h, --help Show help [boolean]
33
- -v, --version Show version number [boolean]
34
-
35
- Options:
36
- -l, --local Run on my machine [boolean] [default: false]"
52
+ -v, --version Show version number [boolean]"
37
53
  `);
38
54
 
39
- expect(stderr).toMatchInlineSnapshot(`""`);
40
- });
41
- });
55
+ expect(std.err).toMatchInlineSnapshot(`""`);
56
+ });
57
+ });
42
58
 
43
- describe("invalid command", () => {
44
- it("should display an error", async () => {
45
- const { error, stdout, stderr } = await runWrangler("invalid-command");
59
+ describe("invalid command", () => {
60
+ it("should display an error", async () => {
61
+ await expect(
62
+ runWrangler("invalid-command")
63
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
64
+ `"Unknown argument: invalid-command"`
65
+ );
46
66
 
47
- expect(stdout).toMatchInlineSnapshot(`""`);
48
- expect(stderr).toMatchInlineSnapshot(`
49
- "wrangler
67
+ expect(std.out).toMatchInlineSnapshot(`
68
+ "
69
+ wrangler
50
70
 
51
71
  Commands:
52
72
  wrangler init [name] 📥 Create a wrangler.toml configuration file
53
- wrangler whoami 🕵️ Retrieve your user info and test your auth config
54
- wrangler dev <filename> 👂 Start a local server for developing your worker
73
+ wrangler dev [script] 👂 Start a local server for developing your worker
55
74
  wrangler publish [script] 🆙 Publish your Worker to Cloudflare.
56
- wrangler tail [name] 🦚 Starts a log tailing session for a deployed Worker.
75
+ wrangler tail [name] 🦚 Starts a log tailing session for a published Worker.
57
76
  wrangler secret 🤫 Generate a secret that can be referenced in the worker script
58
77
  wrangler kv:namespace 🗂️ Interact with your Workers KV Namespaces
59
78
  wrangler kv:key 🔑 Individually manage Workers KV key-value pairs
60
79
  wrangler kv:bulk 💪 Interact with multiple Workers KV key-value pairs at once
61
80
  wrangler pages ⚡️ Configure Cloudflare Pages
81
+ wrangler r2 📦 Interact with an R2 store
82
+ wrangler pubsub 📮 Interact and manage Pub/Sub Brokers
83
+ wrangler login 🔓 Login to Cloudflare
84
+ wrangler logout 🚪 Logout from Cloudflare
85
+ wrangler whoami 🕵️ Retrieve your user info and test your auth config
62
86
 
63
87
  Flags:
64
88
  -c, --config Path to .toml configuration file [string]
65
89
  -h, --help Show help [boolean]
66
- -v, --version Show version number [boolean]
90
+ -v, --version Show version number [boolean]"
91
+ `);
92
+ expect(std.err).toMatchInlineSnapshot(`
93
+ "X [ERROR] Unknown argument: invalid-command
94
+
95
+ "
96
+ `);
97
+ });
98
+ });
99
+
100
+ describe("preview", () => {
101
+ it("should throw an error if the deprecated command is used with positional arguments", async () => {
102
+ await expect(runWrangler("preview GET")).rejects
103
+ .toThrowErrorMatchingInlineSnapshot(`
104
+ "Deprecation:
105
+ The \`wrangler preview\` command has been deprecated.
106
+ Try using \`wrangler dev\` to to try out a worker during development.
107
+ "
108
+ `);
109
+ await expect(runWrangler(`preview GET "SomeBody"`)).rejects
110
+ .toThrowErrorMatchingInlineSnapshot(`
111
+ "Deprecation:
112
+ The \`wrangler preview\` command has been deprecated.
113
+ Try using \`wrangler dev\` to to try out a worker during development.
114
+ "
115
+ `);
116
+ });
117
+ });
118
+
119
+ describe("subcommand implicit help ran on incomplete command execution", () => {
120
+ it("no subcommand for 'secret' should display a list of available subcommands", async () => {
121
+ await runWrangler("secret");
122
+ await endEventLoop();
123
+ expect(std.out).toMatchInlineSnapshot(`
124
+ "wrangler secret
125
+
126
+ 🤫 Generate a secret that can be referenced in the worker script
67
127
 
68
- Options:
69
- -l, --local Run on my machine [boolean] [default: false]
128
+ Commands:
129
+ wrangler secret put <key> Create or update a secret variable for a script
130
+ wrangler secret delete <key> Delete a secret variable from a script
131
+ wrangler secret list List all secrets for a script
70
132
 
71
- Unknown command: invalid-command."
133
+ Flags:
134
+ -c, --config Path to .toml configuration file [string]
135
+ -h, --help Show help [boolean]
136
+ -v, --version Show version number [boolean]"
72
137
  `);
73
- expect(error).toMatchInlineSnapshot(
74
- `[Error: Unknown command: invalid-command.]`
75
- );
76
- });
77
- });
78
-
79
- describe("init", () => {
80
- it("should create a wrangler.toml", async () => {
81
- mockConfirm({
82
- text: "No package.json found. Would you like to create one?",
83
- result: false,
84
- });
85
- await runWrangler("init");
86
- const parsed = TOML.parse(await fsp.readFile("./wrangler.toml", "utf-8"));
87
- expect(typeof parsed.compatibility_date).toBe("string");
88
- expect(fs.existsSync("./package.json")).toBe(false);
89
- expect(fs.existsSync("./tsconfig.json")).toBe(false);
90
- });
91
-
92
- it("should display warning when wrangler.toml already exists, and exit if user does not want to carry on", async () => {
93
- fs.writeFileSync("./wrangler.toml", "", "utf-8");
94
- mockConfirm({
95
- text: "Do you want to continue initializing this project?",
96
- result: false,
97
- });
98
- const { warnings } = await runWrangler("init");
99
- expect(warnings).toContain("wrangler.toml file already exists!");
100
- const parsed = TOML.parse(await fsp.readFile("./wrangler.toml", "utf-8"));
101
- expect(typeof parsed.compatibility_date).toBe("undefined");
102
- });
103
-
104
- it("should display warning when wrangler.toml already exists, but continue if user does want to carry on", async () => {
105
- fs.writeFileSync("./wrangler.toml", "", "utf-8");
106
- mockConfirm(
107
- {
108
- text: "Do you want to continue initializing this project?",
109
- result: true,
110
- },
111
- {
112
- text: "No package.json found. Would you like to create one?",
113
- result: false,
114
- }
115
- );
116
- const { warnings } = await runWrangler("init");
117
- expect(warnings).toContain("wrangler.toml file already exists!");
118
- const parsed = TOML.parse(await fsp.readFile("./wrangler.toml", "utf-8"));
119
- expect(typeof parsed.compatibility_date).toBe("string");
120
- });
121
-
122
- it("should create a package.json if none is found and user confirms", async () => {
123
- mockConfirm(
124
- {
125
- text: "No package.json found. Would you like to create one?",
126
- result: true,
127
- },
128
- {
129
- text: "Would you like to use typescript?",
130
- result: false,
131
- }
132
- );
133
- await runWrangler("init");
134
- expect(fs.existsSync("./package.json")).toBe(true);
135
- const packageJson = JSON.parse(
136
- fs.readFileSync("./package.json", "utf-8")
137
- );
138
- expect(packageJson.name).toEqual("worker"); // TODO: should we infer the name from the directory?
139
- expect(packageJson.version).toEqual("0.0.1");
140
- expect(fs.existsSync("./tsconfig.json")).toBe(false);
141
- });
142
-
143
- it("should not touch an existing package.json in the same directory", async () => {
144
- mockConfirm({
145
- text: "Would you like to use typescript?",
146
- result: false,
147
- });
148
-
149
- fs.writeFileSync(
150
- "./package.json",
151
- JSON.stringify({ name: "test", version: "1.0.0" }),
152
- "utf-8"
153
- );
154
-
155
- await runWrangler("init");
156
- const packageJson = JSON.parse(
157
- fs.readFileSync("./package.json", "utf-8")
158
- );
159
- expect(packageJson.name).toEqual("test");
160
- expect(packageJson.version).toEqual("1.0.0");
161
- });
162
-
163
- it("should not touch an existing package.json in an ancestor directory", async () => {
164
- mockConfirm({
165
- text: "Would you like to use typescript?",
166
- result: false,
167
- });
168
-
169
- fs.writeFileSync(
170
- "./package.json",
171
- JSON.stringify({ name: "test", version: "1.0.0" }),
172
- "utf-8"
173
- );
174
-
175
- fs.mkdirSync("./sub-1/sub-2", { recursive: true });
176
- process.chdir("./sub-1/sub-2");
177
-
178
- await runWrangler("init");
179
- expect(fs.existsSync("./package.json")).toBe(false);
180
- expect(fs.existsSync("../../package.json")).toBe(true);
181
-
182
- const packageJson = JSON.parse(
183
- fs.readFileSync("../../package.json", "utf-8")
184
- );
185
- expect(packageJson.name).toEqual("test");
186
- expect(packageJson.version).toEqual("1.0.0");
187
- });
188
-
189
- it("should create a tsconfig.json and install `workers-types` if none is found and user confirms", async () => {
190
- mockConfirm(
191
- {
192
- text: "No package.json found. Would you like to create one?",
193
- result: true,
194
- },
195
- {
196
- text: "Would you like to use typescript?",
197
- result: true,
198
- }
199
- );
200
- await runWrangler("init");
201
- expect(fs.existsSync("./tsconfig.json")).toBe(true);
202
- const tsconfigJson = JSON.parse(
203
- fs.readFileSync("./tsconfig.json", "utf-8")
204
- );
205
- expect(tsconfigJson.compilerOptions.types).toEqual([
206
- "@cloudflare/workers-types",
207
- ]);
208
- const packageJson = JSON.parse(
209
- fs.readFileSync("./package.json", "utf-8")
210
- );
211
- expect(packageJson.devDependencies).toEqual({
212
- "@cloudflare/workers-types": expect.any(String),
213
- });
214
- });
215
-
216
- it("should not touch an existing tsconfig.json in the same directory", async () => {
217
- fs.writeFileSync(
218
- "./package.json",
219
- JSON.stringify({ name: "test", version: "1.0.0" }),
220
- "utf-8"
221
- );
222
- fs.writeFileSync(
223
- "./tsconfig.json",
224
- JSON.stringify({ compilerOptions: {} }),
225
- "utf-8"
226
- );
227
-
228
- await runWrangler("init");
229
- const tsconfigJson = JSON.parse(
230
- fs.readFileSync("./tsconfig.json", "utf-8")
231
- );
232
- expect(tsconfigJson.compilerOptions).toEqual({});
233
- });
234
-
235
- it("should not touch an existing package.json in an ancestor directory", async () => {
236
- fs.writeFileSync(
237
- "./package.json",
238
- JSON.stringify({ name: "test", version: "1.0.0" }),
239
- "utf-8"
240
- );
241
- fs.writeFileSync(
242
- "./tsconfig.json",
243
- JSON.stringify({ compilerOptions: {} }),
244
- "utf-8"
245
- );
246
-
247
- fs.mkdirSync("./sub-1/sub-2", { recursive: true });
248
- process.chdir("./sub-1/sub-2");
249
-
250
- await runWrangler("init");
251
- expect(fs.existsSync("./tsconfig.json")).toBe(false);
252
- expect(fs.existsSync("../../tsconfig.json")).toBe(true);
253
-
254
- const tsconfigJson = JSON.parse(
255
- fs.readFileSync("../../tsconfig.json", "utf-8")
256
- );
257
- expect(tsconfigJson.compilerOptions).toEqual({});
258
- });
259
-
260
- it("should error if `--type` is used", async () => {
261
- const { error } = await runWrangler("init --type");
262
- expect(error).toMatchInlineSnapshot(
263
- `[Error: The --type option is no longer supported.]`
264
- );
265
- });
266
-
267
- it("should error if `--type javascript` is used", async () => {
268
- const { error } = await runWrangler("init --type javascript");
269
- expect(error).toMatchInlineSnapshot(
270
- `[Error: The --type option is no longer supported.]`
271
- );
272
- });
273
-
274
- it("should error if `--type rust` is used", async () => {
275
- const { error } = await runWrangler("init --type rust");
276
- expect(error).toMatchInlineSnapshot(
277
- `[Error: The --type option is no longer supported.]`
278
- );
279
- });
280
-
281
- it("should error if `--type webpack` is used", async () => {
282
- const { error } = await runWrangler("init --type webpack");
283
- expect(error).toMatchInlineSnapshot(`
284
- [Error: The --type option is no longer supported.
285
- If you wish to use webpack then you will need to create a custom build.]
138
+ });
139
+
140
+ it("no subcommand 'kv:namespace' should display a list of available subcommands", async () => {
141
+ await runWrangler("kv:namespace");
142
+ await endEventLoop();
143
+ expect(std.out).toMatchInlineSnapshot(`
144
+ "wrangler kv:namespace
145
+
146
+ 🗂️ Interact with your Workers KV Namespaces
147
+
148
+ Commands:
149
+ wrangler kv:namespace create <namespace> Create a new namespace
150
+ wrangler kv:namespace list Outputs a list of all KV namespaces associated with your account id.
151
+ wrangler kv:namespace delete Deletes a given namespace.
152
+
153
+ Flags:
154
+ -c, --config Path to .toml configuration file [string]
155
+ -h, --help Show help [boolean]
156
+ -v, --version Show version number [boolean]"
286
157
  `);
287
- });
288
- });
158
+ });
159
+
160
+ it("no subcommand 'kv:key' should display a list of available subcommands", async () => {
161
+ await runWrangler("kv:key");
162
+ await endEventLoop();
163
+ expect(std.out).toMatchInlineSnapshot(`
164
+ "wrangler kv:key
165
+
166
+ 🔑 Individually manage Workers KV key-value pairs
167
+
168
+ Commands:
169
+ wrangler kv:key put <key> [value] Writes a single key/value pair to the given namespace.
170
+ wrangler kv:key list Outputs a list of all keys in a given namespace.
171
+ wrangler kv:key get <key> Reads a single value by key from the given namespace.
172
+ wrangler kv:key delete <key> Removes a single key value pair from the given namespace.
173
+
174
+ Flags:
175
+ -c, --config Path to .toml configuration file [string]
176
+ -h, --help Show help [boolean]
177
+ -v, --version Show version number [boolean]"
178
+ `);
179
+ });
180
+
181
+ it("no subcommand 'kv:bulk' should display a list of available subcommands", async () => {
182
+ await runWrangler("kv:bulk");
183
+ await endEventLoop();
184
+ expect(std.out).toMatchInlineSnapshot(`
185
+ "wrangler kv:bulk
186
+
187
+ 💪 Interact with multiple Workers KV key-value pairs at once
188
+
189
+ Commands:
190
+ wrangler kv:bulk put <filename> Upload multiple key-value pairs to a namespace
191
+ wrangler kv:bulk delete <filename> Delete multiple key-value pairs from a namespace
192
+
193
+ Flags:
194
+ -c, --config Path to .toml configuration file [string]
195
+ -h, --help Show help [boolean]
196
+ -v, --version Show version number [boolean]"
197
+ `);
198
+ });
199
+
200
+ it("no subcommand 'r2' should display a list of available subcommands", async () => {
201
+ await runWrangler("r2");
202
+ await endEventLoop();
203
+ expect(std.out).toMatchInlineSnapshot(`
204
+ "wrangler r2
205
+
206
+ 📦 Interact with an R2 store
207
+
208
+ Commands:
209
+ wrangler r2 bucket Manage R2 buckets
210
+
211
+ Flags:
212
+ -c, --config Path to .toml configuration file [string]
213
+ -h, --help Show help [boolean]
214
+ -v, --version Show version number [boolean]"
215
+ `);
216
+ });
217
+ });
218
+
219
+ describe("Deprecated commands", () => {
220
+ it("should print a deprecation message for 'generate'", async () => {
221
+ await runWrangler("generate").catch((err) => {
222
+ expect(err.message).toMatchInlineSnapshot(`
223
+ "Deprecation:
224
+ \`wrangler generate\` has been deprecated.
225
+ Try running \`wrangler init\` to generate a basic Worker, or cloning the template repository instead:
226
+
227
+ \`\`\`
228
+ git clone https://github.com/cloudflare/worker-template
229
+ \`\`\`
230
+
231
+ Please refer to https://developers.cloudflare.com/workers/wrangler/deprecations/#generate for more information."
232
+ `);
233
+ });
234
+ });
235
+ });
236
+
237
+ it("should print a deprecation message for 'build' and then try to run `publish --dry-run --outdir`", async () => {
238
+ writeWranglerToml({
239
+ main: "index.js",
240
+ });
241
+ writeWorkerSource();
242
+ await runWrangler("build");
243
+ await endEventLoop();
244
+ expect(std.out).toMatchInlineSnapshot(`
245
+ "▲ [WARNING] Deprecation: \`wrangler build\` has been deprecated.
246
+
247
+ Please refer to https://developers.cloudflare.com/workers/wrangler/migration/deprecations/#build
248
+ for more information.
249
+ Attempting to run \`wrangler publish --dry-run --outdir=dist\` for you instead:
250
+
251
+
252
+ --dry-run: exiting now.
253
+ Total Upload: 0xx KiB / gzip: 0xx KiB"
254
+ `);
255
+ });
289
256
  });
257
+
258
+ function endEventLoop() {
259
+ return new Promise((resolve) => setImmediate(resolve));
260
+ }