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
@@ -8,11 +8,11 @@ import type { CfModule, CfModuleType, CfScriptFormat } from "./worker";
8
8
  import type esbuild from "esbuild";
9
9
 
10
10
  const RuleTypeToModuleType: Record<ConfigModuleRuleType, CfModuleType> = {
11
- ESModule: "esm",
12
- CommonJS: "commonjs",
13
- CompiledWasm: "compiled-wasm",
14
- Data: "buffer",
15
- Text: "text",
11
+ ESModule: "esm",
12
+ CommonJS: "commonjs",
13
+ CompiledWasm: "compiled-wasm",
14
+ Data: "buffer",
15
+ Text: "text",
16
16
  };
17
17
 
18
18
  // This is a combination of an esbuild plugin and a mutable array
@@ -24,235 +24,235 @@ const RuleTypeToModuleType: Record<ConfigModuleRuleType, CfModuleType> = {
24
24
  // them correctly in the bundle, and add them to the form upload.
25
25
 
26
26
  export const DEFAULT_MODULE_RULES: Config["rules"] = [
27
- { type: "Text", globs: ["**/*.txt", "**/*.html"] },
28
- { type: "Data", globs: ["**/*.bin"] },
29
- { type: "CompiledWasm", globs: ["**/*.wasm"] },
27
+ { type: "Text", globs: ["**/*.txt", "**/*.html"] },
28
+ { type: "Data", globs: ["**/*.bin"] },
29
+ { type: "CompiledWasm", globs: ["**/*.wasm"] },
30
30
  ];
31
31
 
32
32
  export default function createModuleCollector(props: {
33
- format: CfScriptFormat;
34
- rules?: Config["rules"];
35
- // a collection of "legacy" style module references, which are just file names
36
- // we will eventually deprecate this functionality, hence the verbose greppable name
37
- wrangler1xlegacyModuleReferences: {
38
- rootDirectory: string;
39
- fileNames: Set<string>;
40
- };
33
+ format: CfScriptFormat;
34
+ rules?: Config["rules"];
35
+ // a collection of "legacy" style module references, which are just file names
36
+ // we will eventually deprecate this functionality, hence the verbose greppable name
37
+ wrangler1xlegacyModuleReferences: {
38
+ rootDirectory: string;
39
+ fileNames: Set<string>;
40
+ };
41
41
  }): {
42
- modules: CfModule[];
43
- plugin: esbuild.Plugin;
42
+ modules: CfModule[];
43
+ plugin: esbuild.Plugin;
44
44
  } {
45
- const rules: Config["rules"] = [
46
- ...(props.rules || []),
47
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
48
- ...DEFAULT_MODULE_RULES!,
49
- ];
45
+ const rules: Config["rules"] = [
46
+ ...(props.rules || []),
47
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
48
+ ...DEFAULT_MODULE_RULES!,
49
+ ];
50
50
 
51
- // First, we want to add some validations to the module rules
52
- // We want to warn if rules are accidentally configured in such a way that
53
- // subsequent rules will never match because `fallthrough` hasn't been set
51
+ // First, we want to add some validations to the module rules
52
+ // We want to warn if rules are accidentally configured in such a way that
53
+ // subsequent rules will never match because `fallthrough` hasn't been set
54
54
 
55
- const completedRuleLocations: Record<string, number> = {};
56
- let index = 0;
57
- const rulesToRemove: Config["rules"] = [];
58
- for (const rule of rules) {
59
- if (rule.type in completedRuleLocations) {
60
- if (rules[completedRuleLocations[rule.type]].fallthrough !== false) {
61
- if (index < (props.rules || []).length) {
62
- logger.warn(
63
- `The module rule at position ${index} (${JSON.stringify(
64
- rule
65
- )}) has the same type as a previous rule (at position ${
66
- completedRuleLocations[rule.type]
67
- }, ${JSON.stringify(
68
- rules[completedRuleLocations[rule.type]]
69
- )}). This rule will be ignored. To the previous rule, add \`fallthrough = true\` to allow this one to also be used, or \`fallthrough = false\` to silence this warning.`
70
- );
71
- } else {
72
- logger.warn(
73
- `The default module rule ${JSON.stringify(
74
- rule
75
- )} has the same type as a previous rule (at position ${
76
- completedRuleLocations[rule.type]
77
- }, ${JSON.stringify(
78
- rules[completedRuleLocations[rule.type]]
79
- )}). This rule will be ignored. To the previous rule, add \`fallthrough = true\` to allow the default one to also be used, or \`fallthrough = false\` to silence this warning.`
80
- );
81
- }
82
- }
55
+ const completedRuleLocations: Record<string, number> = {};
56
+ let index = 0;
57
+ const rulesToRemove: Config["rules"] = [];
58
+ for (const rule of rules) {
59
+ if (rule.type in completedRuleLocations) {
60
+ if (rules[completedRuleLocations[rule.type]].fallthrough !== false) {
61
+ if (index < (props.rules || []).length) {
62
+ logger.warn(
63
+ `The module rule at position ${index} (${JSON.stringify(
64
+ rule
65
+ )}) has the same type as a previous rule (at position ${
66
+ completedRuleLocations[rule.type]
67
+ }, ${JSON.stringify(
68
+ rules[completedRuleLocations[rule.type]]
69
+ )}). This rule will be ignored. To the previous rule, add \`fallthrough = true\` to allow this one to also be used, or \`fallthrough = false\` to silence this warning.`
70
+ );
71
+ } else {
72
+ logger.warn(
73
+ `The default module rule ${JSON.stringify(
74
+ rule
75
+ )} has the same type as a previous rule (at position ${
76
+ completedRuleLocations[rule.type]
77
+ }, ${JSON.stringify(
78
+ rules[completedRuleLocations[rule.type]]
79
+ )}). This rule will be ignored. To the previous rule, add \`fallthrough = true\` to allow the default one to also be used, or \`fallthrough = false\` to silence this warning.`
80
+ );
81
+ }
82
+ }
83
83
 
84
- rulesToRemove.push(rule);
85
- }
86
- if (!(rule.type in completedRuleLocations) && rule.fallthrough !== true) {
87
- completedRuleLocations[rule.type] = index;
88
- }
89
- index++;
90
- }
84
+ rulesToRemove.push(rule);
85
+ }
86
+ if (!(rule.type in completedRuleLocations) && rule.fallthrough !== true) {
87
+ completedRuleLocations[rule.type] = index;
88
+ }
89
+ index++;
90
+ }
91
91
 
92
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
93
- rulesToRemove.forEach((rule) => rules!.splice(rules!.indexOf(rule), 1));
92
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
93
+ rulesToRemove.forEach((rule) => rules!.splice(rules!.indexOf(rule), 1));
94
94
 
95
- const modules: CfModule[] = [];
96
- return {
97
- modules,
98
- plugin: {
99
- name: "wrangler-module-collector",
100
- setup(build) {
101
- build.onStart(() => {
102
- // reset the module collection array
103
- modules.splice(0);
104
- });
95
+ const modules: CfModule[] = [];
96
+ return {
97
+ modules,
98
+ plugin: {
99
+ name: "wrangler-module-collector",
100
+ setup(build) {
101
+ build.onStart(() => {
102
+ // reset the module collection array
103
+ modules.splice(0);
104
+ });
105
105
 
106
- // ~ start legacy module specifier support ~
106
+ // ~ start legacy module specifier support ~
107
107
 
108
- // This section detects usage of "legacy" 1.x style module specifiers
109
- // and modifies them so they "work" in wrangler v2, but with a warning
108
+ // This section detects usage of "legacy" 1.x style module specifiers
109
+ // and modifies them so they "work" in wrangler v2, but with a warning
110
110
 
111
- const rulesMatchers = rules.flatMap((rule) => {
112
- return rule.globs.map((glob) => {
113
- const regex = globToRegExp(glob);
114
- return {
115
- regex,
116
- rule,
117
- };
118
- });
119
- });
111
+ const rulesMatchers = rules.flatMap((rule) => {
112
+ return rule.globs.map((glob) => {
113
+ const regex = globToRegExp(glob);
114
+ return {
115
+ regex,
116
+ rule,
117
+ };
118
+ });
119
+ });
120
120
 
121
- if (props.wrangler1xlegacyModuleReferences.fileNames.size > 0) {
122
- build.onResolve(
123
- {
124
- filter: new RegExp(
125
- "^(" +
126
- [...props.wrangler1xlegacyModuleReferences.fileNames].join(
127
- "|"
128
- ) +
129
- ")$"
130
- ),
131
- },
132
- async (args: esbuild.OnResolveArgs) => {
133
- if (
134
- args.kind !== "import-statement" &&
135
- args.kind !== "require-call"
136
- ) {
137
- return;
138
- }
139
- // In the future, this will simply throw an error
140
- logger.warn(
141
- `Deprecation: detected a legacy module import in "./${path.relative(
142
- process.cwd(),
143
- args.importer
144
- )}". This will stop working in the future. Replace references to "${
145
- args.path
146
- }" with "./${args.path}";`
147
- );
121
+ if (props.wrangler1xlegacyModuleReferences.fileNames.size > 0) {
122
+ build.onResolve(
123
+ {
124
+ filter: new RegExp(
125
+ "^(" +
126
+ [...props.wrangler1xlegacyModuleReferences.fileNames].join(
127
+ "|"
128
+ ) +
129
+ ")$"
130
+ ),
131
+ },
132
+ async (args: esbuild.OnResolveArgs) => {
133
+ if (
134
+ args.kind !== "import-statement" &&
135
+ args.kind !== "require-call"
136
+ ) {
137
+ return;
138
+ }
139
+ // In the future, this will simply throw an error
140
+ logger.warn(
141
+ `Deprecation: detected a legacy module import in "./${path.relative(
142
+ process.cwd(),
143
+ args.importer
144
+ )}". This will stop working in the future. Replace references to "${
145
+ args.path
146
+ }" with "./${args.path}";`
147
+ );
148
148
 
149
- // take the file and massage it to a
150
- // transportable/manageable format
151
- const filePath = path.join(
152
- props.wrangler1xlegacyModuleReferences.rootDirectory,
153
- args.path
154
- );
155
- const fileContent = await readFile(filePath);
156
- const fileHash = crypto
157
- .createHash("sha1")
158
- .update(fileContent)
159
- .digest("hex");
160
- const fileName = `./${fileHash}-${path.basename(args.path)}`;
149
+ // take the file and massage it to a
150
+ // transportable/manageable format
151
+ const filePath = path.join(
152
+ props.wrangler1xlegacyModuleReferences.rootDirectory,
153
+ args.path
154
+ );
155
+ const fileContent = await readFile(filePath);
156
+ const fileHash = crypto
157
+ .createHash("sha1")
158
+ .update(fileContent)
159
+ .digest("hex");
160
+ const fileName = `./${fileHash}-${path.basename(args.path)}`;
161
161
 
162
- const { rule } =
163
- rulesMatchers.find(({ regex }) => regex.test(fileName)) || {};
164
- if (rule) {
165
- // add the module to the array
166
- modules.push({
167
- name: fileName,
168
- content: fileContent,
169
- type: RuleTypeToModuleType[rule.type],
170
- });
171
- return {
172
- path: fileName, // change the reference to the changed module
173
- external: props.format === "modules", // mark it as external in the bundle
174
- namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
175
- watchFiles: [filePath], // we also add the file to esbuild's watch list
176
- };
177
- }
178
- }
179
- );
180
- }
162
+ const { rule } =
163
+ rulesMatchers.find(({ regex }) => regex.test(fileName)) || {};
164
+ if (rule) {
165
+ // add the module to the array
166
+ modules.push({
167
+ name: fileName,
168
+ content: fileContent,
169
+ type: RuleTypeToModuleType[rule.type],
170
+ });
171
+ return {
172
+ path: fileName, // change the reference to the changed module
173
+ external: props.format === "modules", // mark it as external in the bundle
174
+ namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
175
+ watchFiles: [filePath], // we also add the file to esbuild's watch list
176
+ };
177
+ }
178
+ }
179
+ );
180
+ }
181
181
 
182
- // ~ end legacy module specifier support ~
182
+ // ~ end legacy module specifier support ~
183
183
 
184
- rules?.forEach((rule) => {
185
- if (rule.type === "ESModule" || rule.type === "CommonJS") return; // TODO: we should treat these as js files, and use the jsx loader
184
+ rules?.forEach((rule) => {
185
+ if (rule.type === "ESModule" || rule.type === "CommonJS") return; // TODO: we should treat these as js files, and use the jsx loader
186
186
 
187
- rule.globs.forEach((glob) => {
188
- build.onResolve(
189
- { filter: globToRegExp(glob) },
190
- async (args: esbuild.OnResolveArgs) => {
191
- // take the file and massage it to a
192
- // transportable/manageable format
187
+ rule.globs.forEach((glob) => {
188
+ build.onResolve(
189
+ { filter: globToRegExp(glob) },
190
+ async (args: esbuild.OnResolveArgs) => {
191
+ // take the file and massage it to a
192
+ // transportable/manageable format
193
193
 
194
- const filePath = path.join(args.resolveDir, args.path);
195
- const fileContent = await readFile(filePath);
196
- const fileHash = crypto
197
- .createHash("sha1")
198
- .update(fileContent)
199
- .digest("hex");
200
- const fileName = `./${fileHash}-${path.basename(args.path)}`;
194
+ const filePath = path.join(args.resolveDir, args.path);
195
+ const fileContent = await readFile(filePath);
196
+ const fileHash = crypto
197
+ .createHash("sha1")
198
+ .update(fileContent)
199
+ .digest("hex");
200
+ const fileName = `./${fileHash}-${path.basename(args.path)}`;
201
201
 
202
- // add the module to the array
203
- modules.push({
204
- name: fileName,
205
- content: fileContent,
206
- type: RuleTypeToModuleType[rule.type],
207
- });
202
+ // add the module to the array
203
+ modules.push({
204
+ name: fileName,
205
+ content: fileContent,
206
+ type: RuleTypeToModuleType[rule.type],
207
+ });
208
208
 
209
- return {
210
- path: fileName, // change the reference to the changed module
211
- external: props.format === "modules", // mark it as external in the bundle
212
- namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
213
- watchFiles: [filePath], // we also add the file to esbuild's watch list
214
- };
215
- }
216
- );
209
+ return {
210
+ path: fileName, // change the reference to the changed module
211
+ external: props.format === "modules", // mark it as external in the bundle
212
+ namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
213
+ watchFiles: [filePath], // we also add the file to esbuild's watch list
214
+ };
215
+ }
216
+ );
217
217
 
218
- if (props.format === "service-worker") {
219
- build.onLoad(
220
- { filter: globToRegExp(glob) },
221
- async (args: esbuild.OnLoadArgs) => {
222
- return {
223
- // We replace the the module with an identifier
224
- // that we'll separately add to the form upload
225
- // as part of [wasm_modules]/[text_blobs]/[data_blobs]. This identifier has to be a valid
226
- // JS identifier, so we replace all non alphanumeric characters
227
- // with an underscore.
228
- contents: `export default ${args.path.replace(
229
- /[^a-zA-Z0-9_$]/g,
230
- "_"
231
- )};`,
232
- };
233
- }
234
- );
235
- }
236
- });
237
- });
218
+ if (props.format === "service-worker") {
219
+ build.onLoad(
220
+ { filter: globToRegExp(glob) },
221
+ async (args: esbuild.OnLoadArgs) => {
222
+ return {
223
+ // We replace the the module with an identifier
224
+ // that we'll separately add to the form upload
225
+ // as part of [wasm_modules]/[text_blobs]/[data_blobs]. This identifier has to be a valid
226
+ // JS identifier, so we replace all non alphanumeric characters
227
+ // with an underscore.
228
+ contents: `export default ${args.path.replace(
229
+ /[^a-zA-Z0-9_$]/g,
230
+ "_"
231
+ )};`,
232
+ };
233
+ }
234
+ );
235
+ }
236
+ });
237
+ });
238
238
 
239
- rulesToRemove.forEach((rule) => {
240
- rule.globs.forEach((glob) => {
241
- build.onResolve(
242
- { filter: globToRegExp(glob) },
243
- async (args: esbuild.OnResolveArgs) => {
244
- throw new Error(
245
- `The file ${
246
- args.path
247
- } matched a module rule in your configuration (${JSON.stringify(
248
- rule
249
- )}), but was ignored because a previous rule with the same type was not marked as \`fallthrough = true\`.`
250
- );
251
- }
252
- );
253
- });
254
- });
255
- },
256
- },
257
- };
239
+ rulesToRemove.forEach((rule) => {
240
+ rule.globs.forEach((glob) => {
241
+ build.onResolve(
242
+ { filter: globToRegExp(glob) },
243
+ async (args: esbuild.OnResolveArgs) => {
244
+ throw new Error(
245
+ `The file ${
246
+ args.path
247
+ } matched a module rule in your configuration (${JSON.stringify(
248
+ rule
249
+ )}), but was ignored because a previous rule with the same type was not marked as \`fallthrough = true\`.`
250
+ );
251
+ }
252
+ );
253
+ });
254
+ });
255
+ },
256
+ },
257
+ };
258
258
  }
@@ -10,10 +10,8 @@ import { logger } from "./logger";
10
10
  * @param url the URL to point the browser at
11
11
  */
12
12
  export default async function openInBrowser(url: string): Promise<void> {
13
- const errorMessage = `Failed to open ${url} in a browser`;
14
-
15
- const childProcess = await open(url);
16
- childProcess.on("error", () => {
17
- logger.warn(errorMessage);
18
- });
13
+ const childProcess = await open(url);
14
+ childProcess.on("error", () => {
15
+ logger.warn("Failed to open");
16
+ });
19
17
  }