wrangler 0.0.0-e2f9bb2 → 0.0.0-e30d1013

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 (295) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +26 -4
  3. package/bin/wrangler.js +154 -34
  4. package/kv-asset-handler.js +1 -0
  5. package/miniflare-dist/index.mjs +1451 -21
  6. package/package.json +191 -148
  7. package/src/__tests__/access.test.ts +25 -0
  8. package/src/__tests__/api-dev.test.ts +209 -0
  9. package/src/__tests__/api-devregistry.test.js +56 -0
  10. package/src/__tests__/api.test.ts +80 -0
  11. package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
  12. package/src/__tests__/config-cache.test.ts +30 -24
  13. package/src/__tests__/configuration.test.ts +3970 -3114
  14. package/src/__tests__/d1.test.ts +74 -0
  15. package/src/__tests__/delete.test.ts +230 -0
  16. package/src/__tests__/deployments.test.ts +91 -0
  17. package/src/__tests__/dev.test.tsx +1484 -737
  18. package/src/__tests__/dialogs.test.tsx +40 -0
  19. package/src/__tests__/generate.test.ts +235 -0
  20. package/src/__tests__/get-host-from-url.test.ts +16 -0
  21. package/src/__tests__/guess-worker-format.test.ts +68 -68
  22. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  23. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  24. package/src/__tests__/helpers/mock-bin.ts +20 -20
  25. package/src/__tests__/helpers/mock-cfetch.ts +216 -94
  26. package/src/__tests__/helpers/mock-console.ts +58 -39
  27. package/src/__tests__/helpers/mock-dialogs.ts +115 -51
  28. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -0
  29. package/src/__tests__/helpers/mock-http-server.ts +30 -30
  30. package/src/__tests__/helpers/mock-istty.ts +65 -18
  31. package/src/__tests__/helpers/mock-known-routes.ts +7 -0
  32. package/src/__tests__/helpers/mock-kv.ts +27 -27
  33. package/src/__tests__/helpers/mock-oauth-flow.ts +225 -228
  34. package/src/__tests__/helpers/mock-process.ts +39 -0
  35. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  36. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  37. package/src/__tests__/helpers/msw/handlers/access.ts +13 -0
  38. package/src/__tests__/helpers/msw/handlers/deployments.ts +59 -0
  39. package/src/__tests__/helpers/msw/handlers/namespaces.ts +104 -0
  40. package/src/__tests__/helpers/msw/handlers/oauth.ts +36 -0
  41. package/src/__tests__/helpers/msw/handlers/r2.ts +80 -0
  42. package/src/__tests__/helpers/msw/handlers/script.ts +75 -0
  43. package/src/__tests__/helpers/msw/handlers/user.ts +63 -0
  44. package/src/__tests__/helpers/msw/handlers/zones.ts +22 -0
  45. package/src/__tests__/helpers/msw/index.ts +21 -0
  46. package/src/__tests__/helpers/run-in-tmp.ts +27 -28
  47. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  48. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
  49. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
  50. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
  51. package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
  52. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  53. package/src/__tests__/helpers/write-worker-source.ts +16 -16
  54. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  55. package/src/__tests__/https-options.test.ts +142 -109
  56. package/src/__tests__/index.test.ts +244 -231
  57. package/src/__tests__/init.test.ts +2872 -1014
  58. package/src/__tests__/jest.setup.ts +163 -30
  59. package/src/__tests__/kv.test.ts +1660 -1439
  60. package/src/__tests__/logger.test.ts +100 -74
  61. package/src/__tests__/metrics.test.ts +450 -0
  62. package/src/__tests__/middleware.scheduled.test.ts +135 -0
  63. package/src/__tests__/middleware.test.ts +726 -0
  64. package/src/__tests__/package-manager.test.ts +312 -165
  65. package/src/__tests__/pages.test.ts +2380 -322
  66. package/src/__tests__/parse.test.ts +253 -245
  67. package/src/__tests__/paths.test.ts +39 -0
  68. package/src/__tests__/publish.test.ts +7536 -4778
  69. package/src/__tests__/pubsub.test.ts +370 -0
  70. package/src/__tests__/queues.test.ts +371 -0
  71. package/src/__tests__/r2.test.ts +388 -209
  72. package/src/__tests__/route.test.ts +18 -18
  73. package/src/__tests__/secret.test.ts +624 -426
  74. package/src/__tests__/tail.test.ts +677 -567
  75. package/src/__tests__/test-old-node-version.js +31 -0
  76. package/src/__tests__/type-generation.test.ts +225 -0
  77. package/src/__tests__/user.test.ts +140 -116
  78. package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
  79. package/src/__tests__/validate-dev-props.test.ts +56 -0
  80. package/src/__tests__/version.test.ts +35 -0
  81. package/src/__tests__/whoami.test.tsx +264 -91
  82. package/src/__tests__/worker-namespace.test.ts +326 -0
  83. package/src/abort.d.ts +3 -0
  84. package/src/api/dev.ts +208 -0
  85. package/src/api/index.ts +2 -0
  86. package/src/bundle-reporter.tsx +68 -0
  87. package/src/bundle.ts +781 -135
  88. package/src/cfetch/index.ts +123 -67
  89. package/src/cfetch/internal.ts +216 -90
  90. package/src/cli.ts +23 -8
  91. package/src/config/config.ts +236 -195
  92. package/src/config/diagnostics.ts +61 -61
  93. package/src/config/environment.ts +506 -339
  94. package/src/config/index.ts +309 -38
  95. package/src/config/validation-helpers.ts +379 -357
  96. package/src/config/validation.ts +1942 -1263
  97. package/src/config-cache.ts +81 -41
  98. package/src/create-worker-preview.ts +239 -132
  99. package/src/create-worker-upload-form.ts +300 -224
  100. package/src/d1/backups.tsx +218 -0
  101. package/src/d1/constants.ts +2 -0
  102. package/src/d1/create.tsx +63 -0
  103. package/src/d1/delete.tsx +56 -0
  104. package/src/d1/execute.tsx +344 -0
  105. package/src/d1/formatTimeAgo.ts +14 -0
  106. package/src/d1/index.ts +99 -0
  107. package/src/d1/list.tsx +48 -0
  108. package/src/d1/migrations.tsx +446 -0
  109. package/src/d1/options.ts +22 -0
  110. package/src/d1/types.tsx +24 -0
  111. package/src/d1/utils.ts +48 -0
  112. package/src/delete.ts +108 -0
  113. package/src/deployments.ts +77 -0
  114. package/src/deprecated/index.ts +438 -0
  115. package/src/dev/dev-vars.ts +20 -17
  116. package/src/dev/dev.tsx +522 -353
  117. package/src/dev/get-local-persistence-path.tsx +31 -0
  118. package/src/dev/local.tsx +726 -292
  119. package/src/dev/remote.tsx +591 -201
  120. package/src/dev/start-server.ts +519 -0
  121. package/src/dev/use-esbuild.ts +183 -97
  122. package/src/dev/validate-dev-props.ts +31 -0
  123. package/src/dev-registry.tsx +201 -0
  124. package/src/dev.tsx +868 -0
  125. package/src/dialogs.tsx +147 -65
  126. package/src/dispatch-namespace.ts +207 -0
  127. package/src/durable.ts +102 -0
  128. package/src/entry.ts +248 -186
  129. package/src/environment-variables.ts +38 -23
  130. package/src/errors.ts +6 -6
  131. package/src/git-client.ts +124 -0
  132. package/src/global-wrangler-config-path.ts +26 -0
  133. package/src/https-options.ts +84 -80
  134. package/src/index.tsx +632 -2564
  135. package/src/init.ts +970 -0
  136. package/src/inspect.ts +706 -562
  137. package/src/intl-polyfill.d.ts +123 -123
  138. package/src/is-ci.ts +14 -0
  139. package/src/is-interactive.ts +16 -0
  140. package/src/kv/helpers.ts +430 -0
  141. package/src/kv/index.ts +596 -0
  142. package/src/logger.ts +67 -41
  143. package/src/metrics/index.ts +5 -0
  144. package/src/metrics/metrics-config.ts +239 -0
  145. package/src/metrics/metrics-dispatcher.ts +96 -0
  146. package/src/metrics/metrics-usage-headers.ts +24 -0
  147. package/src/metrics/send-event.ts +94 -0
  148. package/src/miniflare-cli/assets.ts +215 -0
  149. package/src/miniflare-cli/index.ts +205 -33
  150. package/src/miniflare-cli/request-context.ts +18 -18
  151. package/src/module-collection.ts +221 -212
  152. package/src/open-in-browser.ts +5 -14
  153. package/src/package-manager.ts +182 -90
  154. package/src/pages/build.tsx +270 -0
  155. package/src/pages/constants.ts +18 -0
  156. package/src/pages/deployments.tsx +106 -0
  157. package/src/pages/dev.tsx +708 -0
  158. package/src/pages/errors.ts +66 -0
  159. package/src/pages/functions/buildPlugin.ts +106 -0
  160. package/src/pages/functions/buildWorker.ts +165 -0
  161. package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
  162. package/src/pages/functions/filepath-routing.ts +189 -0
  163. package/src/pages/functions/identifiers.ts +78 -0
  164. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  165. package/src/pages/functions/routes-consolidation.ts +73 -0
  166. package/src/pages/functions/routes-transformation.test.ts +282 -0
  167. package/src/pages/functions/routes-transformation.ts +115 -0
  168. package/src/pages/functions/routes-validation.test.ts +403 -0
  169. package/src/pages/functions/routes-validation.ts +202 -0
  170. package/src/pages/functions/routes.ts +151 -0
  171. package/src/pages/functions.tsx +82 -0
  172. package/src/pages/hash.tsx +13 -0
  173. package/src/pages/index.tsx +94 -0
  174. package/src/pages/projects.tsx +169 -0
  175. package/src/pages/publish.tsx +446 -0
  176. package/src/pages/types.ts +49 -0
  177. package/src/pages/upload.tsx +425 -0
  178. package/src/pages/utils.ts +12 -0
  179. package/src/parse.ts +223 -120
  180. package/src/paths.ts +53 -8
  181. package/src/proxy.ts +623 -388
  182. package/src/publish/index.ts +270 -0
  183. package/src/publish/publish.ts +1035 -0
  184. package/src/pubsub/index.ts +286 -0
  185. package/src/pubsub/pubsub-commands.tsx +624 -0
  186. package/src/queues/cli/commands/consumer/add.ts +71 -0
  187. package/src/queues/cli/commands/consumer/index.ts +22 -0
  188. package/src/queues/cli/commands/consumer/remove.ts +38 -0
  189. package/src/queues/cli/commands/create.ts +25 -0
  190. package/src/queues/cli/commands/delete.ts +26 -0
  191. package/src/queues/cli/commands/index.ts +33 -0
  192. package/src/queues/cli/commands/list.ts +25 -0
  193. package/src/queues/client.ts +135 -0
  194. package/src/r2/constants.ts +4 -0
  195. package/src/r2/helpers.ts +131 -0
  196. package/src/r2/index.ts +289 -0
  197. package/src/routes.ts +140 -0
  198. package/src/secret/index.ts +378 -0
  199. package/src/selfsigned.d.ts +23 -23
  200. package/src/sites.tsx +281 -202
  201. package/src/tail/createTail.ts +315 -0
  202. package/src/tail/filters.ts +108 -110
  203. package/src/tail/index.ts +211 -296
  204. package/src/tail/printing.ts +86 -46
  205. package/src/type-generation.ts +173 -0
  206. package/src/update-check.ts +11 -11
  207. package/src/user/access.ts +69 -0
  208. package/src/user/choose-account.tsx +69 -0
  209. package/src/user/env-vars.ts +46 -0
  210. package/src/user/generate-auth-url.ts +33 -0
  211. package/src/user/generate-random-state.ts +16 -0
  212. package/src/user/index.ts +3 -0
  213. package/src/user/user.tsx +1192 -0
  214. package/src/utils/collectKeyValues.ts +14 -0
  215. package/src/whoami.tsx +141 -42
  216. package/src/worker.ts +174 -101
  217. package/src/yargs-types.ts +20 -0
  218. package/src/zones.ts +191 -0
  219. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  220. package/templates/checked-fetch.js +17 -0
  221. package/templates/d1-beta-facade.js +196 -0
  222. package/templates/experimental-local-cache-stubs.js +27 -0
  223. package/templates/first-party-worker-module-facade.ts +18 -0
  224. package/templates/format-dev-errors.ts +32 -0
  225. package/templates/init-tests/test-jest-new-worker.js +25 -0
  226. package/templates/init-tests/test-vitest-new-worker.js +26 -0
  227. package/templates/middleware/common.ts +62 -0
  228. package/templates/middleware/loader-modules.ts +84 -0
  229. package/templates/middleware/loader-sw.ts +213 -0
  230. package/templates/middleware/middleware-pretty-error.ts +40 -0
  231. package/templates/middleware/middleware-scheduled.ts +15 -0
  232. package/templates/new-worker-scheduled.js +17 -0
  233. package/templates/new-worker-scheduled.ts +32 -0
  234. package/templates/new-worker.js +3 -3
  235. package/templates/new-worker.ts +18 -3
  236. package/templates/no-op-worker.js +10 -0
  237. package/templates/pages-dev-pipeline.ts +28 -0
  238. package/templates/pages-dev-util.ts +52 -0
  239. package/templates/pages-shim.ts +9 -0
  240. package/templates/pages-template-plugin.ts +171 -0
  241. package/templates/pages-template-worker.ts +189 -0
  242. package/templates/serve-static-assets.ts +63 -0
  243. package/templates/service-bindings-module-facade.js +54 -0
  244. package/templates/service-bindings-sw-facade.js +42 -0
  245. package/templates/tsconfig.json +96 -95
  246. package/wrangler-dist/cli.d.ts +891 -0
  247. package/wrangler-dist/cli.js +101091 -50509
  248. package/pages/functions/buildPlugin.ts +0 -92
  249. package/pages/functions/buildWorker.ts +0 -138
  250. package/pages/functions/filepath-routing.ts +0 -189
  251. package/pages/functions/identifiers.ts +0 -78
  252. package/pages/functions/routes.ts +0 -156
  253. package/pages/functions/template-plugin.ts +0 -146
  254. package/pages/functions/template-worker.ts +0 -143
  255. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  256. package/src/kv.ts +0 -319
  257. package/src/miniflare-cli/enum-keys.ts +0 -17
  258. package/src/pages.tsx +0 -1866
  259. package/src/publish.ts +0 -469
  260. package/src/r2.ts +0 -50
  261. package/src/user.tsx +0 -1193
  262. package/templates/static-asset-facade.js +0 -47
  263. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  264. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  265. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  266. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  267. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  268. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  269. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  270. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  271. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  272. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  273. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  274. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  275. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  276. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  277. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  278. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  279. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  280. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  281. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  282. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  283. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  284. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  285. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  286. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  287. package/vendor/wrangler-mime/LICENSE +0 -21
  288. package/vendor/wrangler-mime/Mime.js +0 -97
  289. package/vendor/wrangler-mime/README.md +0 -187
  290. package/vendor/wrangler-mime/cli.js +0 -46
  291. package/vendor/wrangler-mime/index.js +0 -4
  292. package/vendor/wrangler-mime/lite.js +0 -4
  293. package/vendor/wrangler-mime/package.json +0 -52
  294. package/vendor/wrangler-mime/types/other.js +0 -1
  295. package/vendor/wrangler-mime/types/standard.js +0 -1
