wrangler 2.0.12 → 2.0.16

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 (149) hide show
  1. package/README.md +7 -1
  2. package/bin/wrangler.js +111 -57
  3. package/miniflare-dist/index.mjs +9 -2
  4. package/package.json +156 -154
  5. package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
  6. package/src/__tests__/config-cache.test.ts +30 -24
  7. package/src/__tests__/configuration.test.ts +3935 -3476
  8. package/src/__tests__/dev.test.tsx +1128 -979
  9. package/src/__tests__/guess-worker-format.test.ts +68 -68
  10. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  11. package/src/__tests__/helpers/faye-websocket.d.ts +4 -4
  12. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  13. package/src/__tests__/helpers/mock-bin.ts +20 -20
  14. package/src/__tests__/helpers/mock-cfetch.ts +92 -92
  15. package/src/__tests__/helpers/mock-console.ts +49 -39
  16. package/src/__tests__/helpers/mock-dialogs.ts +94 -71
  17. package/src/__tests__/helpers/mock-http-server.ts +30 -30
  18. package/src/__tests__/helpers/mock-istty.ts +65 -18
  19. package/src/__tests__/helpers/mock-kv.ts +26 -26
  20. package/src/__tests__/helpers/mock-oauth-flow.ts +223 -228
  21. package/src/__tests__/helpers/mock-process.ts +39 -0
  22. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  23. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  24. package/src/__tests__/helpers/run-in-tmp.ts +27 -27
  25. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  26. package/src/__tests__/helpers/write-worker-source.ts +16 -16
  27. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  28. package/src/__tests__/https-options.test.ts +104 -104
  29. package/src/__tests__/index.test.ts +239 -234
  30. package/src/__tests__/init.test.ts +1605 -1250
  31. package/src/__tests__/jest.setup.ts +63 -33
  32. package/src/__tests__/kv.test.ts +1128 -1011
  33. package/src/__tests__/logger.test.ts +100 -74
  34. package/src/__tests__/package-manager.test.ts +303 -303
  35. package/src/__tests__/pages.test.ts +1152 -652
  36. package/src/__tests__/parse.test.ts +252 -252
  37. package/src/__tests__/publish.test.ts +6371 -5622
  38. package/src/__tests__/pubsub.test.ts +367 -0
  39. package/src/__tests__/r2.test.ts +133 -133
  40. package/src/__tests__/route.test.ts +18 -18
  41. package/src/__tests__/secret.test.ts +382 -377
  42. package/src/__tests__/tail.test.ts +530 -530
  43. package/src/__tests__/user.test.ts +123 -111
  44. package/src/__tests__/whoami.test.tsx +198 -117
  45. package/src/__tests__/worker-namespace.test.ts +327 -0
  46. package/src/abort.d.ts +1 -1
  47. package/src/api/dev.ts +49 -0
  48. package/src/api/index.ts +1 -0
  49. package/src/bundle-reporter.tsx +29 -0
  50. package/src/bundle.ts +157 -149
  51. package/src/cfetch/index.ts +80 -80
  52. package/src/cfetch/internal.ts +90 -83
  53. package/src/cli.ts +21 -7
  54. package/src/config/config.ts +204 -195
  55. package/src/config/diagnostics.ts +61 -61
  56. package/src/config/environment.ts +390 -357
  57. package/src/config/index.ts +206 -193
  58. package/src/config/validation-helpers.ts +366 -366
  59. package/src/config/validation.ts +1573 -1376
  60. package/src/config-cache.ts +79 -41
  61. package/src/create-worker-preview.ts +206 -136
  62. package/src/create-worker-upload-form.ts +247 -238
  63. package/src/dev/dev-vars.ts +13 -13
  64. package/src/dev/dev.tsx +329 -307
  65. package/src/dev/local.tsx +304 -275
  66. package/src/dev/remote.tsx +366 -224
  67. package/src/dev/use-esbuild.ts +126 -91
  68. package/src/dev.tsx +538 -0
  69. package/src/dialogs.tsx +97 -97
  70. package/src/durable.ts +87 -87
  71. package/src/entry.ts +234 -228
  72. package/src/environment-variables.ts +23 -23
  73. package/src/errors.ts +6 -6
  74. package/src/generate.ts +33 -0
  75. package/src/git-client.ts +42 -0
  76. package/src/https-options.ts +79 -79
  77. package/src/index.tsx +1775 -2763
  78. package/src/init.ts +549 -0
  79. package/src/inspect.ts +593 -593
  80. package/src/intl-polyfill.d.ts +123 -123
  81. package/src/is-interactive.ts +12 -0
  82. package/src/kv.ts +277 -277
  83. package/src/logger.ts +46 -39
  84. package/src/miniflare-cli/enum-keys.ts +8 -8
  85. package/src/miniflare-cli/index.ts +42 -31
  86. package/src/miniflare-cli/request-context.ts +18 -18
  87. package/src/module-collection.ts +212 -212
  88. package/src/open-in-browser.ts +4 -6
  89. package/src/package-manager.ts +123 -123
  90. package/src/pages/build.tsx +202 -0
  91. package/src/pages/constants.ts +7 -0
  92. package/src/pages/deployments.tsx +101 -0
  93. package/src/pages/dev.tsx +964 -0
  94. package/src/pages/functions/buildPlugin.ts +105 -0
  95. package/src/pages/functions/buildWorker.ts +151 -0
  96. package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
  97. package/src/pages/functions/filepath-routing.ts +189 -0
  98. package/src/pages/functions/identifiers.ts +78 -0
  99. package/src/pages/functions/routes.ts +151 -0
  100. package/src/pages/index.tsx +84 -0
  101. package/src/pages/projects.tsx +157 -0
  102. package/src/pages/publish.tsx +335 -0
  103. package/src/pages/types.ts +40 -0
  104. package/src/pages/upload.tsx +384 -0
  105. package/src/pages/utils.ts +12 -0
  106. package/src/parse.ts +202 -138
  107. package/src/paths.ts +6 -6
  108. package/src/preview.ts +31 -0
  109. package/src/proxy.ts +400 -402
  110. package/src/publish.ts +667 -621
  111. package/src/pubsub/index.ts +286 -0
  112. package/src/pubsub/pubsub-commands.tsx +577 -0
  113. package/src/r2.ts +19 -19
  114. package/src/selfsigned.d.ts +23 -23
  115. package/src/sites.tsx +271 -225
  116. package/src/tail/filters.ts +108 -108
  117. package/src/tail/index.ts +217 -217
  118. package/src/tail/printing.ts +45 -45
  119. package/src/update-check.ts +11 -11
  120. package/src/user/choose-account.tsx +60 -0
  121. package/src/user/env-vars.ts +46 -0
  122. package/src/user/generate-auth-url.ts +33 -0
  123. package/src/user/generate-random-state.ts +16 -0
  124. package/src/user/index.ts +3 -0
  125. package/src/user/user.tsx +1161 -0
  126. package/src/whoami.tsx +61 -42
  127. package/src/worker-namespace.ts +190 -0
  128. package/src/worker.ts +110 -100
  129. package/src/zones.ts +39 -36
  130. package/templates/checked-fetch.js +17 -0
  131. package/templates/new-worker-scheduled.js +3 -3
  132. package/templates/new-worker-scheduled.ts +15 -15
  133. package/templates/new-worker.js +3 -3
  134. package/templates/new-worker.ts +15 -15
  135. package/templates/no-op-worker.js +10 -0
  136. package/templates/pages-template-plugin.ts +155 -0
  137. package/templates/pages-template-worker.ts +161 -0
  138. package/templates/static-asset-facade.js +31 -31
  139. package/templates/tsconfig.json +95 -95
  140. package/wrangler-dist/cli.js +55383 -54138
  141. package/pages/functions/buildPlugin.ts +0 -105
  142. package/pages/functions/buildWorker.ts +0 -151
  143. package/pages/functions/filepath-routing.ts +0 -189
  144. package/pages/functions/identifiers.ts +0 -78
  145. package/pages/functions/routes.ts +0 -156
  146. package/pages/functions/template-plugin.ts +0 -147
  147. package/pages/functions/template-worker.ts +0 -143
  148. package/src/pages.tsx +0 -2093
  149. package/src/user.tsx +0 -1214
@@ -1,5 +1,4 @@
1
1
  import * as fs from "node:fs";
2
- import * as fsp from "node:fs/promises";
3
2
  import path from "node:path";
4
3
  import * as TOML from "@iarna/toml";
5
4
  import { execa, execaSync } from "execa";
@@ -8,48 +7,61 @@ import { version as wranglerVersion } from "../../package.json";
8
7
  import { getPackageManager } from "../package-manager";
9
8
  import { mockConsoleMethods } from "./helpers/mock-console";
10
9
  import {
11
- mockConfirm,
12
- clearConfirmMocks,
13
- mockSelect,
14
- clearSelectMocks,
10
+ mockConfirm,
11
+ clearConfirmMocks,
12
+ mockSelect,
13
+ clearSelectMocks,
15
14
  } from "./helpers/mock-dialogs";
16
15
  import { runInTempDir } from "./helpers/run-in-tmp";
17
16
  import { runWrangler } from "./helpers/run-wrangler";
18
- import type { RawConfig } from "../config";
19
17
  import type { PackageManager } from "../package-manager";
20
18
 