package/src/entry.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import assert from "node:assert";
2
- import { existsSync } from "node:fs";
2
+ import { existsSync, statSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import * as esbuild from "esbuild";
5
5
  import { execaCommand } from "execa";
6
6
  import { logger } from "./logger";
7
+ import { getBasePath } from "./paths";
7
8
  import type { Config } from "./config";
8
9
  import type { CfScriptFormat } from "./worker";
9
10
  import type { Metafile } from "esbuild";
@@ -19,101 +20,115 @@ export type Entry = { file: string; directory: string; format: CfScriptFormat };
19
20
  * Compute the entry-point for the Worker.
20
21
  */
21
22
  export async function getEntry(
22
- args: { script?: string; format?: CfScriptFormat | undefined },
23
- config: Config,
24
- command: "dev" | "publish"
23
+ args: {
24
+ script?: string;
25
+ format?: CfScriptFormat | undefined;
26
+ assets?: string | undefined;
27
+ },
28
+ config: Config,
29
+ command: "dev" | "publish" | "types"
25
30
  ): Promise<Entry> {
26
- let file: string;
27
- let directory = process.cwd();
28
- if (args.script) {
29
- // If the script name comes from the command line it is relative to the current working directory.
30
- file = path.resolve(args.script);
31
- } else if (config.main === undefined) {
32
- if (config.site?.["entry-point"]) {
33
- directory = path.resolve(path.dirname(config.configPath ?? "."));
34
- file = path.extname(config.site?.["entry-point"])
35
- ? path.resolve(config.site?.["entry-point"])
36
- : // site.entry-point could be a directory
37
- path.resolve(config.site?.["entry-point"], "index.js");
38
- } else {
39
- throw new Error(
40
- `Missing entry-point: The entry-point should be specified via the command line (e.g. \`wrangler ${command} path/to/script\`) or the \`main\` config field.`
41
- );
42
- }
43
- } else {
44
- directory = path.resolve(path.dirname(config.configPath ?? "."));
45
- file = path.resolve(directory, config.main);
46
- }
31
+ let file: string;
32
+ let directory = process.cwd();
33
+ if (args.script) {
34
+ // If the script name comes from the command line it is relative to the current working directory.
35
+ file = path.resolve(args.script);
36
+ } else if (config.main === undefined) {
37
+ if (config.site?.["entry-point"]) {
38
+ directory = path.resolve(path.dirname(config.configPath ?? "."));
39
+ file = path.extname(config.site?.["entry-point"])
40
+ ? path.resolve(config.site?.["entry-point"])
41
+ : // site.entry-point could be a directory
42
+ path.resolve(config.site?.["entry-point"], "index.js");
43
+ } else if (args.assets || config.assets) {
44
+ file = path.resolve(getBasePath(), "templates/no-op-worker.js");
45
+ } else {
46
+ throw new Error(
47
+ `Missing entry-point: The entry-point should be specified via the command line (e.g. \`wrangler ${command} path/to/script\`) or the \`main\` config field.`
48
+ );
49
+ }
50
+ } else {
51
+ directory = path.resolve(path.dirname(config.configPath ?? "."));
52
+ file = path.resolve(directory, config.main);
53
+ }
47
54
 
48
- await runCustomBuild(file, config.build);
55
+ const relativeFile = path.relative(directory, file) || ".";
56
+ await runCustomBuild(file, relativeFile, config.build);
49
57
 
50
- if (fileExists(file) === false) {
51
- throw new Error(
52
- `Could not resolve "${path.relative(process.cwd(), file)}".`
53
- );
54
- }
55
- const format = await guessWorkerFormat(
56
- file,
57
- directory,
58
- args.format ?? config.build?.upload?.format,
59
- config.tsconfig
60
- );
58
+ if (fileExists(file) === false) {
59
+ throw new Error(
60
+ getMissingEntryPointMessage(
61
+ `The entry-point file at "${relativeFile}" was not found.`,
62
+ file,
63
+ relativeFile
64
+ )
65
+ );
66
+ }
67
+ const format = await guessWorkerFormat(
68
+ file,
69
+ directory,
70
+ args.format ?? config.build?.upload?.format,
71
+ config.tsconfig
72
+ );
61
73
 
62
- const { localBindings, remoteBindings } =
63
- partitionDurableObjectBindings(config);
74
+ const { localBindings, remoteBindings } =
75
+ partitionDurableObjectBindings(config);
64
76
 
65
- if (command === "dev" && remoteBindings.length > 0) {
66
- logger.warn(
67
- "WARNING: You have Durable Object bindings that are not defined locally in the worker being developed.\n" +
68
- "Be aware that changes to the data stored in these Durable Objects will be permanent and affect the live instances.\n" +
69
- "Remote Durable Objects that are affected:\n" +
70
- remoteBindings.map((b) => `- ${JSON.stringify(b)}`).join("\n")
71
- );
72
- }
77
+ if (command === "dev" && remoteBindings.length > 0) {
78
+ logger.warn(
79
+ "WARNING: You have Durable Object bindings that are not defined locally in the worker being developed.\n" +
80
+ "Be aware that changes to the data stored in these Durable Objects will be permanent and affect the live instances.\n" +
81
+ "Remote Durable Objects that are affected:\n" +
82
+ remoteBindings.map((b) => `- ${JSON.stringify(b)}`).join("\n")
83
+ );
84
+ }
73
85
 
74
- if (format === "service-worker" && localBindings.length > 0) {
75
- const errorMessage =
76
- "You seem to be trying to use Durable Objects in a Worker written as a service-worker.";
77
- const addScriptName =
78
- "You can use Durable Objects defined in other Workers by specifying a `script_name` in your wrangler.toml, where `script_name` is the name of the Worker that implements that Durable Object. For example:";
79
- const addScriptNameExamples = generateAddScriptNameExamples(localBindings);
80
- const migrateText =
81
- "Alternatively, migrate your worker to ES Module syntax to implement a Durable Object in this Worker:";
82
- const migrateUrl =
83
- "https://developers.cloudflare.com/workers/learning/migrating-to-module-workers/";
84
- throw new Error(
85
- `${errorMessage}\n${addScriptName}\n${addScriptNameExamples}\n${migrateText}\n${migrateUrl}`
86
- );
87
- }
86
+ if (format === "service-worker" && localBindings.length > 0) {
87
+ const errorMessage =
88
+ "You seem to be trying to use Durable Objects in a Worker written as a service-worker.";
89
+ const addScriptName =
90
+ "You can use Durable Objects defined in other Workers by specifying a `script_name` in your wrangler.toml, where `script_name` is the name of the Worker that implements that Durable Object. For example:";
91
+ const addScriptNameExamples = generateAddScriptNameExamples(localBindings);
92
+ const migrateText =
93
+ "Alternatively, migrate your worker to ES Module syntax to implement a Durable Object in this Worker:";
94
+ const migrateUrl =
95
+ "https://developers.cloudflare.com/workers/learning/migrating-to-module-workers/";
96
+ throw new Error(
97
+ `${errorMessage}\n${addScriptName}\n${addScriptNameExamples}\n${migrateText}\n${migrateUrl}`
98
+ );
99
+ }
88
100
 
89
- return { file, directory, format };
101
+ return { file, directory, format };
90
102
  }
91
103
 
92
104
  export async function runCustomBuild(
93
- expectedEntry: string,
94
- build: Config["build"]
105
+ expectedEntryAbsolute: string,
106
+ expectedEntryRelative: string,
107
+ build: Config["build"]
95
108
  ) {
96
- if (build?.command) {
97
- // TODO: add a deprecation message here?
98
- logger.log("Running custom build:", build.command);
99
- await execaCommand(build.command, {
100
- shell: true,
101
- // we keep these two as "inherit" so that
102
- // logs are still visible.
103
- stdout: "inherit",
104
- stderr: "inherit",
105
- ...(build.cwd && { cwd: build.cwd }),
106
- });
109
+ if (build?.command) {
110
+ // TODO: add a deprecation message here?
111
+ logger.log("Running custom build:", build.command);
112
+ await execaCommand(build.command, {
113
+ shell: true,
114
+ // we keep these two as "inherit" so that
115
+ // logs are still visible.
116
+ stdout: "inherit",
117
+ stderr: "inherit",
118
+ ...(build.cwd && { cwd: build.cwd }),
119
+ });
107
120
 
108
- if (fileExists(expectedEntry) === false) {
109
- throw new Error(
110
- `Could not resolve "${path.relative(
111
- process.cwd(),
112
- expectedEntry
113
- )}" after running custom build: ${build.command}`
114
- );
115
- }
116
- }
121
+ if (fileExists(expectedEntryAbsolute) === false) {
122
+ throw new Error(
123
+ getMissingEntryPointMessage(
124
+ `The expected output file at "${expectedEntryRelative}" was not found after running custom build: ${build.command}.\n` +
125
+ "The `main` property in wrangler.toml should point to the file generated by the custom build.",
126
+ expectedEntryAbsolute,
127
+ expectedEntryRelative
128
+ )
129
+ );
130
+ }
131
+ }
117
132
  }
118
133
 
119
134
  /**
@@ -125,81 +140,81 @@ export async function runCustomBuild(
125
140
  * well in practice.
126
141
  */
127
142
  export default async function guessWorkerFormat(
128
- entryFile: string,
129
- entryWorkingDirectory: string,
130
- hint: CfScriptFormat | undefined,
131
- tsconfig?: string | undefined
143
+ entryFile: string,
144
+ entryWorkingDirectory: string,
145
+ hint: CfScriptFormat | undefined,
146
+ tsconfig?: string | undefined
132
147
  ): Promise<CfScriptFormat> {
133
- const result = await esbuild.build({
134
- entryPoints: [entryFile],
135
- absWorkingDir: entryWorkingDirectory,
136
- metafile: true,
137
- bundle: false,
138
- format: "esm",
139
- target: "es2020",
140
- write: false,
141
- loader: {
142
- ".js": "jsx",
143
- ".mjs": "jsx",
144
- ".cjs": "jsx",
145
- },
146
- ...(tsconfig && { tsconfig }),
147
- });
148
- // result.metafile is defined because of the `metafile: true` option above.
149
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
150
- const metafile = result.metafile!;
151
- const entryPoints = Object.entries(metafile.outputs).filter(
152
- ([_path, output]) => output.entryPoint !== undefined
153
- );
154
- assert(
155
- entryPoints.length > 0,
156
- `Cannot find entry-point "${entryFile}" in generated bundle.` +
157
- listEntryPoints(entryPoints)
158
- );
159
- assert(
160
- entryPoints.length < 2,
161
- "More than one entry-point found for generated bundle." +
162
- listEntryPoints(entryPoints)
163
- );
148
+ const result = await esbuild.build({
149
+ entryPoints: [entryFile],
150
+ absWorkingDir: entryWorkingDirectory,
151
+ metafile: true,
152
+ bundle: false,
153
+ format: "esm",
154
+ target: "es2020",
155
+ write: false,
156
+ loader: {
157
+ ".js": "jsx",
158
+ ".mjs": "jsx",
159
+ ".cjs": "jsx",
160
+ },
161
+ ...(tsconfig && { tsconfig }),
162
+ });
163
+ // result.metafile is defined because of the `metafile: true` option above.
164
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
165
+ const metafile = result.metafile!;
166
+ const entryPoints = Object.entries(metafile.outputs).filter(
167
+ ([_path, output]) => output.entryPoint !== undefined
168
+ );
169
+ assert(
170
+ entryPoints.length > 0,
171
+ `Cannot find entry-point "${entryFile}" in generated bundle.` +
172
+ listEntryPoints(entryPoints)
173
+ );
174
+ assert(
175
+ entryPoints.length < 2,
176
+ "More than one entry-point found for generated bundle." +
177
+ listEntryPoints(entryPoints)
178
+ );
164
179
 
165
- let guessedWorkerFormat: CfScriptFormat;
166
- const scriptExports = entryPoints[0][1].exports;
167
- if (scriptExports.length > 0) {
168
- if (scriptExports.includes("default")) {
169
- guessedWorkerFormat = "modules";
170
- } else {
171
- logger.warn(
172
- `The entrypoint ${path.relative(
173
- process.cwd(),
174
- entryFile
175
- )} has exports like an ES Module, but hasn't defined a default export like a module worker normally would. Building the worker using "service-worker" format...`
176
- );
177
- guessedWorkerFormat = "service-worker";
178
- }
179
- } else {
180
- guessedWorkerFormat = "service-worker";
181
- }
180
+ let guessedWorkerFormat: CfScriptFormat;
181
+ const scriptExports = entryPoints[0][1].exports;
182
+ if (scriptExports.length > 0) {
183
+ if (scriptExports.includes("default")) {
184
+ guessedWorkerFormat = "modules";
185
+ } else {
186
+ logger.warn(
187
+ `The entrypoint ${path.relative(
188
+ process.cwd(),
189
+ entryFile
190
+ )} has exports like an ES Module, but hasn't defined a default export like a module worker normally would. Building the worker using "service-worker" format...`
191
+ );
192
+ guessedWorkerFormat = "service-worker";
193
+ }
194
+ } else {
195
+ guessedWorkerFormat = "service-worker";
196
+ }
182
197
 
183
- if (hint) {
184
- if (hint !== guessedWorkerFormat) {
185
- if (hint === "service-worker") {
186
- throw new Error(
187
- "You configured this worker to be a 'service-worker', but the file you are trying to build appears to have a `default` export like a module worker. Please pass `--format modules`, or simply remove the configuration."
188
- );
189
- } else {
190
- throw new Error(
191
- "You configured this worker to be 'modules', but the file you are trying to build doesn't export a handler. Please pass `--format service-worker`, or simply remove the configuration."
192
- );
193
- }
194
- }
195
- }
196
- return guessedWorkerFormat;
198
+ if (hint) {
199
+ if (hint !== guessedWorkerFormat) {
200
+ if (hint === "service-worker") {
201
+ throw new Error(
202
+ "You configured this worker to be a 'service-worker', but the file you are trying to build appears to have a `default` export like a module worker. Please pass `--format modules`, or simply remove the configuration."
203
+ );
204
+ } else {
205
+ throw new Error(
206
+ "You configured this worker to be 'modules', but the file you are trying to build doesn't export a handler. Please pass `--format service-worker`, or simply remove the configuration."
207
+ );
208
+ }
209
+ }
210
+ }
211
+ return guessedWorkerFormat;
197
212
  }
198
213
 
199
214
  function listEntryPoints(
200
- outputs: [string, ValueOf<Metafile["outputs"]>][]
215
+ outputs: [string, ValueOf<Metafile["outputs"]>][]
201
216
  ): string {
202
- return outputs.map(([_input, output]) => output.entryPoint).join("\n");
217
+ return outputs.map(([_input, output]) => output.entryPoint).join("\n");
203
218
  }
204
219
 
205
220
  type ValueOf<T> = T[keyof T];
@@ -209,16 +224,16 @@ type ValueOf<T> = T[keyof T];
209
224
  * or if some version of it (by appending a common extension) exists.
210
225
  */
211
226
  export function fileExists(filePath: string): boolean {
212
- if (path.extname(filePath) !== "") {
213
- return existsSync(filePath);
214
- }
215
- const base = path.join(path.dirname(filePath), path.basename(filePath));
216
- for (const ext of [".ts", ".tsx", ".js", ".jsx"]) {
217
- if (existsSync(base + ext)) {
218
- return true;
219
- }
220
- }
221
- return false;
227
+ if (path.extname(filePath) !== "") {
228
+ return existsSync(filePath);
229
+ }
230
+ const base = path.join(path.dirname(filePath), path.basename(filePath));
231
+ for (const ext of [".ts", ".tsx", ".js", ".jsx"]) {
232
+ if (existsSync(base + ext)) {
233
+ return true;
234
+ }
235
+ }
236
+ return false;
222
237
  }
223
238
 
224
239
  type DurableObjectBindings = Config["durable_objects"]["bindings"];
@@ -228,19 +243,19 @@ type DurableObjectBindings = Config["durable_objects"]["bindings"];
228
243
  * those that are defined locally and those that refer to a durable object defined in another script.
229
244
  */
230
245
  function partitionDurableObjectBindings(config: Config): {
231
- localBindings: DurableObjectBindings;
232
- remoteBindings: DurableObjectBindings;
246
+ localBindings: DurableObjectBindings;
247
+ remoteBindings: DurableObjectBindings;
233
248
  } {
234
- const localBindings: DurableObjectBindings = [];
235
- const remoteBindings: DurableObjectBindings = [];
236
- for (const binding of config.durable_objects.bindings) {
237
- if (binding.script_name === undefined) {
238
- localBindings.push(binding);
239
- } else {
240
- remoteBindings.push(binding);
241
- }
242
- }
243
- return { localBindings, remoteBindings };
249
+ const localBindings: DurableObjectBindings = [];
250
+ const remoteBindings: DurableObjectBindings = [];
251
+ for (const binding of config.durable_objects.bindings) {
252
+ if (binding.script_name === undefined) {
253
+ localBindings.push(binding);
254
+ } else {
255
+ remoteBindings.push(binding);
256
+ }
257
+ }
258
+ return { localBindings, remoteBindings };
244
259
  }
245
260
 
246
261
  /**
@@ -249,19 +264,66 @@ function partitionDurableObjectBindings(config: Config): {
249
264
  * externally defined Durable Object.
250
265
  */
251
266
  function generateAddScriptNameExamples(
252
- localBindings: DurableObjectBindings
267
+ localBindings: DurableObjectBindings
253
268
  ): string {
254
- function exampleScriptName(binding_name: string): string {
255
- return `${binding_name.toLowerCase().replaceAll("_", "-")}-worker`;
256
- }
269
+ function exampleScriptName(binding_name: string): string {
270
+ return `${binding_name.toLowerCase().replaceAll("_", "-")}-worker`;
271
+ }
257
272
 
258
- return localBindings
259
- .map(({ name, class_name }) => {
260
- const script_name = exampleScriptName(name);
261
- const currentBinding = `{ name = ${name}, class_name = ${class_name} }`;
262
- const fixedBinding = `{ name = ${name}, class_name = ${class_name}, script_name = ${script_name} }`;
273
+ return localBindings
274
+ .map(({ name, class_name }) => {
275
+ const script_name = exampleScriptName(name);
276
+ const currentBinding = `{ name = ${name}, class_name = ${class_name} }`;
277
+ const fixedBinding = `{ name = ${name}, class_name = ${class_name}, script_name = ${script_name} }`;
263
278
 
264
- return `${currentBinding} ==> ${fixedBinding}`;
265
- })
266
- .join("\n");
279
+ return `${currentBinding} ==> ${fixedBinding}`;
280
+ })
281
+ .join("\n");
282
+ }
283
+
284
+ /**
285
+ * Generate an appropriate message for when the entry-point is missing.
286
+ *
287
+ * To be more helpful to developers, we check whether there is a suitable file
288
+ * nearby to the expected file path.
289
+ */
290
+ function getMissingEntryPointMessage(
291
+ message: string,
292
+ absoluteEntryPointPath: string,
293
+ relativeEntryPointPath: string
294
+ ): string {
295
+ if (
296
+ existsSync(absoluteEntryPointPath) &&
297
+ statSync(absoluteEntryPointPath).isDirectory()
298
+ ) {
299
+ // The expected entry-point is a directory, so offer further guidance.
300
+ message += `\nThe provided entry-point path, "${relativeEntryPointPath}", points to a directory, rather than a file.\n`;
301
+
302
+ // Perhaps we can even guess what the correct path should be...
303
+ const possiblePaths: string[] = [];
304
+ for (const basenamePath of [
305
+ "worker",
306
+ "dist/worker",
307
+ "index",
308
+ "dist/index",
309
+ ]) {
310
+ for (const extension of [".ts", ".tsx", ".js", ".jsx"]) {
311
+ const filePath = basenamePath + extension;
312
+ if (fileExists(path.resolve(absoluteEntryPointPath, filePath))) {
313
+ possiblePaths.push(path.join(relativeEntryPointPath, filePath));
314
+ }
315
+ }
316
+ }
317
+
318
+ if (possiblePaths.length > 0) {
319
+ message +=
320
+ `\nDid you mean to set the main field to${
321
+ possiblePaths.length > 1 ? " one of" : ""
322
+ }:\n` +
323
+ "```\n" +
324
+ possiblePaths.map((filePath) => `main = "./${filePath}"\n`).join("") +
325
+ "```";
326
+ }
327
+ }
328
+ return message;
267
329
  }
@@ -1,5 +1,20 @@
1
1
  import { logger } from "./logger";
2
2
 
3
+ type VariableNames =
4
+ | "CLOUDFLARE_ACCOUNT_ID"
5
+ | "CLOUDFLARE_API_TOKEN"
6
+ | "CLOUDFLARE_API_KEY"
7
+ | "CLOUDFLARE_EMAIL"
8
+ | "WRANGLER_SEND_METRICS"
9
+ | "CLOUDFLARE_API_BASE_URL"
10
+ | "WRANGLER_LOG";
11
+
12
+ type DeprecatedNames =
13
+ | "CF_ACCOUNT_ID"
14
+ | "CF_API_TOKEN"
15
+ | "CF_API_KEY"
16
+ | "CF_EMAIL"
17
+ | "CF_API_BASE_URL";
3
18
  /**
4
19
  * Create a function used to access an environment variable.
5
20
  *
@@ -7,29 +22,29 @@ import { logger } from "./logger";
7
22
  * A warning is shown if the client is using a deprecated version - but only once.
8
23
  */
9
24
  export function getEnvironmentVariableFactory({
10
- variableName,
11
- deprecatedName,
12
- defaultValue,
25
+ variableName,
26
+ deprecatedName,
27
+ defaultValue,
13
28
  }: {
14
- variableName: string;
15
- deprecatedName?: string;
16
- defaultValue?: string;
29
+ variableName: VariableNames;
30
+ deprecatedName?: DeprecatedNames;
31
+ defaultValue?: string;
17
32
  }) {
18
- let hasWarned = false;
19
- return () => {
20
- if (process.env[variableName]) {
21
- return process.env[variableName];
22
- } else if (deprecatedName && process.env[deprecatedName]) {
23
- if (!hasWarned) {
24
- // Only show the warning once.
25
- hasWarned = true;
26
- logger.warn(
27
- `Using "${deprecatedName}" environment variable. This is deprecated. Please use "${variableName}", instead.`
28
- );
29
- }
30
- return process.env[deprecatedName];
31
- } else {
32
- return defaultValue;
33
- }
34
- };
33
+ let hasWarned = false;
34
+ return () => {
35
+ if (process.env[variableName]) {
36
+ return process.env[variableName];
37
+ } else if (deprecatedName && process.env[deprecatedName]) {
38
+ if (!hasWarned) {
39
+ // Only show the warning once.
40
+ hasWarned = true;
41
+ logger.warn(
42
+ `Using "${deprecatedName}" environment variable. This is deprecated. Please use "${variableName}", instead.`
43
+ );
44
+ }
45
+ return process.env[deprecatedName];
46
+ } else {
47
+ return defaultValue;
48
+ }
49
+ };
35
50
  }
package/src/errors.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export class DeprecationError extends Error {
2
- constructor(message: string) {
3
- super(`Deprecation:\n${message}`);
4
- }
2
+ constructor(message: string) {
3
+ super(`Deprecation:\n${message}`);
4
+ }
5
5
  }
6
6
 
7
7
  export class FatalError extends Error {
8
- constructor(message?: string, readonly code?: number) {
9
- super(message);
10
- }
8
+ constructor(message?: string, readonly code?: number) {
9
+ super(message);
10
+ }
11
11
  }