19
+ /**
20
+ * An expectation matcher for the minimal generated wrangler.toml.
21
+ */
22
+ const MINIMAL_WRANGLER_TOML = {
23
+ compatibility_date: expect.any(String),
24
+ name: expect.stringContaining("wrangler-tests"),
25
+ main: "src/index.ts",
26
+ };
27
+
21
28
  describe("init", () => {
22
- let mockPackageManager: PackageManager;
23
- runInTempDir();
24
-
25
- beforeEach(() => {
26
- mockPackageManager = {
27
- cwd: process.cwd(),
28
- // @ts-expect-error we're making a fake package manager here
29
- type: "mockpm",
30
- addDevDeps: jest.fn(),
31
- install: jest.fn(),
32
- };
33
- (getPackageManager as jest.Mock).mockResolvedValue(mockPackageManager);
34
- });
35
-
36
- afterEach(() => {
37
- clearConfirmMocks();
38
- clearSelectMocks();
39
- });
40
-
41
- const std = mockConsoleMethods();
42
-
43
- describe("options", () => {
44
- it("should initialize with no interactive prompts if `--yes` is used", async () => {
45
- await runWrangler("init --yes");
46
-
47
- expect(fs.existsSync("./src/index.js")).toBe(false);
48
- expect(fs.existsSync("./src/index.ts")).toBe(true);
49
- expect(fs.existsSync("./tsconfig.json")).toBe(true);
50
- expect(fs.existsSync("./package.json")).toBe(true);
51
- expect(fs.existsSync("./wrangler.toml")).toBe(true);
52
- expect(std.out).toMatchInlineSnapshot(`
29
+ let mockPackageManager: PackageManager;
30
+ runInTempDir();
31
+
32
+ beforeEach(() => {
33
+ mockPackageManager = {
34
+ cwd: process.cwd(),
35
+ // @ts-expect-error we're making a fake package manager here
36
+ type: "mockpm",
37
+ addDevDeps: jest.fn(),
38
+ install: jest.fn(),
39
+ };
40
+ (getPackageManager as jest.Mock).mockResolvedValue(mockPackageManager);
41
+ });
42
+
43
+ afterEach(() => {
44
+ clearConfirmMocks();
45
+ clearSelectMocks();
46
+ });
47
+
48
+ const std = mockConsoleMethods();
49
+
50
+ describe("options", () => {
51
+ it("should initialize with no interactive prompts if `--yes` is used", async () => {
52
+ await runWrangler("init --yes");
53
+
54
+ checkFiles({
55
+ items: {
56
+ "./src/index.js": false,
57
+ "./src/index.ts": true,
58
+ "./tsconfig.json": true,
59
+ "./package.json": true,
60
+ "./wrangler.toml": true,
61
+ },
62
+ });
63
+
64
+ expect(std.out).toMatchInlineSnapshot(`
53
65
  "✨ Created wrangler.toml
54
66
  ✨ Initialized git repository
55
67
  ✨ Created package.json
@@ -60,23 +72,27 @@ describe("init", () => {
60
72
  To start developing your Worker, run \`npm start\`
61
73
  To publish your Worker to the Internet, run \`npm run deploy\`"
62
74
  `);
63
- expect(std.err).toMatchInlineSnapshot(`""`);
64
- expect(std.warn).toMatchInlineSnapshot(`""`);
65
- });
66
-
67
- it("should initialize with no interactive prompts if `--yes` is used (named worker)", async () => {
68
- await runWrangler("init my-worker --yes");
69
-
70
- expect(fs.existsSync("./my-worker/src/index.js")).toBe(false);
71
- expect(fs.existsSync("./my-worker/src/index.ts")).toBe(true);
72
- expect(fs.existsSync("./my-worker/tsconfig.json")).toBe(true);
73
- expect(fs.existsSync("./my-worker/package.json")).toBe(true);
74
- expect(fs.existsSync("./my-worker/wrangler.toml")).toBe(true);
75
- const parsedWranglerToml = TOML.parse(
76
- fs.readFileSync("./my-worker/wrangler.toml", "utf-8")
77
- );
78
- expect(parsedWranglerToml.main).toEqual("src/index.ts");
79
- expect(std.out).toMatchInlineSnapshot(`
75
+ expect(std.err).toMatchInlineSnapshot(`""`);
76
+ expect(std.warn).toMatchInlineSnapshot(`""`);
77
+ });
78
+
79
+ it("should initialize with no interactive prompts if `--yes` is used (named worker)", async () => {
80
+ await runWrangler("init my-worker --yes");
81
+
82
+ checkFiles({
83
+ items: {
84
+ "./my-worker/src/index.js": false,
85
+ "./my-worker/src/index.ts": true,
86
+ "./my-worker/tsconfig.json": true,
87
+ "./my-worker/package.json": true,
88
+ "./my-worker/wrangler.toml": wranglerToml({
89
+ ...MINIMAL_WRANGLER_TOML,
90
+ name: "my-worker",
91
+ }),
92
+ },
93
+ });
94
+
95
+ expect(std.out).toMatchInlineSnapshot(`
80
96
  "✨ Created my-worker/wrangler.toml
81
97
  ✨ Initialized git repository at my-worker
82
98
  ✨ Created my-worker/package.json
@@ -87,19 +103,24 @@ describe("init", () => {
87
103
  To start developing your Worker, run \`cd my-worker && npm start\`
88
104
  To publish your Worker to the Internet, run \`npm run deploy\`"
89
105
  `);
90
- expect(std.err).toMatchInlineSnapshot(`""`);
91
- expect(std.warn).toMatchInlineSnapshot(`""`);
92
- });
93
-
94
- it("should initialize with no interactive prompts if `-y` is used", async () => {
95
- await runWrangler("init -y");
96
-
97
- expect(fs.existsSync("./src/index.js")).toBe(false);
98
- expect(fs.existsSync("./src/index.ts")).toBe(true);
99
- expect(fs.existsSync("./tsconfig.json")).toBe(true);
100
- expect(fs.existsSync("./package.json")).toBe(true);
101
- expect(fs.existsSync("./wrangler.toml")).toBe(true);
102
- expect(std).toMatchInlineSnapshot(`
106
+ expect(std.err).toMatchInlineSnapshot(`""`);
107
+ expect(std.warn).toMatchInlineSnapshot(`""`);
108
+ });
109
+
110
+ it("should initialize with no interactive prompts if `-y` is used", async () => {
111
+ await runWrangler("init -y");
112
+
113
+ checkFiles({
114
+ items: {
115
+ "./src/index.js": false,
116
+ "./src/index.ts": true,
117
+ "./tsconfig.json": true,
118
+ "./package.json": true,
119
+ "./wrangler.toml": true,
120
+ },
121
+ });
122
+
123
+ expect(std).toMatchInlineSnapshot(`
103
124
  Object {
104
125
  "debug": "",
105
126
  "err": "",
@@ -115,35 +136,35 @@ describe("init", () => {
115
136
  "warn": "",
116
137
  }
117
138
  `);
118
- });
119
-
120
- it("should error if `--type javascript` is used", async () => {
121
- await expect(
122
- runWrangler("init --type javascript")
123
- ).rejects.toThrowErrorMatchingInlineSnapshot(
124
- `"The --type option is no longer supported."`
125
- );
126
- });
127
-
128
- it("should error if `--type rust` is used", async () => {
129
- await expect(
130
- runWrangler("init --type rust")
131
- ).rejects.toThrowErrorMatchingInlineSnapshot(
132
- `"The --type option is no longer supported."`
133
- );
134
- });
135
-
136
- it("should error if `--type webpack` is used", async () => {
137
- await expect(runWrangler("init --type webpack")).rejects
138
- .toThrowErrorMatchingInlineSnapshot(`
139
+ });
140
+
141
+ it("should error if `--type javascript` is used", async () => {
142
+ await expect(
143
+ runWrangler("init --type javascript")
144
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
145
+ `"The --type option is no longer supported."`
146
+ );
147
+ });
148
+
149
+ it("should error if `--type rust` is used", async () => {
150
+ await expect(
151
+ runWrangler("init --type rust")
152
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
153
+ `"The --type option is no longer supported."`
154
+ );
155
+ });
156
+
157
+ it("should error if `--type webpack` is used", async () => {
158
+ await expect(runWrangler("init --type webpack")).rejects
159
+ .toThrowErrorMatchingInlineSnapshot(`
139
160
  "The --type option is no longer supported.
140
161
  If you wish to use webpack then you will need to create a custom build."
141
162
  `);
142
- });
163
+ });
143
164
 
144
- it("should error if `--site` is used", async () => {
145
- await expect(runWrangler("init --site")).rejects
146
- .toThrowErrorMatchingInlineSnapshot(`
165
+ it("should error if `--site` is used", async () => {
166
+ await expect(runWrangler("init --site")).rejects
167
+ .toThrowErrorMatchingInlineSnapshot(`
147
168
  "The --site option is no longer supported.
148
169
  If you wish to create a brand new Worker Sites project then clone the \`worker-sites-template\` starter repository:
149
170
 
@@ -155,28 +176,34 @@ describe("init", () => {
155
176
  Find out more about how to create and maintain Sites projects at https://developers.cloudflare.com/workers/platform/sites.
156
177
  Have you considered using Cloudflare Pages instead? See https://pages.cloudflare.com/."
157
178
  `);
158
- });
159
- });
160
-
161
- describe("wrangler.toml", () => {
162
- it("should create a wrangler.toml", async () => {
163
- mockConfirm(
164
- {
165
- text: "Would you like to use git to manage this Worker?",
166
- result: false,
167
- },
168
- {
169
- text: "No package.json found. Would you like to create one?",
170
- result: false,
171
- }
172
- );
173
- await runWrangler("init");
174
- const parsed = TOML.parse(await fsp.readFile("./wrangler.toml", "utf-8"));
175
- expect(typeof parsed.compatibility_date).toBe("string");
176
- expect(parsed.name).toContain("wrangler-tests");
177
- expect(fs.existsSync("./package.json")).toBe(false);
178
- expect(fs.existsSync("./tsconfig.json")).toBe(false);
179
- expect(std).toMatchInlineSnapshot(`
179
+ });
180
+ });
181
+
182
+ describe("wrangler.toml", () => {
183
+ it("should create a wrangler.toml", async () => {
184
+ mockConfirm(
185
+ {
186
+ text: "Would you like to use git to manage this Worker?",
187
+ result: false,
188
+ },
189
+ {
190
+ text: "No package.json found. Would you like to create one?",
191
+ result: false,
192
+ }
193
+ );
194
+ await runWrangler("init");
195
+ checkFiles({
196
+ items: {
197
+ "wrangler.toml": wranglerToml({
198
+ compatibility_date: expect.any(String),
199
+ name: expect.stringContaining("wrangler-tests"),
200
+ }),
201
+ "package.json": false,
202
+ "tsconfig.json": false,
203
+ },
204
+ });
205
+
206
+ expect(std).toMatchInlineSnapshot(`
180
207
  Object {
181
208
  "debug": "",
182
209
  "err": "",
@@ -184,29 +211,33 @@ describe("init", () => {
184
211
  "warn": "",
185
212
  }
186
213
  `);
187
- });
188
-
189
- it("should create a wrangler.toml and a directory for a named Worker ", async () => {
190
- mockConfirm(
191
- {
192
- text: "Would you like to use git to manage this Worker?",
193
- result: false,
194
- },
195
- {
196
- text: "No package.json found. Would you like to create one?",
197
- result: false,
198
- }
199
- );
200
- await runWrangler("init my-worker");
201
- const parsed = TOML.parse(
202
- await fsp.readFile("./my-worker/wrangler.toml", "utf-8")
203
- );
204
- expect(typeof parsed.compatibility_date).toBe("string");
205
- expect(parsed.name).toBe("my-worker");
206
- expect(fs.existsSync("./my-worker/package.json")).toBe(false);
207
- expect(fs.existsSync("./my-worker/tsconfig.json")).toBe(false);
208
-
209
- expect(std).toMatchInlineSnapshot(`
214
+ });
215
+
216
+ it("should create a wrangler.toml and a directory for a named Worker ", async () => {
217
+ mockConfirm(
218
+ {
219
+ text: "Would you like to use git to manage this Worker?",
220
+ result: false,
221
+ },
222
+ {
223
+ text: "No package.json found. Would you like to create one?",
224
+ result: false,
225
+ }
226
+ );
227
+ await runWrangler("init my-worker");
228
+
229
+ checkFiles({
230
+ items: {
231
+ "my-worker/wrangler.toml": wranglerToml({
232
+ compatibility_date: expect.any(String),
233
+ name: "my-worker",
234
+ }),
235
+ "my-worker/package.json": false,
236
+ "my-worker/tsconfig.json": false,
237
+ },
238
+ });
239
+
240
+ expect(std).toMatchInlineSnapshot(`
210
241
  Object {
211
242
  "debug": "",
212
243
  "err": "",
@@ -214,24 +245,37 @@ describe("init", () => {
214
245
  "warn": "",
215
246
  }
216
247
  `);
217
- });
218
-
219
- it("should display warning when wrangler.toml already exists, and exit if user does not want to carry on", async () => {
220
- fs.writeFileSync(
221
- "./wrangler.toml",
222
- 'compatibility_date="something-else"', // use a fake value to make sure the file is not overwritten
223
- "utf-8"
224
- );
225
- mockConfirm({
226
- text: "Do you want to continue initializing this project?",
227
- result: false,
228
- });
229
- await runWrangler("init");
230
- expect(std.warn).toContain("wrangler.toml already exists!");
231
- const parsed = TOML.parse(await fsp.readFile("./wrangler.toml", "utf-8"));
232
- expect(parsed.compatibility_date).toBe("something-else");
233
-
234
- expect(std).toMatchInlineSnapshot(`
248
+ });
249
+
250
+ it("should display warning when wrangler.toml already exists, and exit if user does not want to carry on", async () => {
251
+ writeFiles({
252
+ items: {
253
+ "wrangler.toml": wranglerToml({
254
+ // use a fake value to make sure the file is not overwritten
255
+ compatibility_date: "something-else",
256
+ }),
257
+ },
258
+ });
259
+
260
+ mockConfirm({
261
+ text: "Do you want to continue initializing this project?",
262
+ result: false,
263
+ });
264
+
265
+ await runWrangler("init");
266
+ expect(std.warn).toContain("wrangler.toml already exists!");
267
+
268
+ checkFiles({
269
+ items: {
270
+ "wrangler.toml": wranglerToml({
271
+ compatibility_date: "something-else",
272
+ }),
273
+ "package.json": false,
274
+ "tsconfig.json": false,
275
+ },
276
+ });
277
+
278
+ expect(std).toMatchInlineSnapshot(`
235
279
  Object {
236
280
  "debug": "",
237
281
  "err": "",
@@ -241,26 +285,34 @@ describe("init", () => {
241
285
  ",
242
286
  }
243
287
  `);
244
- });
245
-
246
- it("should display warning when wrangler.toml already exists in the target directory, and exit if user does not want to carry on", async () => {
247
- fs.mkdirSync("path/to/worker", { recursive: true });
248
- fs.writeFileSync(
249
- "path/to/worker/wrangler.toml",
250
- 'compatibility_date="something-else"', // use a fake value to make sure the file is not overwritten
251
- "utf-8"
252
- );
253
- mockConfirm({
254
- text: "Do you want to continue initializing this project?",
255
- result: false,
256
- });
257
- await runWrangler("init path/to/worker");
258
- expect(std.warn).toContain("wrangler.toml already exists!");
259
- const parsed = TOML.parse(
260
- await fsp.readFile("path/to/worker/wrangler.toml", "utf-8")
261
- );
262
- expect(parsed.compatibility_date).toBe("something-else");
263
- expect(std).toMatchInlineSnapshot(`
288
+ });
289
+
290
+ it("should display warning when wrangler.toml already exists in the target directory, and exit if user does not want to carry on", async () => {
291
+ writeFiles({
292
+ items: {
293
+ "path/to/worker/wrangler.toml": wranglerToml({
294
+ compatibility_date: "something-else",
295
+ }),
296
+ },
297
+ });
298
+ mockConfirm({
299
+ text: "Do you want to continue initializing this project?",
300
+ result: false,
301
+ });
302
+
303
+ await runWrangler("init path/to/worker");
304
+
305
+ expect(std.warn).toContain("wrangler.toml already exists!");
306
+ checkFiles({
307
+ items: {
308
+ "path/to/worker/wrangler.toml": wranglerToml({
309
+ compatibility_date: "something-else",
310
+ }),
311
+ "package.json": false,
312
+ "tsconfig.json": false,
313
+ },
314
+ });
315
+ expect(std).toMatchInlineSnapshot(`
264
316
  Object {
265
317
  "debug": "",
266
318
  "err": "",
@@ -270,69 +322,85 @@ describe("init", () => {
270
322
  ",
271
323
  }
272
324
  `);
273
- });
274
-
275
- it("should not overwrite an existing wrangler.toml, after agreeing to other prompts", async () => {
276
- fs.writeFileSync(
277
- "./wrangler.toml",
278
- 'compatibility_date="something-else"', // use a fake value to make sure the file is not overwritten
279
- "utf-8"
280
- );
281
- mockConfirm(
282
- {
283
- text: "Would you like to use git to manage this Worker?",
284
- result: true,
285
- },
286
- {
287
- text: "Do you want to continue initializing this project?",
288
- result: true,
289
- },
290
- {
291
- text: "No package.json found. Would you like to create one?",
292
- result: true,
293
- },
294
- {
295
- text: "Would you like to use TypeScript?",
296
- result: true,
297
- }
298
- );
299
-
300
- mockSelect({
301
- text: "Would you like to create a Worker at src/index.ts?",
302
- result: "fetch",
303
- });
304
-
305
- await runWrangler("init");
306
- expect(fs.readFileSync("./wrangler.toml", "utf-8")).toMatchInlineSnapshot(
307
- `"compatibility_date=\\"something-else\\""`
308
- );
309
- });
310
-
311
- it("should display warning when wrangler.toml already exists, but continue if user does want to carry on", async () => {
312
- fs.writeFileSync(
313
- "./wrangler.toml",
314
- `compatibility_date="something-else"`,
315
- "utf-8"
316
- );
317
- mockConfirm(
318
- {
319
- text: "Do you want to continue initializing this project?",
320
- result: true,
321
- },
322
- {
323
- text: "Would you like to use git to manage this Worker?",
324
- result: false,
325
- },
326
- {
327
- text: "No package.json found. Would you like to create one?",
328
- result: false,
329
- }
330
- );
331
- await runWrangler("init");
332
- expect(std.warn).toContain("wrangler.toml already exists!");
333
- const parsed = TOML.parse(await fsp.readFile("./wrangler.toml", "utf-8"));
334
- expect(parsed.compatibility_date).toBe("something-else");
335
- expect(std).toMatchInlineSnapshot(`
325
+ });
326
+
327
+ it("should not overwrite an existing wrangler.toml, after agreeing to other prompts", async () => {
328
+ writeFiles({
329
+ items: {
330
+ "wrangler.toml": wranglerToml({
331
+ compatibility_date: "something-else",
332
+ }),
333
+ },
334
+ });
335
+ mockConfirm(
336
+ {
337
+ text: "Would you like to use git to manage this Worker?",
338
+ result: true,
339
+ },
340
+ {
341
+ text: "Do you want to continue initializing this project?",
342
+ result: true,
343
+ },
344
+ {
345
+ text: "No package.json found. Would you like to create one?",
346
+ result: true,
347
+ },
348
+ {
349
+ text: "Would you like to use TypeScript?",
350
+ result: true,
351
+ }
352
+ );
353
+
354
+ mockSelect({
355
+ text: "Would you like to create a Worker at src/index.ts?",
356
+ result: "fetch",
357
+ });
358
+
359
+ await runWrangler("init");
360
+
361
+ checkFiles({
362
+ items: {
363
+ "wrangler.toml": wranglerToml({
364
+ compatibility_date: "something-else",
365
+ }),
366
+ },
367
+ });
368
+ });
369
+
370
+ it("should display warning when wrangler.toml already exists, but continue if user does want to carry on", async () => {
371
+ writeFiles({
372
+ items: {
373
+ "wrangler.toml": wranglerToml({
374
+ compatibility_date: "something-else",
375
+ }),
376
+ },
377
+ });
378
+ mockConfirm(
379
+ {
380
+ text: "Do you want to continue initializing this project?",
381
+ result: true,
382
+ },
383
+ {
384
+ text: "Would you like to use git to manage this Worker?",
385
+ result: false,
386
+ },
387
+ {
388
+ text: "No package.json found. Would you like to create one?",
389
+ result: false,
390
+ }
391
+ );
392
+
393
+ await runWrangler("init");
394
+
395
+ expect(std.warn).toContain("wrangler.toml already exists!");
396
+ checkFiles({
397
+ items: {
398
+ "wrangler.toml": wranglerToml({
399
+ compatibility_date: "something-else",
400
+ }),
401
+ },
402
+ });
403
+ expect(std).toMatchInlineSnapshot(`
336
404
  Object {
337
405
  "debug": "",
338
406
  "err": "",
@@ -342,89 +410,109 @@ describe("init", () => {
342
410
  ",
343
411
  }
344
412
  `);
345
- });
346
-
347
- it("should not add a Cron Trigger to wrangler.toml when creating a Scheduled Worker if wrangler.toml already exists", async () => {
348
- fs.writeFileSync(
349
- "./wrangler.toml",
350
- 'compatibility_date="something-else"', // use a fake value to make sure the file is not overwritten
351
- "utf-8"
352
- );
353
- mockConfirm(
354
- {
355
- text: "Would you like to use git to manage this Worker?",
356
- result: true,
357
- },
358
- {
359
- text: "Do you want to continue initializing this project?",
360
- result: true,
361
- },
362
- {
363
- text: "No package.json found. Would you like to create one?",
364
- result: true,
365
- },
366
- {
367
- text: "Would you like to use TypeScript?",
368
- result: true,
369
- }
370
- );
371
-
372
- mockSelect({
373
- text: "Would you like to create a Worker at src/index.ts?",
374
- result: "scheduled",
375
- });
376
-
377
- await runWrangler("init");
378
- expect(fs.readFileSync("./wrangler.toml", "utf-8")).toMatchInlineSnapshot(
379
- `"compatibility_date=\\"something-else\\""`
380
- );
381
- });
382
-
383
- it("should add a Cron Trigger to wrangler.toml when creating a Scheduled Worker, but only if wrangler.toml is being created during init", async () => {
384
- mockConfirm(
385
- {
386
- text: "Would you like to use git to manage this Worker?",
387
- result: true,
388
- },
389
- {
390
- text: "No package.json found. Would you like to create one?",
391
- result: true,
392
- },
393
- {
394
- text: "Would you like to use TypeScript?",
395
- result: true,
396
- }
397
- );
398
-
399
- mockSelect({
400
- text: "Would you like to create a Worker at src/index.ts?",
401
- result: "scheduled",
402
- });
403
-
404
- await runWrangler("init");
405
- const parsed = TOML.parse(
406
- await fsp.readFile("./wrangler.toml", "utf-8")
407
- ) as RawConfig;
408
- expect(typeof parsed.compatibility_date).toBe("string");
409
- expect(parsed.name).toContain("wrangler-tests");
410
- expect(parsed?.triggers?.crons[0]).toEqual("1 * * * *");
411
- });
412
- });
413
-
414
- describe("git init", () => {
415
- it("should offer to initialize a git repository", async () => {
416
- mockConfirm(
417
- {
418
- text: "Would you like to use git to manage this Worker?",
419
- result: true,
420
- },
421
- {
422
- text: "No package.json found. Would you like to create one?",
423
- result: false,
424
- }
425
- );
426
- await runWrangler("init");
427
- expect(std).toMatchInlineSnapshot(`
413
+ });
414
+
415
+ it("should not add a Cron Trigger to wrangler.toml when creating a Scheduled Worker if wrangler.toml already exists", async () => {
416
+ writeFiles({
417
+ items: {
418
+ "wrangler.toml": wranglerToml({
419
+ compatibility_date: "something-else",
420
+ }),
421
+ },
422
+ });
423
+ mockConfirm(
424
+ {
425
+ text: "Would you like to use git to manage this Worker?",
426
+ result: true,
427
+ },
428
+ {
429
+ text: "Do you want to continue initializing this project?",
430
+ result: true,
431
+ },
432
+ {
433
+ text: "No package.json found. Would you like to create one?",
434
+ result: true,
435
+ },
436
+ {
437
+ text: "Would you like to use TypeScript?",
438
+ result: true,
439
+ }
440
+ );
441
+ mockSelect({
442
+ text: "Would you like to create a Worker at src/index.ts?",
443
+ result: "scheduled",
444
+ });
445
+
446
+ await runWrangler("init");
447
+
448
+ checkFiles({
449
+ items: {
450
+ "wrangler.toml": wranglerToml({
451
+ compatibility_date: "something-else",
452
+ }),
453
+ },
454
+ });
455
+ });
456
+
457
+ it("should add a Cron Trigger to wrangler.toml when creating a Scheduled Worker, but only if wrangler.toml is being created during init", async () => {
458
+ mockConfirm(
459
+ {
460
+ text: "Would you like to use git to manage this Worker?",
461
+ result: true,
462
+ },
463
+ {
464
+ text: "No package.json found. Would you like to create one?",
465
+ result: true,
466
+ },
467
+ {
468
+ text: "Would you like to use TypeScript?",
469
+ result: true,
470
+ }
471
+ );
472
+ mockSelect({
473
+ text: "Would you like to create a Worker at src/index.ts?",
474
+ result: "scheduled",
475
+ });
476
+
477
+ await runWrangler("init");
478
+
479
+ checkFiles({
480
+ items: {
481
+ "wrangler.toml": wranglerToml({
482
+ ...MINIMAL_WRANGLER_TOML,
483
+ triggers: { crons: ["1 * * * *"] },
484
+ }),
485
+ },
486
+ });
487
+ });
488
+ });
489
+
490
+ describe("git init", () => {
491
+ it("should offer to initialize a git repository", async () => {
492
+ mockConfirm(
493
+ {
494
+ text: "Would you like to use git to manage this Worker?",
495
+ result: true,
496
+ },
497
+ {
498
+ text: "No package.json found. Would you like to create one?",
499
+ result: false,
500
+ }
501
+ );
502
+
503
+ await runWrangler("init");
504
+
505
+ checkFiles({
506
+ items: {
507
+ "wrangler.toml": wranglerToml({
508
+ compatibility_date: expect.any(String),
509
+ name: expect.stringContaining("wrangler-tests"),
510
+ }),
511
+ ".git": { items: {} },
512
+ ".gitignore": true,
513
+ },
514
+ });
515
+ expect(std).toMatchInlineSnapshot(`
428
516
  Object {
429
517
  "debug": "",
430
518
  "err": "",
@@ -433,21 +521,30 @@ describe("init", () => {
433
521
  "warn": "",
434
522
  }
435
523
  `);
436
- expect(fs.lstatSync(".git").isDirectory()).toBe(true);
437
- expect(fs.lstatSync(".gitignore").isFile()).toBe(true);
438
- expect((await execa("git", ["branch", "--show-current"])).stdout).toEqual(
439
- "main"
440
- );
441
- });
442
-
443
- it("should not offer to initialize a git repo if it's already inside one", async () => {
444
- await execa("git", ["init"]);
445
- fs.mkdirSync("some-folder");
446
- process.chdir("some-folder");
447
- await runWrangler("init -y");
448
-
449
- // Note the lack of "✨ Initialized git repository" in the log
450
- expect(std).toMatchInlineSnapshot(`
524
+ expect((await execa("git", ["branch", "--show-current"])).stdout).toEqual(
525
+ "main"
526
+ );
527
+ });
528
+
529
+ it("should not offer to initialize a git repo if it's already inside one", async () => {
530
+ await execa("git", ["init"]);
531
+ setWorkingDirectory("some-folder");
532
+
533
+ await runWrangler("init -y");
534
+
535
+ checkFiles({
536
+ items: {
537
+ "wrangler.toml": wranglerToml({
538
+ ...MINIMAL_WRANGLER_TOML,
539
+ name: "some-folder",
540
+ }),
541
+ ".git": { items: {} },
542
+ ".gitignore": false,
543
+ },
544
+ });
545
+
546
+ // Note the lack of "✨ Initialized git repository" in the log
547
+ expect(std).toMatchInlineSnapshot(`
451
548
  Object {
452
549
  "debug": "",
453
550
  "err": "",
@@ -462,17 +559,17 @@ describe("init", () => {
462
559
  "warn": "",
463
560
  }
464
561
  `);
465
- });
562
+ });
466
563
 
467
- it("should not offer to initialize a git repo if it's already inside one (when using a path as name)", async () => {
468
- fs.mkdirSync("path/to/worker", { recursive: true });
469
- await execa("git", ["init"], { cwd: "path/to/worker" });
470
- expect(fs.lstatSync("path/to/worker/.git").isDirectory()).toBe(true);
564
+ it("should not offer to initialize a git repo if it's already inside one (when using a path as name)", async () => {
565
+ fs.mkdirSync("path/to/worker", { recursive: true });
566
+ await execa("git", ["init"], { cwd: "path/to/worker" });
567
+ expect(fs.lstatSync("path/to/worker/.git").isDirectory()).toBe(true);
471
568
 
472
- await runWrangler("init path/to/worker/my-worker -y");
569
+ await runWrangler("init path/to/worker/my-worker -y");
473
570
 
474
- // Note the lack of "✨ Initialized git repository" in the log
475
- expect(std).toMatchInlineSnapshot(`
571
+ // Note the lack of "✨ Initialized git repository" in the log
572
+ expect(std).toMatchInlineSnapshot(`
476
573
  Object {
477
574
  "debug": "",
478
575
  "err": "",
@@ -487,26 +584,26 @@ describe("init", () => {
487
584
  "warn": "",
488
585
  }
489
586
  `);
490
- });
491
-
492
- // I... don't know how to test this lol
493
- it.todo(
494
- "should not offer to initialize a git repo if git is not installed"
495
- );
496
-
497
- it("should initialize git repo with `main` default branch", async () => {
498
- mockConfirm(
499
- {
500
- text: "Would you like to use git to manage this Worker?",
501
- result: true,
502
- },
503
- {
504
- text: "No package.json found. Would you like to create one?",
505
- result: false,
506
- }
507
- );
508
- await runWrangler("init");
509
- expect(std).toMatchInlineSnapshot(`
587
+ });
588
+
589
+ // I... don't know how to test this lol
590
+ it.todo(
591
+ "should not offer to initialize a git repo if git is not installed"
592
+ );
593
+
594
+ it("should initialize git repo with `main` default branch", async () => {
595
+ mockConfirm(
596
+ {
597
+ text: "Would you like to use git to manage this Worker?",
598
+ result: true,
599
+ },
600
+ {
601
+ text: "No package.json found. Would you like to create one?",
602
+ result: false,
603
+ }
604
+ );
605
+ await runWrangler("init");
606
+ expect(std).toMatchInlineSnapshot(`
510
607
  Object {
511
608
  "debug": "",
512
609
  "err": "",
@@ -516,45 +613,51 @@ describe("init", () => {
516
613
  }
517
614
  `);
518
615
 
519
- expect(execaSync("git", ["symbolic-ref", "HEAD"]).stdout).toEqual(
520
- "refs/heads/main"
521
- );
522
- });
523
- });
524
-
525
- describe("package.json", () => {
526
- it("should create a package.json if none is found and user confirms", async () => {
527
- mockConfirm(
528
- {
529
- text: "Would you like to use git to manage this Worker?",
530
- result: false,
531
- },
532
- {
533
- text: "No package.json found. Would you like to create one?",
534
- result: true,
535
- },
536
- {
537
- text: "Would you like to use TypeScript?",
538
- result: false,
539
- }
540
- );
541
- mockSelect({
542
- text: "Would you like to create a Worker at src/index.js?",
543
- result: "none",
544
- });
545
- await runWrangler("init");
546
- expect(fs.existsSync("./package.json")).toBe(true);
547
- const packageJson = JSON.parse(
548
- fs.readFileSync("./package.json", "utf-8")
549
- );
550
- expect(packageJson.name).toContain("wrangler-tests");
551
- expect(packageJson.version).toEqual("0.0.0");
552
- expect(packageJson.devDependencies).toEqual({
553
- wrangler: expect.any(String),
554
- });
555
- expect(fs.existsSync("./tsconfig.json")).toBe(false);
556
- expect(mockPackageManager.install).toHaveBeenCalled();
557
- expect(std).toMatchInlineSnapshot(`
616
+ expect(execaSync("git", ["symbolic-ref", "HEAD"]).stdout).toEqual(
617
+ "refs/heads/main"
618
+ );
619
+ });
620
+ });
621
+
622
+ describe("package.json", () => {
623
+ it("should create a package.json if none is found and user confirms", async () => {
624
+ mockConfirm(
625
+ {
626
+ text: "Would you like to use git to manage this Worker?",
627
+ result: false,
628
+ },
629
+ {
630
+ text: "No package.json found. Would you like to create one?",
631
+ result: true,
632
+ },
633
+ {
634
+ text: "Would you like to use TypeScript?",
635
+ result: false,
636
+ }
637
+ );
638
+ mockSelect({
639
+ text: "Would you like to create a Worker at src/index.js?",
640
+ result: "none",
641
+ });
642
+
643
+ await runWrangler("init");
644
+
645
+ checkFiles({
646
+ items: {
647
+ "package.json": {
648
+ contents: expect.objectContaining({
649
+ name: expect.stringContaining("wrangler-tests"),
650
+ version: "0.0.0",
651
+ devDependencies: {
652
+ wrangler: expect.any(String),
653
+ },
654
+ }),
655
+ },
656
+ "tsconfig.json": false,
657
+ },
658
+ });
659
+ expect(mockPackageManager.install).toHaveBeenCalled();
660
+ expect(std).toMatchInlineSnapshot(`
558
661
  Object {
559
662
  "debug": "",
560
663
  "err": "",
@@ -563,33 +666,45 @@ describe("init", () => {
563
666
  "warn": "",
564
667
  }
565
668
  `);
566
- });
567
-
568
- it("should create a package.json, with the specified name, if none is found and user confirms", async () => {
569
- mockConfirm(
570
- {
571
- text: "Would you like to use git to manage this Worker?",
572
- result: false,
573
- },
574
- {
575
- text: "No package.json found. Would you like to create one?",
576
- result: true,
577
- },
578
- {
579
- text: "Would you like to use TypeScript?",
580
- result: false,
581
- }
582
- );
583
- mockSelect({
584
- text: "Would you like to create a Worker at my-worker/src/index.js?",
585
- result: "none",
586
- });
587
- await runWrangler("init my-worker");
588
- const packageJson = JSON.parse(
589
- fs.readFileSync("./my-worker/package.json", "utf-8")
590
- );
591
- expect(packageJson.name).toBe("my-worker");
592
- expect(std).toMatchInlineSnapshot(`
669
+ });
670
+
671
+ it("should create a package.json, with the specified name, if none is found and user confirms", async () => {
672
+ mockConfirm(
673
+ {
674
+ text: "Would you like to use git to manage this Worker?",
675
+ result: false,
676
+ },
677
+ {
678
+ text: "No package.json found. Would you like to create one?",
679
+ result: true,
680
+ },
681
+ {
682
+ text: "Would you like to use TypeScript?",
683
+ result: false,
684
+ }
685
+ );
686
+ mockSelect({
687
+ text: "Would you like to create a Worker at my-worker/src/index.js?",
688
+ result: "none",
689
+ });
690
+
691
+ await runWrangler("init my-worker");
692
+
693
+ checkFiles({
694
+ items: {
695
+ "my-worker/package.json": {
696
+ contents: expect.objectContaining({
697
+ name: "my-worker",
698
+ version: "0.0.0",
699
+ devDependencies: {
700
+ wrangler: expect.any(String),
701
+ },
702
+ }),
703
+ },
704
+ "my-worker/tsconfig.json": false,
705
+ },
706
+ });
707
+ expect(std).toMatchInlineSnapshot(`
593
708
  Object {
594
709
  "debug": "",
595
710
  "err": "",
@@ -598,41 +713,41 @@ describe("init", () => {
598
713
  "warn": "",
599
714
  }
600
715
  `);
601
- });
602
-
603
- it("should not touch an existing package.json in the same directory", async () => {
604
- mockConfirm(
605
- {
606
- text: "Would you like to use git to manage this Worker?",
607
- result: false,
608
- },
609
- {
610
- text: "Would you like to install wrangler into package.json?",
611
- result: false,
612
- },
613
- {
614
- text: "Would you like to use TypeScript?",
615
- result: false,
616
- }
617
- );
618
- mockSelect({
619
- text: "Would you like to create a Worker at src/index.js?",
620
- result: "none",
621
- });
622
-
623
- fs.writeFileSync(
624
- "./package.json",
625
- JSON.stringify({ name: "test", version: "1.0.0" }),
626
- "utf-8"
627
- );
628
-
629
- await runWrangler("init");
630
- const packageJson = JSON.parse(
631
- fs.readFileSync("./package.json", "utf-8")
632
- );
633
- expect(packageJson.name).toEqual("test");
634
- expect(packageJson.version).toEqual("1.0.0");
635
- expect(std).toMatchInlineSnapshot(`
716
+ });
717
+
718
+ it("should not touch an existing package.json in the same directory", async () => {
719
+ mockConfirm(
720
+ {
721
+ text: "Would you like to use git to manage this Worker?",
722
+ result: false,
723
+ },
724
+ {
725
+ text: "Would you like to install wrangler into package.json?",
726
+ result: false,
727
+ },
728
+ {
729
+ text: "Would you like to use TypeScript?",
730
+ result: false,
731
+ }
732
+ );
733
+ mockSelect({
734
+ text: "Would you like to create a Worker at src/index.js?",
735
+ result: "none",
736
+ });
737
+ writeFiles({
738
+ items: {
739
+ "package.json": { contents: { name: "test", version: "1.0.0" } },
740
+ },
741
+ });
742
+
743
+ await runWrangler("init");
744
+
745
+ checkFiles({
746
+ items: {
747
+ "package.json": { contents: { name: "test", version: "1.0.0" } },
748
+ },
749
+ });
750
+ expect(std).toMatchInlineSnapshot(`
636
751
  Object {
637
752
  "debug": "",
638
753
  "err": "",
@@ -640,89 +755,99 @@ describe("init", () => {
640
755
  "warn": "",
641
756
  }
642
757
  `);
643
- });
644
-
645
- it("should not touch an existing package.json in a target directory", async () => {
646
- mockConfirm(
647
- {
648
- text: "Would you like to use git to manage this Worker?",
649
- result: false,
650
- },
651
- {
652
- text: "Would you like to install wrangler into path/to/worker/package.json?",
653
- result: false,
654
- },
655
- {
656
- text: "Would you like to use TypeScript?",
657
- result: false,
658
- }
659
- );
660
-
661
- mockSelect({
662
- text: "Would you like to create a Worker at path/to/worker/my-worker/src/index.js?",
663
- result: "none",
664
- });
665
-
666
- fs.mkdirSync("path/to/worker", { recursive: true });
667
- fs.writeFileSync(
668
- "path/to/worker/package.json",
669
- JSON.stringify({ name: "test", version: "1.0.0" }),
670
- "utf-8"
671
- );
672
-
673
- await runWrangler("init path/to/worker/my-worker");
674
- const packageJson = JSON.parse(
675
- fs.readFileSync("path/to/worker/package.json", "utf-8")
676
- );
677
- expect(packageJson.name).toEqual("test");
678
- expect(packageJson.version).toEqual("1.0.0");
679
- expect(std).toMatchInlineSnapshot(`
758
+ });
759
+
760
+ it("should not touch an existing package.json in an ancestor directory, when a name is passed", async () => {
761
+ mockConfirm(
762
+ {
763
+ text: "Would you like to use git to manage this Worker?",
764
+ result: false,
765
+ },
766
+ {
767
+ text: "No package.json found. Would you like to create one?",
768
+ result: true,
769
+ },
770
+ {
771
+ text: "Would you like to install wrangler into path/to/worker/my-worker/package.json?",
772
+ result: false,
773
+ },
774
+ {
775
+ text: "Would you like to use TypeScript?",
776
+ result: false,
777
+ }
778
+ );
779
+ mockSelect({
780
+ text: "Would you like to create a Worker at path/to/worker/my-worker/src/index.js?",
781
+ result: "none",
782
+ });
783
+ writeFiles({
784
+ items: {
785
+ "path/to/worker/package.json": {
786
+ contents: { name: "test", version: "1.0.0" },
787
+ },
788
+ },
789
+ });
790
+
791
+ await runWrangler("init path/to/worker/my-worker");
792
+
793
+ checkFiles({
794
+ items: {
795
+ "path/to/worker/package.json": {
796
+ contents: { name: "test", version: "1.0.0" },
797
+ },
798
+ },
799
+ });
800
+ expect(std).toMatchInlineSnapshot(`
680
801
  Object {
681
802
  "debug": "",
682
803
  "err": "",
683
- "out": "✨ Created path/to/worker/my-worker/wrangler.toml",
804
+ "out": "✨ Created path/to/worker/my-worker/wrangler.toml
805
+ ✨ Created path/to/worker/my-worker/package.json",
684
806
  "warn": "",
685
807
  }
686
808
  `);
687
- });
688
-
689
- it("should offer to install wrangler into an existing package.json", async () => {
690
- mockConfirm(
691
- {
692
- text: "Would you like to use git to manage this Worker?",
693
- result: false,
694
- },
695
- {
696
- text: "Would you like to install wrangler into package.json?",
697
- result: true,
698
- },
699
- {
700
- text: "Would you like to use TypeScript?",
701
- result: false,
702
- }
703
- );
704
-
705
- mockSelect({
706
- text: "Would you like to create a Worker at src/index.js?",
707
- result: "none",
708
- });
709
-
710
- fs.writeFileSync(
711
- "./package.json",
712
- JSON.stringify({ name: "test", version: "1.0.0" }),
713
- "utf-8"
714
- );
715
-
716
- await runWrangler("init");
717
- const packageJson = JSON.parse(
718
- fs.readFileSync("./package.json", "utf-8")
719
- );
720
- expect(packageJson.name).toEqual("test");
721
- expect(packageJson.version).toEqual("1.0.0");
722
- expect(mockPackageManager.addDevDeps).toHaveBeenCalledWith(
723
- `wrangler@${wranglerVersion}`
724
- );
725
- expect(std).toMatchInlineSnapshot(`
809
+ });
810
+
811
+ it("should offer to install wrangler into an existing package.json", async () => {
812
+ mockConfirm(
813
+ {
814
+ text: "Would you like to use git to manage this Worker?",
815
+ result: false,
816
+ },
817
+ {
818
+ text: "Would you like to install wrangler into package.json?",
819
+ result: true,
820
+ },
821
+ {
822
+ text: "Would you like to use TypeScript?",
823
+ result: false,
824
+ }
825
+ );
826
+ mockSelect({
827
+ text: "Would you like to create a Worker at src/index.js?",
828
+ result: "none",
829
+ });
830
+ writeFiles({
831
+ items: {
832
+ "package.json": {
833
+ contents: { name: "test", version: "1.0.0" },
834
+ },
835
+ },
836
+ });
837
+
838
+ await runWrangler("init");
839
+
840
+ checkFiles({
841
+ items: {
842
+ "package.json": {
843
+ contents: { name: "test", version: "1.0.0" },
844
+ },
845
+ },
846
+ });
847
+ expect(mockPackageManager.addDevDeps).toHaveBeenCalledWith(
848
+ `wrangler@${wranglerVersion}`
849
+ );
850
+ expect(std).toMatchInlineSnapshot(`
726
851
  Object {
727
852
  "debug": "",
728
853
  "err": "",
@@ -731,101 +856,101 @@ describe("init", () => {
731
856
  "warn": "",
732
857
  }
733
858
  `);
734
- });
735
-
736
- it("should offer to install wrangler into a package.json relative to the target directory", async () => {
737
- mockConfirm(
738
- {
739
- text: "Would you like to use git to manage this Worker?",
740
- result: false,
741
- },
742
- {
743
- text: "Would you like to install wrangler into path/to/worker/package.json?",
744
- result: true,
745
- },
746
- {
747
- text: "Would you like to use TypeScript?",
748
- result: false,
749
- }
750
- );
751
-
752
- mockSelect({
753
- text: "Would you like to create a Worker at path/to/worker/my-worker/src/index.js?",
754
- result: "none",
755
- });
756
-
757
- fs.mkdirSync("path/to/worker", { recursive: true });
758
- fs.writeFileSync(
759
- "path/to/worker/package.json",
760
- JSON.stringify({ name: "test", version: "1.0.0" }),
761
- "utf-8"
762
- );
763
-
764
- await runWrangler("init path/to/worker/my-worker");
765
- const packageJson = JSON.parse(
766
- fs.readFileSync("path/to/worker/package.json", "utf-8")
767
- );
768
- expect(packageJson.name).toEqual("test");
769
- expect(packageJson.version).toEqual("1.0.0");
770
- expect(mockPackageManager.addDevDeps).toHaveBeenCalledWith(
771
- `wrangler@${wranglerVersion}`
772
- );
773
- expect(mockPackageManager.cwd).toBe(process.cwd());
774
- expect(std).toMatchInlineSnapshot(`
859
+ });
860
+
861
+ it("should offer to install wrangler into a package.json relative to the target directory, if no name is provided", async () => {
862
+ mockConfirm(
863
+ {
864
+ text: "Would you like to use git to manage this Worker?",
865
+ result: false,
866
+ },
867
+ {
868
+ text: "Would you like to install wrangler into ../package.json?",
869
+ result: true,
870
+ },
871
+ {
872
+ text: "Would you like to use TypeScript?",
873
+ result: false,
874
+ }
875
+ );
876
+ mockSelect({
877
+ text: "Would you like to create a Worker at src/index.js?",
878
+ result: "none",
879
+ });
880
+ writeFiles({
881
+ items: {
882
+ "path/to/worker/package.json": {
883
+ contents: { name: "test", version: "1.0.0" },
884
+ },
885
+ },
886
+ });
887
+ setWorkingDirectory("path/to/worker/my-worker");
888
+
889
+ await runWrangler("init");
890
+
891
+ setWorkingDirectory("../../../..");
892
+ checkFiles({
893
+ items: {
894
+ "path/to/worker/package.json": {
895
+ contents: { name: "test", version: "1.0.0" },
896
+ },
897
+ "path/to/worker/my-worker/package.json": false,
898
+ },
899
+ });
900
+ expect(mockPackageManager.addDevDeps).toHaveBeenCalledWith(
901
+ `wrangler@${wranglerVersion}`
902
+ );
903
+ expect(mockPackageManager.cwd).toBe(process.cwd());
904
+ expect(std).toMatchInlineSnapshot(`
775
905
  Object {
776
906
  "debug": "",
777
907
  "err": "",
778
- "out": "✨ Created path/to/worker/my-worker/wrangler.toml
908
+ "out": "✨ Created wrangler.toml
779
909
  ✨ Installed wrangler into devDependencies",
780
910
  "warn": "",
781
911
  }
782
912
  `);
783
- });
784
-
785
- it("should not touch an existing package.json in an ancestor directory", async () => {
786
- mockConfirm(
787
- {
788
- text: "Would you like to use git to manage this Worker?",
789
- result: false,
790
- },
791
- {
792
- text: "Would you like to install wrangler into ../../package.json?",
793
- result: false,
794
- },
795
- {
796
- text: "Would you like to use TypeScript?",
797
- result: false,
798
- }
799
- );
800
-
801
- mockSelect({
802
- text: "Would you like to create a Worker at src/index.js?",
803
- result: "none",
804
- });
805
-
806
- fs.writeFileSync(
807
- "./package.json",
808
- JSON.stringify({ name: "test", version: "1.0.0" }),
809
- "utf-8"
810
- );
811
-
812
- fs.mkdirSync("./sub-1/sub-2", { recursive: true });
813
- process.chdir("./sub-1/sub-2");
814
-
815
- await runWrangler("init");
816
- expect(fs.existsSync("./package.json")).toBe(false);
817
- expect(fs.existsSync("../../package.json")).toBe(true);
818
-
819
- const packageJson = JSON.parse(
820
- fs.readFileSync("../../package.json", "utf-8")
821
- );
822
- expect(packageJson).toMatchInlineSnapshot(`
823
- Object {
824
- "name": "test",
825
- "version": "1.0.0",
826
- }
827
- `);
828
- expect(std).toMatchInlineSnapshot(`
913
+ });
914
+
915
+ it("should not touch an existing package.json in an ancestor directory", async () => {
916
+ mockConfirm(
917
+ {
918
+ text: "Would you like to use git to manage this Worker?",
919
+ result: false,
920
+ },
921
+ {
922
+ text: "Would you like to install wrangler into ../../package.json?",
923
+ result: false,
924
+ },
925
+ {
926
+ text: "Would you like to use TypeScript?",
927
+ result: false,
928
+ }
929
+ );
930
+ mockSelect({
931
+ text: "Would you like to create a Worker at src/index.js?",
932
+ result: "none",
933
+ });
934
+ writeFiles({
935
+ items: {
936
+ "package.json": {
937
+ contents: { name: "test", version: "1.0.0" },
938
+ },
939
+ },
940
+ });
941
+ setWorkingDirectory("./sub-1/sub-2");
942
+
943
+ await runWrangler("init");
944
+
945
+ checkFiles({
946
+ items: {
947
+ "package.json": false,
948
+ "../../package.json": {
949
+ contents: { name: "test", version: "1.0.0" },
950
+ },
951
+ },
952
+ });
953
+ expect(std).toMatchInlineSnapshot(`
829
954
  Object {
830
955
  "debug": "",
831
956
  "err": "",
@@ -833,41 +958,50 @@ describe("init", () => {
833
958
  "warn": "",
834
959
  }
835
960
  `);
836
- });
837
- });
838
-
839
- describe("typescript", () => {
840
- it("should offer to create a worker in a non-typescript project", async () => {
841
- mockConfirm(
842
- {
843
- text: "Would you like to use git to manage this Worker?",
844
- result: false,
845
- },
846
- {
847
- text: "Would you like to install wrangler into package.json?",
848
- result: false,
849
- },
850
- {
851
- text: "Would you like to use TypeScript?",
852
- result: false,
853
- }
854
- );
855
-
856
- mockSelect({
857
- text: "Would you like to create a Worker at src/index.js?",
858
- result: "fetch",
859
- });
860
-
861
- fs.writeFileSync(
862
- "./package.json",
863
- JSON.stringify({ name: "test", version: "1.0.0" }),
864
- "utf-8"
865
- );
866
-
867
- await runWrangler("init");
868
- expect(fs.existsSync("./src/index.js")).toBe(true);
869
- expect(fs.existsSync("./src/index.ts")).toBe(false);
870
- expect(std).toMatchInlineSnapshot(`
961
+ });
962
+ });
963
+
964
+ describe("typescript", () => {
965
+ it("should offer to create a worker in a non-typescript project", async () => {
966
+ mockConfirm(
967
+ {
968
+ text: "Would you like to use git to manage this Worker?",
969
+ result: false,
970
+ },
971
+ {
972
+ text: "Would you like to install wrangler into package.json?",
973
+ result: false,
974
+ },
975
+ {
976
+ text: "Would you like to use TypeScript?",
977
+ result: false,
978
+ }
979
+ );
980
+ mockSelect({
981
+ text: "Would you like to create a Worker at src/index.js?",
982
+ result: "fetch",
983
+ });
984
+ writeFiles({
985
+ items: {
986
+ "package.json": {
987
+ contents: { name: "test", version: "1.0.0" },
988
+ },
989
+ },
990
+ });
991
+
992
+ await runWrangler("init");
993
+
994
+ checkFiles({
995
+ items: {
996
+ "wrangler.toml": wranglerToml({
997
+ ...MINIMAL_WRANGLER_TOML,
998
+ main: "src/index.js",
999
+ }),
1000
+ "src/index.js": true,
1001
+ "src/index.ts": false,
1002
+ },
1003
+ });
1004
+ expect(std).toMatchInlineSnapshot(`
871
1005
  Object {
872
1006
  "debug": "",
873
1007
  "err": "",
@@ -879,39 +1013,44 @@ describe("init", () => {
879
1013
  "warn": "",
880
1014
  }
881
1015
  `);
882
- });
883
-
884
- it("should offer to create a worker in a typescript project", async () => {
885
- mockConfirm(
886
- {
887
- text: "Would you like to use git to manage this Worker?",
888
- result: false,
889
- },
890
- {
891
- text: "Would you like to install wrangler into package.json?",
892
- result: false,
893
- },
894
- {
895
- text: "Would you like to use TypeScript?",
896
- result: true,
897
- }
898
- );
899
-
900
- mockSelect({
901
- text: "Would you like to create a Worker at src/index.ts?",
902
- result: "fetch",
903
- });
904
-
905
- fs.writeFileSync(
906
- "./package.json",
907
- JSON.stringify({ name: "test", version: "1.0.0" }),
908
- "utf-8"
909
- );
910
-
911
- await runWrangler("init");
912
- expect(fs.existsSync("./src/index.js")).toBe(false);
913
- expect(fs.existsSync("./src/index.ts")).toBe(true);
914
- expect(std).toMatchInlineSnapshot(`
1016
+ });
1017
+
1018
+ it("should offer to create a worker in a typescript project", async () => {
1019
+ mockConfirm(
1020
+ {
1021
+ text: "Would you like to use git to manage this Worker?",
1022
+ result: false,
1023
+ },
1024
+ {
1025
+ text: "Would you like to install wrangler into package.json?",
1026
+ result: false,
1027
+ },
1028
+ {
1029
+ text: "Would you like to use TypeScript?",
1030
+ result: true,
1031
+ }
1032
+ );
1033
+ mockSelect({
1034
+ text: "Would you like to create a Worker at src/index.ts?",
1035
+ result: "fetch",
1036
+ });
1037
+ writeFiles({
1038
+ items: {
1039
+ "package.json": {
1040
+ contents: { name: "test", version: "1.0.0" },
1041
+ },
1042
+ },
1043
+ });
1044
+
1045
+ await runWrangler("init");
1046
+
1047
+ checkFiles({
1048
+ items: {
1049
+ "src/index.js": false,
1050
+ "src/index.ts": true,
1051
+ },
1052
+ });
1053
+ expect(std).toMatchInlineSnapshot(`
915
1054
  Object {
916
1055
  "debug": "",
917
1056
  "err": "",
@@ -925,46 +1064,51 @@ describe("init", () => {
925
1064
  "warn": "",
926
1065
  }
927
1066
  `);
928
- });
929
-
930
- it("should add scripts for a typescript project with .ts extension", async () => {
931
- mockConfirm(
932
- {
933
- text: "Would you like to use git to manage this Worker?",
934
- result: false,
935
- },
936
- {
937
- text: "No package.json found. Would you like to create one?",
938
- result: true,
939
- },
940
- {
941
- text: "Would you like to install wrangler into package.json?",
942
- result: false,
943
- },
944
- {
945
- text: "Would you like to use TypeScript?",
946
- result: true,
947
- }
948
- );
949
- mockSelect({
950
- text: "Would you like to create a Worker at src/index.ts?",
951
- result: "fetch",
952
- });
953
- await runWrangler("init");
954
-
955
- expect(fs.existsSync("./package.json")).toBe(true);
956
- const packageJson = JSON.parse(
957
- fs.readFileSync("./package.json", "utf-8")
958
- );
959
-
960
- expect(fs.existsSync("./src/index.js")).toBe(false);
961
- expect(fs.existsSync("./src/index.ts")).toBe(true);
962
-
963
- expect(packageJson.scripts.start).toBe("wrangler dev");
964
- expect(packageJson.scripts.deploy).toBe("wrangler publish");
965
- expect(packageJson.name).toContain("wrangler-tests");
966
- expect(packageJson.version).toEqual("0.0.0");
967
- expect(std.out).toMatchInlineSnapshot(`
1067
+ });
1068
+
1069
+ it("should add scripts for a typescript project with .ts extension", async () => {
1070
+ mockConfirm(
1071
+ {
1072
+ text: "Would you like to use git to manage this Worker?",
1073
+ result: false,
1074
+ },
1075
+ {
1076
+ text: "No package.json found. Would you like to create one?",
1077
+ result: true,
1078
+ },
1079
+ {
1080
+ text: "Would you like to install wrangler into package.json?",
1081
+ result: false,
1082
+ },
1083
+ {
1084
+ text: "Would you like to use TypeScript?",
1085
+ result: true,
1086
+ }
1087
+ );
1088
+ mockSelect({
1089
+ text: "Would you like to create a Worker at src/index.ts?",
1090
+ result: "fetch",
1091
+ });
1092
+
1093
+ await runWrangler("init");
1094
+
1095
+ checkFiles({
1096
+ items: {
1097
+ "package.json": {
1098
+ contents: expect.objectContaining({
1099
+ name: expect.stringContaining("wrangler-tests"),
1100
+ version: "0.0.0",
1101
+ scripts: {
1102
+ start: "wrangler dev",
1103
+ deploy: "wrangler publish",
1104
+ },
1105
+ }),
1106
+ },
1107
+ "src/index.js": false,
1108
+ "src/index.ts": true,
1109
+ },
1110
+ });
1111
+ expect(std.out).toMatchInlineSnapshot(`
968
1112
  "✨ Created wrangler.toml
969
1113
  ✨ Created package.json
970
1114
  ✨ Created tsconfig.json
@@ -974,47 +1118,57 @@ describe("init", () => {
974
1118
  To start developing your Worker, run \`npm start\`
975
1119
  To publish your Worker to the Internet, run \`npm run deploy\`"
976
1120
  `);
977
- });
978
-
979
- it("should not overwrite package.json scripts for a typescript project", async () => {
980
- mockConfirm(
981
- {
982
- text: "Would you like to use git to manage this Worker?",
983
- result: false,
984
- },
985
- {
986
- text: "Would you like to install wrangler into package.json?",
987
- result: false,
988
- },
989
- {
990
- text: "Would you like to use TypeScript?",
991
- result: true,
992
- }
993
- );
994
- mockSelect({
995
- text: "Would you like to create a Worker at src/index.ts?",
996
- result: "fetch",
997
- });
998
- await fsp.writeFile(
999
- "./package.json",
1000
- JSON.stringify({
1001
- scripts: {
1002
- start: "test-start",
1003
- deploy: "test-publish",
1004
- },
1005
- })
1006
- );
1007
- const packageJson = JSON.parse(
1008
- fs.readFileSync("./package.json", "utf-8")
1009
- );
1010
- await runWrangler("init");
1011
-
1012
- expect(fs.existsSync("./src/index.js")).toBe(false);
1013
- expect(fs.existsSync("./src/index.ts")).toBe(true);
1014
-
1015
- expect(packageJson.scripts.start).toBe("test-start");
1016
- expect(packageJson.scripts.deploy).toBe("test-publish");
1017
- expect(std.out).toMatchInlineSnapshot(`
1121
+ });
1122
+
1123
+ it("should not overwrite package.json scripts for a typescript project", async () => {
1124
+ mockConfirm(
1125
+ {
1126
+ text: "Would you like to use git to manage this Worker?",
1127
+ result: false,
1128
+ },
1129
+ {
1130
+ text: "Would you like to install wrangler into package.json?",
1131
+ result: false,
1132
+ },
1133
+ {
1134
+ text: "Would you like to use TypeScript?",
1135
+ result: true,
1136
+ }
1137
+ );
1138
+ mockSelect({
1139
+ text: "Would you like to create a Worker at src/index.ts?",
1140
+ result: "fetch",
1141
+ });
1142
+ writeFiles({
1143
+ items: {
1144
+ "package.json": {
1145
+ contents: {
1146
+ scripts: {
1147
+ start: "test-start",
1148
+ deploy: "test-publish",
1149
+ },
1150
+ },
1151
+ },
1152
+ },
1153
+ });
1154
+
1155
+ await runWrangler("init");
1156
+
1157
+ checkFiles({
1158
+ items: {
1159
+ "package.json": {
1160
+ contents: {
1161
+ scripts: {
1162
+ start: "test-start",
1163
+ deploy: "test-publish",
1164
+ },
1165
+ },
1166
+ },
1167
+ "src/index.js": false,
1168
+ "src/index.ts": true,
1169
+ },
1170
+ });
1171
+ expect(std.out).toMatchInlineSnapshot(`
1018
1172
  "✨ Created wrangler.toml
1019
1173
  ✨ Created tsconfig.json
1020
1174
  ✨ Created src/index.ts
@@ -1023,37 +1177,40 @@ describe("init", () => {
1023
1177
  To start developing your Worker, run \`npx wrangler dev\`
1024
1178
  To publish your Worker to the Internet, run \`npx wrangler publish\`"
1025
1179
  `);
1026
- });
1027
-
1028
- it("should not offer to create a worker in a ts project if a file already exists at the location", async () => {
1029
- mockConfirm(
1030
- {
1031
- text: "Would you like to use git to manage this Worker?",
1032
- result: false,
1033
- },
1034
- {
1035
- text: "Would you like to install wrangler into package.json?",
1036
- result: false,
1037
- },
1038
- {
1039
- text: "Would you like to use TypeScript?",
1040
- result: true,
1041
- }
1042
- );
1043
-
1044
- fs.writeFileSync(
1045
- "./package.json",
1046
- JSON.stringify({ name: "test", version: "1.0.0" }),
1047
- "utf-8"
1048
- );
1049
- fs.mkdirSync("./src", { recursive: true });
1050
- const PLACEHOLDER = "/* placeholder text */";
1051
- fs.writeFileSync("./src/index.ts", PLACEHOLDER, "utf-8");
1052
-
1053
- await runWrangler("init");
1054
- expect(fs.existsSync("./src/index.js")).toBe(false);
1055
- expect(fs.readFileSync("./src/index.ts", "utf-8")).toBe(PLACEHOLDER);
1056
- expect(std).toMatchInlineSnapshot(`
1180
+ });
1181
+
1182
+ it("should not offer to create a worker in a ts project if a file already exists at the location", async () => {
1183
+ mockConfirm(
1184
+ {
1185
+ text: "Would you like to use git to manage this Worker?",
1186
+ result: false,
1187
+ },
1188
+ {
1189
+ text: "Would you like to install wrangler into package.json?",
1190
+ result: false,
1191
+ },
1192
+ {
1193
+ text: "Would you like to use TypeScript?",
1194
+ result: true,
1195
+ }
1196
+ );
1197
+ const PLACEHOLDER = "/* placeholder text */";
1198
+ writeFiles({
1199
+ items: {
1200
+ "package.json": { contents: { name: "test", version: "1.0.0" } },
1201
+ "src/index.ts": { contents: PLACEHOLDER },
1202
+ },
1203
+ });
1204
+
1205
+ await runWrangler("init");
1206
+
1207
+ checkFiles({
1208
+ items: {
1209
+ "src/index.js": false,
1210
+ "src/index.ts": { contents: PLACEHOLDER },
1211
+ },
1212
+ });
1213
+ expect(std).toMatchInlineSnapshot(`
1057
1214
  Object {
1058
1215
  "debug": "",
1059
1216
  "err": "",
@@ -1063,85 +1220,97 @@ describe("init", () => {
1063
1220
  "warn": "",
1064
1221
  }
1065
1222
  `);
1066
- });
1067
-
1068
- it("should not offer to create a worker in a ts project for a named worker if a file already exists at the location", async () => {
1069
- mockConfirm(
1070
- {
1071
- text: "Would you like to use git to manage this Worker?",
1072
- result: false,
1073
- },
1074
- {
1075
- text: "Would you like to install wrangler into package.json?",
1076
- result: false,
1077
- },
1078
- {
1079
- text: "Would you like to use TypeScript?",
1080
- result: true,
1081
- }
1082
- );
1083
-
1084
- fs.writeFileSync(
1085
- "./package.json",
1086
- JSON.stringify({ name: "test", version: "1.0.0" }),
1087
- "utf-8"
1088
- );
1089
- fs.mkdirSync("./my-worker/src", { recursive: true });
1090
- const PLACEHOLDER = "/* placeholder text */";
1091
- fs.writeFileSync("./my-worker/src/index.ts", PLACEHOLDER, "utf-8");
1092
-
1093
- await runWrangler("init my-worker");
1094
- expect(fs.existsSync("./my-worker/src/index.js")).toBe(false);
1095
- expect(fs.readFileSync("./my-worker/src/index.ts", "utf-8")).toBe(
1096
- PLACEHOLDER
1097
- );
1098
- expect(std).toMatchInlineSnapshot(`
1223
+ });
1224
+
1225
+ it("should not offer to create a worker in a ts project for a named worker if a file already exists at the location", async () => {
1226
+ mockConfirm(
1227
+ {
1228
+ text: "Would you like to use git to manage this Worker?",
1229
+ result: false,
1230
+ },
1231
+ {
1232
+ text: "No package.json found. Would you like to create one?",
1233
+ result: true,
1234
+ },
1235
+ {
1236
+ text: "Would you like to install wrangler into package.json?",
1237
+ result: false,
1238
+ },
1239
+ {
1240
+ text: "Would you like to use TypeScript?",
1241
+ result: true,
1242
+ }
1243
+ );
1244
+ const PLACEHOLDER = "/* placeholder text */";
1245
+ writeFiles({
1246
+ items: {
1247
+ "package.json": { contents: { name: "test", version: "1.0.0" } },
1248
+ "my-worker/src/index.ts": { contents: PLACEHOLDER },
1249
+ },
1250
+ });
1251
+
1252
+ await runWrangler("init my-worker");
1253
+
1254
+ checkFiles({
1255
+ items: {
1256
+ "my-worker/src/index.js": false,
1257
+ "my-worker/src/index.ts": { contents: PLACEHOLDER },
1258
+ },
1259
+ });
1260
+ expect(std).toMatchInlineSnapshot(`
1099
1261
  Object {
1100
1262
  "debug": "",
1101
1263
  "err": "",
1102
1264
  "out": "✨ Created my-worker/wrangler.toml
1265
+ ✨ Created my-worker/package.json
1103
1266
  ✨ Created my-worker/tsconfig.json
1104
1267
  ✨ Installed @cloudflare/workers-types and typescript into devDependencies",
1105
1268
  "warn": "",
1106
1269
  }
1107
1270
  `);
1108
- });
1109
-
1110
- it("should create a tsconfig.json and install `workers-types` if none is found and user confirms", async () => {
1111
- mockConfirm(
1112
- {
1113
- text: "Would you like to use git to manage this Worker?",
1114
- result: false,
1115
- },
1116
- {
1117
- text: "No package.json found. Would you like to create one?",
1118
- result: true,
1119
- },
1120
- {
1121
- text: "Would you like to use TypeScript?",
1122
- result: true,
1123
- }
1124
- );
1125
- mockSelect({
1126
- text: "Would you like to create a Worker at src/index.ts?",
1127
- result: "none",
1128
- });
1129
- await runWrangler("init");
1130
- expect(fs.existsSync("./tsconfig.json")).toBe(true);
1131
- const { config: tsconfigJson, error: tsConfigParseError } =
1132
- parseConfigFileTextToJson(
1133
- "./tsconfig.json",
1134
- fs.readFileSync("./tsconfig.json", "utf-8")
1135
- );
1136
- expect(tsConfigParseError).toBeUndefined();
1137
- expect(tsconfigJson.compilerOptions.types).toEqual([
1138
- "@cloudflare/workers-types",
1139
- ]);
1140
- expect(mockPackageManager.addDevDeps).toHaveBeenCalledWith(
1141
- "@cloudflare/workers-types",
1142
- "typescript"
1143
- );
1144
- expect(std).toMatchInlineSnapshot(`
1271
+ });
1272
+
1273
+ it("should create a tsconfig.json and install `workers-types` if none is found and user confirms", async () => {
1274
+ mockConfirm(
1275
+ {
1276
+ text: "Would you like to use git to manage this Worker?",
1277
+ result: false,
1278
+ },
1279
+ {
1280
+ text: "No package.json found. Would you like to create one?",
1281
+ result: true,
1282
+ },
1283
+ {
1284
+ text: "Would you like to use TypeScript?",
1285
+ result: true,
1286
+ }
1287
+ );
1288
+ mockSelect({
1289
+ text: "Would you like to create a Worker at src/index.ts?",
1290
+ result: "none",
1291
+ });
1292
+
1293
+ await runWrangler("init");
1294
+
1295
+ checkFiles({
1296
+ items: {
1297
+ "tsconfig.json": {
1298
+ contents: {
1299
+ config: {
1300
+ compilerOptions: expect.objectContaining({
1301
+ types: ["@cloudflare/workers-types"],
1302
+ }),
1303
+ },
1304
+ error: undefined,
1305
+ },
1306
+ },
1307
+ },
1308
+ });
1309
+ expect(mockPackageManager.addDevDeps).toHaveBeenCalledWith(
1310
+ "@cloudflare/workers-types",
1311
+ "typescript"
1312
+ );
1313
+ expect(std).toMatchInlineSnapshot(`
1145
1314
  Object {
1146
1315
  "debug": "",
1147
1316
  "err": "",
@@ -1152,43 +1321,43 @@ describe("init", () => {
1152
1321
  "warn": "",
1153
1322
  }
1154
1323
  `);
1155
- });
1156
-
1157
- it("should not touch an existing tsconfig.json in the same directory", async () => {
1158
- fs.writeFileSync(
1159
- "./package.json",
1160
- JSON.stringify({
1161
- name: "test",
1162
- version: "1.0.0",
1163
- devDependencies: {
1164
- wrangler: "0.0.0",
1165
- "@cloudflare/workers-types": "0.0.0",
1166
- },
1167
- }),
1168
- "utf-8"
1169
- );
1170
- fs.writeFileSync(
1171
- "./tsconfig.json",
1172
- JSON.stringify({ compilerOptions: {} }),
1173
- "utf-8"
1174
- );
1175
-
1176
- mockConfirm({
1177
- text: "Would you like to use git to manage this Worker?",
1178
- result: false,
1179
- });
1180
-
1181
- mockSelect({
1182
- text: "Would you like to create a Worker at src/index.ts?",
1183
- result: "fetch",
1184
- });
1185
-
1186
- await runWrangler("init");
1187
- const tsconfigJson = JSON.parse(
1188
- fs.readFileSync("./tsconfig.json", "utf-8")
1189
- );
1190
- expect(tsconfigJson.compilerOptions).toEqual({});
1191
- expect(std).toMatchInlineSnapshot(`
1324
+ });
1325
+
1326
+ it("should not touch an existing tsconfig.json in the same directory", async () => {
1327
+ mockConfirm({
1328
+ text: "Would you like to use git to manage this Worker?",
1329
+ result: false,
1330
+ });
1331
+ mockSelect({
1332
+ text: "Would you like to create a Worker at src/index.ts?",
1333
+ result: "fetch",
1334
+ });
1335
+ writeFiles({
1336
+ items: {
1337
+ "package.json": {
1338
+ contents: {
1339
+ name: "test",
1340
+ version: "1.0.0",
1341
+ devDependencies: {
1342
+ wrangler: "0.0.0",
1343
+ "@cloudflare/workers-types": "0.0.0",
1344
+ },
1345
+ },
1346
+ },
1347
+ "tsconfig.json": { contents: { compilerOptions: {} } },
1348
+ },
1349
+ });
1350
+
1351
+ await runWrangler("init");
1352
+
1353
+ checkFiles({
1354
+ items: {
1355
+ "tsconfig.json": {
1356
+ contents: { config: { compilerOptions: {} }, error: undefined },
1357
+ },
1358
+ },
1359
+ });
1360
+ expect(std).toMatchInlineSnapshot(`
1192
1361
  Object {
1193
1362
  "debug": "",
1194
1363
  "err": "",
@@ -1200,100 +1369,112 @@ describe("init", () => {
1200
1369
  "warn": "",
1201
1370
  }
1202
1371
  `);
1203
- });
1204
-
1205
- it("should not touch an existing tsconfig.json in the ancestor of a target directory", async () => {
1206
- fs.mkdirSync("path/to/worker", { recursive: true });
1207
- fs.writeFileSync(
1208
- "path/to/worker/package.json",
1209
- JSON.stringify({
1210
- name: "test",
1211
- version: "1.0.0",
1212
- devDependencies: {
1213
- wrangler: "0.0.0",
1214
- "@cloudflare/workers-types": "0.0.0",
1215
- },
1216
- }),
1217
- "utf-8"
1218
- );
1219
- fs.writeFileSync(
1220
- "path/to/worker/tsconfig.json",
1221
- JSON.stringify({ compilerOptions: {} }),
1222
- "utf-8"
1223
- );
1224
-
1225
- mockConfirm({
1226
- text: "Would you like to use git to manage this Worker?",
1227
- result: false,
1228
- });
1229
-
1230
- mockSelect({
1231
- text: "Would you like to create a Worker at path/to/worker/my-worker/src/index.ts?",
1232
- result: "fetch",
1233
- });
1234
-
1235
- await runWrangler("init path/to/worker/my-worker");
1236
- const tsconfigJson = JSON.parse(
1237
- fs.readFileSync("path/to/worker/tsconfig.json", "utf-8")
1238
- );
1239
- expect(tsconfigJson.compilerOptions).toEqual({});
1240
- expect(std).toMatchInlineSnapshot(`
1372
+ });
1373
+
1374
+ it("should not touch an existing tsconfig.json in the ancestor of a target directory, if a name is passed", async () => {
1375
+ mockConfirm(
1376
+ {
1377
+ text: "Would you like to use git to manage this Worker?",
1378
+ result: false,
1379
+ },
1380
+ {
1381
+ text: "No package.json found. Would you like to create one?",
1382
+ result: true,
1383
+ },
1384
+ {
1385
+ text: "Would you like to use TypeScript?",
1386
+ result: true,
1387
+ }
1388
+ );
1389
+ mockSelect({
1390
+ text: "Would you like to create a Worker at path/to/worker/my-worker/src/index.ts?",
1391
+ result: "fetch",
1392
+ });
1393
+ writeFiles({
1394
+ items: {
1395
+ "path/to/worker/package.json": {
1396
+ contents: {
1397
+ name: "test",
1398
+ version: "1.0.0",
1399
+ devDependencies: {
1400
+ wrangler: "0.0.0",
1401
+ "@cloudflare/workers-types": "0.0.0",
1402
+ },
1403
+ },
1404
+ },
1405
+ "path/to/worker/tsconfig.json": { contents: { compilerOptions: {} } },
1406
+ },
1407
+ });
1408
+
1409
+ await runWrangler("init path/to/worker/my-worker");
1410
+
1411
+ checkFiles({
1412
+ items: {
1413
+ "path/to/worker/tsconfig.json": {
1414
+ contents: { config: { compilerOptions: {}, error: undefined } },
1415
+ },
1416
+ },
1417
+ });
1418
+ expect(std).toMatchInlineSnapshot(`
1241
1419
  Object {
1242
1420
  "debug": "",
1243
1421
  "err": "",
1244
1422
  "out": "✨ Created path/to/worker/my-worker/wrangler.toml
1423
+ ✨ Created path/to/worker/my-worker/package.json
1424
+ ✨ Created path/to/worker/my-worker/tsconfig.json
1245
1425
  ✨ Created path/to/worker/my-worker/src/index.ts
1426
+ ✨ Installed @cloudflare/workers-types and typescript into devDependencies
1246
1427
 
1247
- To start developing your Worker, run \`npx wrangler dev\`
1248
- To publish your Worker to the Internet, run \`npx wrangler publish\`",
1428
+ To start developing your Worker, run \`cd path/to/worker/my-worker && npm start\`
1429
+ To publish your Worker to the Internet, run \`npm run deploy\`",
1249
1430
  "warn": "",
1250
1431
  }
1251
1432
  `);
1252
- });
1253
-
1254
- it("should offer to install type definitions in an existing typescript project", async () => {
1255
- mockConfirm(
1256
- {
1257
- text: "Would you like to use git to manage this Worker?",
1258
- result: false,
1259
- },
1260
- {
1261
- text: "Would you like to install wrangler into package.json?",
1262
- result: false,
1263
- },
1264
- {
1265
- text: "Would you like to install the type definitions for Workers into your package.json?",
1266
- result: true,
1267
- }
1268
- );
1269
- mockSelect({
1270
- text: "Would you like to create a Worker at src/index.ts?",
1271
- result: "none",
1272
- });
1273
- fs.writeFileSync(
1274
- "./package.json",
1275
- JSON.stringify({
1276
- name: "test",
1277
- version: "1.0.0",
1278
- }),
1279
- "utf-8"
1280
- );
1281
- fs.writeFileSync(
1282
- "./tsconfig.json",
1283
- JSON.stringify({ compilerOptions: {} }),
1284
- "utf-8"
1285
- );
1286
-
1287
- await runWrangler("init");
1288
- const tsconfigJson = JSON.parse(
1289
- fs.readFileSync("./tsconfig.json", "utf-8")
1290
- );
1291
- // unchanged tsconfig
1292
- expect(tsconfigJson.compilerOptions).toEqual({});
1293
- expect(mockPackageManager.addDevDeps).toHaveBeenCalledWith(
1294
- "@cloudflare/workers-types"
1295
- );
1296
- expect(std).toMatchInlineSnapshot(`
1433
+ });
1434
+
1435
+ it("should offer to install type definitions in an existing typescript project", async () => {
1436
+ mockConfirm(
1437
+ {
1438
+ text: "Would you like to use git to manage this Worker?",
1439
+ result: false,
1440
+ },
1441
+ {
1442
+ text: "Would you like to install wrangler into package.json?",
1443
+ result: false,
1444
+ },
1445
+ {
1446
+ text: "Would you like to install the type definitions for Workers into your package.json?",
1447
+ result: true,
1448
+ }
1449
+ );
1450
+ mockSelect({
1451
+ text: "Would you like to create a Worker at src/index.ts?",
1452
+ result: "none",
1453
+ });
1454
+ writeFiles({
1455
+ items: {
1456
+ "./package.json": {
1457
+ contents: {
1458
+ name: "test",
1459
+ version: "1.0.0",
1460
+ },
1461
+ },
1462
+ "./tsconfig.json": { contents: { compilerOptions: {} } },
1463
+ },
1464
+ });
1465
+
1466
+ await runWrangler("init");
1467
+
1468
+ checkFiles({
1469
+ items: {
1470
+ // unchanged tsconfig
1471
+ "tsconfig.json": { contents: { config: { compilerOptions: {} } } },
1472
+ },
1473
+ });
1474
+ expect(mockPackageManager.addDevDeps).toHaveBeenCalledWith(
1475
+ "@cloudflare/workers-types"
1476
+ );
1477
+ expect(std).toMatchInlineSnapshot(`
1297
1478
  Object {
1298
1479
  "debug": "",
1299
1480
  "err": "",
@@ -1303,50 +1484,45 @@ describe("init", () => {
1303
1484
  "warn": "",
1304
1485
  }
1305
1486
  `);
1306
- });
1307
-
1308
- it("should not touch an existing tsconfig.json in an ancestor directory", async () => {
1309
- fs.writeFileSync(
1310
- "./package.json",
1311
- JSON.stringify({
1312
- name: "test",
1313
- version: "1.0.0",
1314
- devDependencies: {
1315
- wrangler: "0.0.0",
1316
- "@cloudflare/workers-types": "0.0.0",
1317
- },
1318
- }),
1319
- "utf-8"
1320
- );
1321
- fs.writeFileSync(
1322
- "./tsconfig.json",
1323
- JSON.stringify({ compilerOptions: {} }),
1324
- "utf-8"
1325
- );
1326
-
1327
- mockConfirm({
1328
- text: "Would you like to use git to manage this Worker?",
1329
- result: false,
1330
- });
1331
-
1332
- mockSelect({
1333
- text: "Would you like to create a Worker at src/index.ts?",
1334
- result: "fetch",
1335
- });
1336
-
1337
- fs.mkdirSync("./sub-1/sub-2", { recursive: true });
1338
- process.chdir("./sub-1/sub-2");
1339
-
1340
- await runWrangler("init");
1341
- expect(fs.existsSync("./tsconfig.json")).toBe(false);
1342
- expect(fs.existsSync("../../tsconfig.json")).toBe(true);
1343
-
1344
- const tsconfigJson = JSON.parse(
1345
- fs.readFileSync("../../tsconfig.json", "utf-8")
1346
- );
1347
- expect(tsconfigJson.compilerOptions).toEqual({});
1348
-
1349
- expect(std).toMatchInlineSnapshot(`
1487
+ });
1488
+
1489
+ it("should not touch an existing tsconfig.json in an ancestor directory", async () => {
1490
+ mockConfirm({
1491
+ text: "Would you like to use git to manage this Worker?",
1492
+ result: false,
1493
+ });
1494
+ mockSelect({
1495
+ text: "Would you like to create a Worker at src/index.ts?",
1496
+ result: "fetch",
1497
+ });
1498
+ writeFiles({
1499
+ items: {
1500
+ "package.json": {
1501
+ contents: {
1502
+ name: "test",
1503
+ version: "1.0.0",
1504
+ devDependencies: {
1505
+ wrangler: "0.0.0",
1506
+ "@cloudflare/workers-types": "0.0.0",
1507
+ },
1508
+ },
1509
+ },
1510
+ "tsconfig.json": { contents: { compilerOptions: {} } },
1511
+ },
1512
+ });
1513
+ setWorkingDirectory("./sub-1/sub-2");
1514
+
1515
+ await runWrangler("init");
1516
+
1517
+ checkFiles({
1518
+ items: {
1519
+ "tsconfig.json": false,
1520
+ "../../tsconfig.json": {
1521
+ contents: { config: { compilerOptions: {} } },
1522
+ },
1523
+ },
1524
+ });
1525
+ expect(std).toMatchInlineSnapshot(`
1350
1526
  Object {
1351
1527
  "debug": "",
1352
1528
  "err": "",
@@ -1358,48 +1534,53 @@ describe("init", () => {
1358
1534
  "warn": "",
1359
1535
  }
1360
1536
  `);
1361
- });
1362
- });
1363
-
1364
- describe("javascript", () => {
1365
- it("should add missing scripts for a non-ts project with .js extension", async () => {
1366
- mockConfirm(
1367
- {
1368
- text: "Would you like to use git to manage this Worker?",
1369
- result: false,
1370
- },
1371
- {
1372
- text: "No package.json found. Would you like to create one?",
1373
- result: true,
1374
- },
1375
- {
1376
- text: "Would you like to install wrangler into package.json?",
1377
- result: false,
1378
- },
1379
- {
1380
- text: "Would you like to use TypeScript?",
1381
- result: false,
1382
- }
1383
- );
1384
- mockSelect({
1385
- text: "Would you like to create a Worker at src/index.js?",
1386
- result: "fetch",
1387
- });
1388
- await runWrangler("init");
1389
-
1390
- expect(fs.existsSync("./package.json")).toBe(true);
1391
- const packageJson = JSON.parse(
1392
- fs.readFileSync("./package.json", "utf-8")
1393
- );
1394
-
1395
- expect(fs.existsSync("./src/index.js")).toBe(true);
1396
- expect(fs.existsSync("./src/index.ts")).toBe(false);
1397
-
1398
- expect(packageJson.scripts.start).toBe("wrangler dev");
1399
- expect(packageJson.scripts.deploy).toBe("wrangler publish");
1400
- expect(packageJson.name).toContain("wrangler-tests");
1401
- expect(packageJson.version).toEqual("0.0.0");
1402
- expect(std.out).toMatchInlineSnapshot(`
1537
+ });
1538
+ });
1539
+
1540
+ describe("javascript", () => {
1541
+ it("should add missing scripts for a non-ts project with .js extension", async () => {
1542
+ mockConfirm(
1543
+ {
1544
+ text: "Would you like to use git to manage this Worker?",
1545
+ result: false,
1546
+ },
1547
+ {
1548
+ text: "No package.json found. Would you like to create one?",
1549
+ result: true,
1550
+ },
1551
+ {
1552
+ text: "Would you like to install wrangler into package.json?",
1553
+ result: false,
1554
+ },
1555
+ {
1556
+ text: "Would you like to use TypeScript?",
1557
+ result: false,
1558
+ }
1559
+ );
1560
+ mockSelect({
1561
+ text: "Would you like to create a Worker at src/index.js?",
1562
+ result: "fetch",
1563
+ });
1564
+
1565
+ await runWrangler("init");
1566
+
1567
+ checkFiles({
1568
+ items: {
1569
+ "src/index.js": true,
1570
+ "src/index.ts": false,
1571
+ "package.json": {
1572
+ contents: expect.objectContaining({
1573
+ name: expect.stringContaining("wrangler-tests"),
1574
+ version: "0.0.0",
1575
+ scripts: {
1576
+ start: "wrangler dev",
1577
+ deploy: "wrangler publish",
1578
+ },
1579
+ }),
1580
+ },
1581
+ },
1582
+ });
1583
+ expect(std.out).toMatchInlineSnapshot(`
1403
1584
  "✨ Created wrangler.toml
1404
1585
  ✨ Created package.json
1405
1586
  ✨ Created src/index.js
@@ -1407,84 +1588,97 @@ describe("init", () => {
1407
1588
  To start developing your Worker, run \`npm start\`
1408
1589
  To publish your Worker to the Internet, run \`npm run deploy\`"
1409
1590
  `);
1410
- });
1411
-
1412
- it("should not overwrite package.json scripts for a non-ts project with .js extension", async () => {
1413
- mockConfirm(
1414
- {
1415
- text: "Would you like to use git to manage this Worker?",
1416
- result: false,
1417
- },
1418
- {
1419
- text: "Would you like to install wrangler into package.json?",
1420
- result: false,
1421
- },
1422
- {
1423
- text: "Would you like to use TypeScript?",
1424
- result: false,
1425
- }
1426
- );
1427
- mockSelect({
1428
- text: "Would you like to create a Worker at src/index.js?",
1429
- result: "fetch",
1430
- });
1431
- await fsp.writeFile(
1432
- "./package.json",
1433
- JSON.stringify({
1434
- scripts: {
1435
- start: "test-start",
1436
- deploy: "test-publish",
1437
- },
1438
- })
1439
- );
1440
- const packageJson = JSON.parse(
1441
- fs.readFileSync("./package.json", "utf-8")
1442
- );
1443
- await runWrangler("init");
1444
-
1445
- expect(fs.existsSync("./src/index.js")).toBe(true);
1446
- expect(fs.existsSync("./src/index.ts")).toBe(false);
1447
-
1448
- expect(packageJson.scripts.start).toBe("test-start");
1449
- expect(packageJson.scripts.deploy).toBe("test-publish");
1450
- expect(std.out).toMatchInlineSnapshot(`
1591
+ });
1592
+
1593
+ it("should not overwrite package.json scripts for a non-ts project with .js extension", async () => {
1594
+ mockConfirm(
1595
+ {
1596
+ text: "Would you like to use git to manage this Worker?",
1597
+ result: false,
1598
+ },
1599
+ {
1600
+ text: "Would you like to install wrangler into package.json?",
1601
+ result: false,
1602
+ },
1603
+ {
1604
+ text: "Would you like to use TypeScript?",
1605
+ result: false,
1606
+ }
1607
+ );
1608
+ mockSelect({
1609
+ text: "Would you like to create a Worker at src/index.js?",
1610
+ result: "fetch",
1611
+ });
1612
+ writeFiles({
1613
+ items: {
1614
+ "package.json": {
1615
+ contents: {
1616
+ scripts: {
1617
+ start: "test-start",
1618
+ deploy: "test-publish",
1619
+ },
1620
+ },
1621
+ },
1622
+ },
1623
+ });
1624
+
1625
+ await runWrangler("init");
1626
+
1627
+ checkFiles({
1628
+ items: {
1629
+ "src/index.js": true,
1630
+ "src/index.ts": false,
1631
+ "package.json": {
1632
+ contents: expect.objectContaining({
1633
+ scripts: {
1634
+ start: "test-start",
1635
+ deploy: "test-publish",
1636
+ },
1637
+ }),
1638
+ },
1639
+ },
1640
+ });
1641
+ expect(std.out).toMatchInlineSnapshot(`
1451
1642
  "✨ Created wrangler.toml
1452
1643
  ✨ Created src/index.js
1453
1644
 
1454
1645
  To start developing your Worker, run \`npx wrangler dev\`
1455
1646
  To publish your Worker to the Internet, run \`npx wrangler publish\`"
1456
1647
  `);
1457
- });
1458
-
1459
- it("should not offer to create a worker in a non-ts project if a file already exists at the location", async () => {
1460
- mockConfirm(
1461
- {
1462
- text: "Would you like to use git to manage this Worker?",
1463
- result: false,
1464
- },
1465
- {
1466
- text: "Would you like to install wrangler into package.json?",
1467
- result: false,
1468
- },
1469
- {
1470
- text: "Would you like to use TypeScript?",
1471
- result: false,
1472
- }
1473
- );
1474
-
1475
- fs.writeFileSync(
1476
- "./package.json",
1477
- JSON.stringify({ name: "test", version: "1.0.0" }),
1478
- "utf-8"
1479
- );
1480
- fs.mkdirSync("./src", { recursive: true });
1481
- const PLACEHOLDER = "/* placeholder text */";
1482
- fs.writeFileSync("./src/index.js", PLACEHOLDER, "utf-8");
1483
-
1484
- await runWrangler("init");
1485
- expect(fs.readFileSync("./src/index.js", "utf-8")).toBe(PLACEHOLDER);
1486
- expect(fs.existsSync("./src/index.ts")).toBe(false);
1487
- expect(std).toMatchInlineSnapshot(`
1648
+ });
1649
+
1650
+ it("should not offer to create a worker in a non-ts project if a file already exists at the location", async () => {
1651
+ mockConfirm(
1652
+ {
1653
+ text: "Would you like to use git to manage this Worker?",
1654
+ result: false,
1655
+ },
1656
+ {
1657
+ text: "Would you like to install wrangler into package.json?",
1658
+ result: false,
1659
+ },
1660
+ {
1661
+ text: "Would you like to use TypeScript?",
1662
+ result: false,
1663
+ }
1664
+ );
1665
+ const PLACEHOLDER = "/* placeholder text */";
1666
+ writeFiles({
1667
+ items: {
1668
+ "package.json": { contents: { name: "test", version: "1.0.0" } },
1669
+ "src/index.js": { contents: PLACEHOLDER },
1670
+ },
1671
+ });
1672
+
1673
+ await runWrangler("init");
1674
+
1675
+ checkFiles({
1676
+ items: {
1677
+ "src/index.js": { contents: PLACEHOLDER },
1678
+ "src/index.ts": false,
1679
+ },
1680
+ });
1681
+ expect(std).toMatchInlineSnapshot(`
1488
1682
  Object {
1489
1683
  "debug": "",
1490
1684
  "err": "",
@@ -1492,39 +1686,42 @@ describe("init", () => {
1492
1686
  "warn": "",
1493
1687
  }
1494
1688
  `);
1495
- });
1496
-
1497
- it("should not offer to create a worker in a non-ts named worker project if a file already exists at the location", async () => {
1498
- mockConfirm(
1499
- {
1500
- text: "Would you like to use git to manage this Worker?",
1501
- result: false,
1502
- },
1503
- {
1504
- text: "Would you like to install wrangler into package.json?",
1505
- result: false,
1506
- },
1507
- {
1508
- text: "Would you like to use TypeScript?",
1509
- result: false,
1510
- }
1511
- );
1512
-
1513
- fs.writeFileSync(
1514
- "./package.json",
1515
- JSON.stringify({ name: "test", version: "1.0.0" }),
1516
- "utf-8"
1517
- );
1518
- fs.mkdirSync("./my-worker/src", { recursive: true });
1519
- const PLACEHOLDER = "/* placeholder text */";
1520
- fs.writeFileSync("./my-worker/src/index.js", PLACEHOLDER, "utf-8");
1521
-
1522
- await runWrangler("init my-worker");
1523
- expect(fs.readFileSync("./my-worker/src/index.js", "utf-8")).toBe(
1524
- PLACEHOLDER
1525
- );
1526
- expect(fs.existsSync("./my-worker/src/index.ts")).toBe(false);
1527
- expect(std).toMatchInlineSnapshot(`
1689
+ });
1690
+
1691
+ it("should not offer to create a worker in a non-ts named worker project if a file already exists at the location", async () => {
1692
+ mockConfirm(
1693
+ {
1694
+ text: "Would you like to use git to manage this Worker?",
1695
+ result: false,
1696
+ },
1697
+ {
1698
+ text: "Would you like to install wrangler into my-worker/package.json?",
1699
+ result: false,
1700
+ },
1701
+ {
1702
+ text: "Would you like to use TypeScript?",
1703
+ result: false,
1704
+ }
1705
+ );
1706
+ const PLACEHOLDER = "/* placeholder text */";
1707
+ writeFiles({
1708
+ items: {
1709
+ "my-worker/package.json": {
1710
+ contents: { name: "test", version: "1.0.0" },
1711
+ },
1712
+ "my-worker/src/index.js": { contents: PLACEHOLDER },
1713
+ },
1714
+ });
1715
+
1716
+ await runWrangler("init my-worker");
1717
+
1718
+ checkFiles({
1719
+ items: {
1720
+ "my-worker/src/index.js": { contents: PLACEHOLDER },
1721
+ "my-worker/src/index.ts": false,
1722
+ },
1723
+ });
1724
+ expect(std).toMatchInlineSnapshot(`
1528
1725
  Object {
1529
1726
  "debug": "",
1530
1727
  "err": "",
@@ -1532,31 +1729,36 @@ describe("init", () => {
1532
1729
  "warn": "",
1533
1730
  }
1534
1731
  `);
1535
- });
1536
- });
1537
-
1538
- describe("worker names", () => {
1539
- it("should create a worker with a given name", async () => {
1540
- await runWrangler("init my-worker -y");
1541
-
1542
- const parsed = TOML.parse(
1543
- await fsp.readFile("./my-worker/wrangler.toml", "utf-8")
1544
- );
1545
-
1546
- expect(typeof parsed.compatibility_date).toBe("string");
1547
- expect(parsed.name).toBe("my-worker");
1548
- });
1549
-
1550
- it('should create a worker with the name of the current directory if "name" is .', async () => {
1551
- await runWrangler("init . -y");
1552
-
1553
- const parsed = TOML.parse(await fsp.readFile("wrangler.toml", "utf-8"));
1554
-
1555
- expect(typeof parsed.compatibility_date).toBe("string");
1556
- expect(parsed.name).toBe(path.basename(process.cwd()).toLowerCase());
1557
- expect(fs.existsSync("./my-worker/package.json")).toBe(false);
1558
- expect(fs.existsSync("./my-worker/tsconfig.json")).toBe(false);
1559
- expect(std).toMatchInlineSnapshot(`
1732
+ });
1733
+ });
1734
+
1735
+ describe("worker names", () => {
1736
+ it("should create a worker with a given name", async () => {
1737
+ await runWrangler("init my-worker -y");
1738
+
1739
+ checkFiles({
1740
+ items: {
1741
+ "my-worker/wrangler.toml": wranglerToml({
1742
+ ...MINIMAL_WRANGLER_TOML,
1743
+ name: "my-worker",
1744
+ }),
1745
+ },
1746
+ });
1747
+ });
1748
+
1749
+ it('should create a worker with the name of the current directory if "name" is .', async () => {
1750
+ await runWrangler("init . -y");
1751
+
1752
+ const workerName = path.basename(process.cwd()).toLowerCase();
1753
+ checkFiles({
1754
+ items: {
1755
+ "wrangler.toml": wranglerToml({
1756
+ ...MINIMAL_WRANGLER_TOML,
1757
+ name: workerName,
1758
+ }),
1759
+ },
1760
+ });
1761
+ expect(std).toMatchInlineSnapshot(`
1560
1762
  Object {
1561
1763
  "debug": "",
1562
1764
  "err": "",
@@ -1572,20 +1774,20 @@ describe("init", () => {
1572
1774
  "warn": "",
1573
1775
  }
1574
1776
  `);
1575
- });
1576
-
1577
- it('should create a worker in a nested directory if "name" is path/to/worker', async () => {
1578
- await runWrangler("init path/to/worker -y");
1579
-
1580
- const parsed = TOML.parse(
1581
- await fsp.readFile("path/to/worker/wrangler.toml", "utf-8")
1582
- );
1583
-
1584
- expect(typeof parsed.compatibility_date).toBe("string");
1585
- expect(parsed.name).toBe("worker");
1586
- expect(fs.existsSync("./my-worker/package.json")).toBe(false);
1587
- expect(fs.existsSync("./my-worker/tsconfig.json")).toBe(false);
1588
- expect(std).toMatchInlineSnapshot(`
1777
+ });
1778
+
1779
+ it('should create a worker in a nested directory if "name" is path/to/worker', async () => {
1780
+ await runWrangler("init path/to/worker -y");
1781
+
1782
+ checkFiles({
1783
+ items: {
1784
+ "path/to/worker/wrangler.toml": wranglerToml({
1785
+ ...MINIMAL_WRANGLER_TOML,
1786
+ name: "worker",
1787
+ }),
1788
+ },
1789
+ });
1790
+ expect(std).toMatchInlineSnapshot(`
1589
1791
  Object {
1590
1792
  "debug": "",
1591
1793
  "err": "",
@@ -1601,22 +1803,20 @@ describe("init", () => {
1601
1803
  "warn": "",
1602
1804
  }
1603
1805
  `);
1604
- });
1605
-
1606
- it("should normalize characters that aren't lowercase alphanumeric, underscores, or dashes", async () => {
1607
- await runWrangler("init WEIRD_w0rkr_N4m3.js.tsx.tar.gz -y");
1608
- const parsed = TOML.parse(
1609
- await fsp.readFile(
1610
- "WEIRD_w0rkr_N4m3.js.tsx.tar.gz/wrangler.toml",
1611
- "utf-8"
1612
- )
1613
- );
1614
-
1615
- expect(typeof parsed.compatibility_date).toBe("string");
1616
- expect(parsed.name).toBe("weird_w0rkr_n4m3-js-tsx-tar-gz");
1617
- expect(fs.existsSync("./my-worker/package.json")).toBe(false);
1618
- expect(fs.existsSync("./my-worker/tsconfig.json")).toBe(false);
1619
- expect(std).toMatchInlineSnapshot(`
1806
+ });
1807
+
1808
+ it("should normalize characters that aren't lowercase alphanumeric, underscores, or dashes", async () => {
1809
+ await runWrangler("init WEIRD_w0rkr_N4m3.js.tsx.tar.gz -y");
1810
+
1811
+ checkFiles({
1812
+ items: {
1813
+ "WEIRD_w0rkr_N4m3.js.tsx.tar.gz/wrangler.toml": wranglerToml({
1814
+ ...MINIMAL_WRANGLER_TOML,
1815
+ name: "weird_w0rkr_n4m3-js-tsx-tar-gz",
1816
+ }),
1817
+ },
1818
+ });
1819
+ expect(std).toMatchInlineSnapshot(`
1620
1820
  Object {
1621
1821
  "debug": "",
1622
1822
  "err": "",
@@ -1632,6 +1832,161 @@ describe("init", () => {
1632
1832
  "warn": "",
1633
1833
  }
1634
1834
  `);
1635
- });
1636
- });
1835
+ });
1836
+
1837
+ it("should ignore ancestor files (such as wrangler.toml, package.json and tsconfig.json) if a name/path is given", async () => {
1838
+ mockConfirm(
1839
+ {
1840
+ text: "Would you like to use git to manage this Worker?",
1841
+ result: false,
1842
+ },
1843
+ {
1844
+ text: "Would you like to use TypeScript?",
1845
+ result: true,
1846
+ },
1847
+ {
1848
+ text: "No package.json found. Would you like to create one?",
1849
+ result: true,
1850
+ },
1851
+ {
1852
+ text: "Would you like to install the type definitions for Workers into your package.json?",
1853
+ result: true,
1854
+ }
1855
+ );
1856
+ mockSelect({
1857
+ text: "Would you like to create a Worker at sub/folder/worker/src/index.ts?",
1858
+ result: "fetch",
1859
+ });
1860
+ writeFiles({
1861
+ items: {
1862
+ "package.json": { contents: { name: "top-level" } },
1863
+ "tsconfig.json": { contents: { compilerOptions: {} } },
1864
+ "wrangler.toml": wranglerToml({
1865
+ name: "top-level",
1866
+ compatibility_date: "some-date",
1867
+ }),
1868
+ },
1869
+ });
1870
+
1871
+ await runWrangler("init sub/folder/worker");
1872
+
1873
+ // Ancestor files are untouched.
1874
+ checkFiles({
1875
+ items: {
1876
+ "package.json": { contents: { name: "top-level" } },
1877
+ "tsconfig.json": {
1878
+ contents: { config: { compilerOptions: {} }, error: undefined },
1879
+ },
1880
+ "wrangler.toml": wranglerToml({
1881
+ name: "top-level",
1882
+ compatibility_date: "some-date",
1883
+ }),
1884
+ },
1885
+ });
1886
+ // New initialized Worker has its own files.
1887
+ checkFiles({
1888
+ items: {
1889
+ "sub/folder/worker/package.json": {
1890
+ contents: expect.objectContaining({
1891
+ name: "worker",
1892
+ }),
1893
+ },
1894
+ "sub/folder/worker/tsconfig.json": true,
1895
+ "sub/folder/worker/wrangler.toml": wranglerToml({
1896
+ ...MINIMAL_WRANGLER_TOML,
1897
+ name: "worker",
1898
+ }),
1899
+ },
1900
+ });
1901
+ });
1902
+ });
1637
1903
  });
1904
+
1905
+ /**
1906
+ * Change the current working directory, ensuring that this exists.
1907
+ */
1908
+ function setWorkingDirectory(directory: string) {
1909
+ fs.mkdirSync(directory, { recursive: true });
1910
+ process.chdir(directory);
1911
+ }
1912
+
1913
+ /**
1914
+ * Write the given folder/files to disk at the given `cwd`.
1915
+ */
1916
+ function writeFiles(folder: TestFolder, cwd = process.cwd()) {
1917
+ for (const name in folder.items) {
1918
+ const item = folder.items[name];
1919
+ const itemPath = path.resolve(cwd, name);
1920
+ if (typeof item !== "boolean") {
1921
+ if ("contents" in item) {
1922
+ fs.mkdirSync(path.dirname(itemPath), { recursive: true });
1923
+ fs.writeFileSync(itemPath, stringify(name, item.contents));
1924
+ } else {
1925
+ fs.mkdirSync(itemPath, { recursive: true });
1926
+ writeFiles(item, itemPath);
1927
+ }
1928
+ } else {
1929
+ throw new Error("Cannot write boolean flags to disk: " + itemPath);
1930
+ }
1931
+ }
1932
+ }
1933
+
1934
+ /**
1935
+ * Check that the given test folders/files match what is in on disk.
1936
+ */
1937
+ function checkFiles(folder: TestFolder, cwd = process.cwd()) {
1938
+ for (const name in folder.items) {
1939
+ const item = folder.items[name];
1940
+ const itemPath = path.resolve(cwd, name);
1941
+ if (typeof item === "boolean") {
1942
+ if (fs.existsSync(itemPath) !== item) {
1943
+ throw new Error(`Expected ${itemPath} ${item ? "" : "not "}to exist.`);
1944
+ }
1945
+ } else if ("contents" in item) {
1946
+ const actualContents = parse(name, fs.readFileSync(itemPath, "utf-8"));
1947
+ expect(actualContents).toEqual(item.contents);
1948
+ } else if ("items" in item) {
1949
+ checkFiles(item, itemPath);
1950
+ } else {
1951
+ throw new Error("Unexpected TestFile object.");
1952
+ }
1953
+ }
1954
+ }
1955
+
1956
+ function stringify(name: string, value: unknown) {
1957
+ if (name.endsWith(".toml")) {
1958
+ return TOML.stringify(value as TOML.JsonMap);
1959
+ }
1960
+ if (name.endsWith(".json")) {
1961
+ return JSON.stringify(value);
1962
+ }
1963
+ return `${value}`;
1964
+ }
1965
+
1966
+ function parse(name: string, value: string): unknown {
1967
+ if (name.endsWith(".toml")) {
1968
+ return TOML.parse(value);
1969
+ }
1970
+ if (name.endsWith("tsconfig.json")) {
1971
+ return parseConfigFileTextToJson(name, value);
1972
+ }
1973
+ if (name.endsWith(".json")) {
1974
+ return JSON.parse(value);
1975
+ }
1976
+ return value;
1977
+ }
1978
+
1979
+ function wranglerToml(options: TOML.JsonMap = {}): TestFile {
1980
+ return {
1981
+ contents: options,
1982
+ };
1983
+ }
1984
+
1985
+ interface TestFile {
1986
+ contents: unknown;
1987
+ }
1988
+ interface TestFolder {
1989
+ items: {
1990
+ [id: string]: TestFile | TestFolder | boolean;
1991
+ };
1992
+ }