wrangler 0.0.0-e64812e → 0.0.0-e6c71262

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 (374) hide show
  1. package/README.md +24 -4
  2. package/bin/wrangler.js +170 -62
  3. package/kv-asset-handler.js +1 -0
  4. package/miniflare-dist/index.mjs +1637 -81
  5. package/package.json +198 -152
  6. package/src/__tests__/access.test.ts +25 -0
  7. package/src/__tests__/api-dev.test.ts +238 -0
  8. package/src/__tests__/api-devregistry.test.ts +121 -0
  9. package/src/__tests__/api.test.ts +102 -0
  10. package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
  11. package/src/__tests__/config-cache.test.ts +30 -24
  12. package/src/__tests__/configuration.test.ts +4660 -3363
  13. package/src/__tests__/constellation.test.ts +371 -0
  14. package/src/__tests__/d1/d1.test.ts +82 -0
  15. package/src/__tests__/d1/execute.test.ts +66 -0
  16. package/src/__tests__/d1/migrate.test.ts +257 -0
  17. package/src/__tests__/d1/splitter.test.ts +255 -0
  18. package/src/__tests__/delete.test.ts +272 -0
  19. package/src/__tests__/deployments.test.ts +369 -0
  20. package/src/__tests__/dev.test.tsx +1589 -952
  21. package/src/__tests__/generate.test.ts +254 -0
  22. package/src/__tests__/get-host-from-url.test.ts +16 -0
  23. package/src/__tests__/guess-worker-format.test.ts +103 -68
  24. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  25. package/src/__tests__/helpers/end-event-loop.ts +6 -0
  26. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  27. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  28. package/src/__tests__/helpers/mock-bin.ts +20 -20
  29. package/src/__tests__/helpers/mock-console.ts +64 -39
  30. package/src/__tests__/helpers/mock-dialogs.ts +88 -79
  31. package/src/__tests__/helpers/mock-get-pages-upload-token.ts +25 -0
  32. package/src/__tests__/helpers/mock-get-zone-from-host.ts +11 -0
  33. package/src/__tests__/helpers/mock-http-server.ts +30 -30
  34. package/src/__tests__/helpers/mock-istty.ts +65 -18
  35. package/src/__tests__/helpers/mock-known-routes.ts +12 -0
  36. package/src/__tests__/helpers/mock-kv.ts +41 -28
  37. package/src/__tests__/helpers/mock-oauth-flow.ts +241 -233
  38. package/src/__tests__/helpers/mock-process.ts +34 -0
  39. package/src/__tests__/helpers/mock-set-timeout.ts +16 -0
  40. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  41. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  42. package/src/__tests__/helpers/msw/blob-worker.cjs +19 -0
  43. package/src/__tests__/helpers/msw/handlers/access.ts +13 -0
  44. package/src/__tests__/helpers/msw/handlers/deployments.ts +160 -0
  45. package/src/__tests__/helpers/msw/handlers/namespaces.ts +81 -0
  46. package/src/__tests__/helpers/msw/handlers/oauth.ts +31 -0
  47. package/src/__tests__/helpers/msw/handlers/r2.ts +60 -0
  48. package/src/__tests__/helpers/msw/handlers/script.ts +56 -0
  49. package/src/__tests__/helpers/msw/handlers/user.ts +52 -0
  50. package/src/__tests__/helpers/msw/handlers/zones.ts +20 -0
  51. package/src/__tests__/helpers/msw/index.ts +52 -0
  52. package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
  53. package/src/__tests__/helpers/run-in-tmp.ts +27 -28
  54. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  55. package/src/__tests__/helpers/string-dynamic-values-matcher.ts +28 -0
  56. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
  57. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
  58. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
  59. package/src/__tests__/helpers/worker-scripts/parent-worker.js +11 -0
  60. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  61. package/src/__tests__/helpers/write-worker-source.ts +16 -16
  62. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  63. package/src/__tests__/https-options.test.ts +142 -109
  64. package/src/__tests__/index.test.ts +262 -236
  65. package/src/__tests__/init.test.ts +3388 -1603
  66. package/src/__tests__/jest.setup.ts +152 -50
  67. package/src/__tests__/kv.test.ts +1789 -1471
  68. package/src/__tests__/logger.test.ts +167 -75
  69. package/src/__tests__/logout.test.ts +47 -0
  70. package/src/__tests__/metrics.test.ts +493 -0
  71. package/src/__tests__/middleware.scheduled.test.ts +145 -0
  72. package/src/__tests__/middleware.test.ts +816 -0
  73. package/src/__tests__/mtls-certificates.test.ts +589 -0
  74. package/src/__tests__/package-manager.test.ts +303 -303
  75. package/src/__tests__/pages/deployment-list.test.ts +80 -0
  76. package/src/__tests__/pages/functions-build.test.ts +528 -0
  77. package/src/__tests__/pages/pages.test.ts +81 -0
  78. package/src/__tests__/pages/project-create.test.ts +63 -0
  79. package/src/__tests__/pages/project-list.test.ts +110 -0
  80. package/src/__tests__/pages/project-upload.test.ts +500 -0
  81. package/src/__tests__/pages/publish.test.ts +2864 -0
  82. package/src/__tests__/pages-deployment-tail.test.ts +957 -0
  83. package/src/__tests__/parse.test.ts +358 -252
  84. package/src/__tests__/paths.test.ts +39 -0
  85. package/src/__tests__/publish.test.ts +8736 -5355
  86. package/src/__tests__/pubsub.test.ts +496 -0
  87. package/src/__tests__/queues.test.ts +532 -0
  88. package/src/__tests__/r2.test.ts +369 -228
  89. package/src/__tests__/route.test.ts +18 -18
  90. package/src/__tests__/secret.test.ts +681 -469
  91. package/src/__tests__/tail.test.ts +866 -567
  92. package/src/__tests__/test-old-node-version.js +31 -0
  93. package/src/__tests__/traverse-module-graph.test.ts +220 -0
  94. package/src/__tests__/tsconfig-sanity.ts +12 -0
  95. package/src/__tests__/tsconfig.json +8 -0
  96. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  97. package/src/__tests__/type-generation.test.ts +234 -0
  98. package/src/__tests__/unstableDev.test.ts +61 -0
  99. package/src/__tests__/user.test.ts +107 -120
  100. package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
  101. package/src/__tests__/validate-dev-props.test.ts +56 -0
  102. package/src/__tests__/version.test.ts +35 -0
  103. package/src/__tests__/whoami.test.tsx +165 -98
  104. package/src/__tests__/worker-namespace.test.ts +340 -0
  105. package/src/abort.d.ts +1 -1
  106. package/src/api/dev.ts +321 -0
  107. package/src/api/index.ts +11 -0
  108. package/src/api/mtls-certificate.ts +148 -0
  109. package/src/api/pages/create-worker-bundle-contents.ts +79 -0
  110. package/src/api/pages/index.ts +5 -0
  111. package/src/api/pages/publish.tsx +371 -0
  112. package/src/bundle-reporter.ts +68 -0
  113. package/src/bundle.ts +890 -161
  114. package/src/cfetch/index.ts +120 -83
  115. package/src/cfetch/internal.ts +215 -97
  116. package/src/cli.ts +23 -8
  117. package/src/config/config.ts +244 -196
  118. package/src/config/diagnostics.ts +61 -61
  119. package/src/config/environment.ts +587 -357
  120. package/src/config/index.ts +395 -196
  121. package/src/config/validation-helpers.ts +379 -357
  122. package/src/config/validation.ts +2285 -1367
  123. package/src/config-cache.ts +81 -41
  124. package/src/constellation/createProject.tsx +51 -0
  125. package/src/constellation/deleteProject.ts +51 -0
  126. package/src/constellation/deleteProjectModel.ts +76 -0
  127. package/src/constellation/index.ts +75 -0
  128. package/src/constellation/listCatalog.tsx +35 -0
  129. package/src/constellation/listModel.tsx +49 -0
  130. package/src/constellation/listProject.tsx +28 -0
  131. package/src/constellation/listRuntime.tsx +28 -0
  132. package/src/constellation/options.ts +17 -0
  133. package/src/constellation/types.ts +17 -0
  134. package/src/constellation/uploadModel.tsx +84 -0
  135. package/src/constellation/utils.ts +90 -0
  136. package/src/create-worker-preview.ts +250 -142
  137. package/src/create-worker-upload-form.ts +364 -238
  138. package/src/d1/backups.tsx +219 -0
  139. package/src/d1/constants.ts +5 -0
  140. package/src/d1/create.tsx +102 -0
  141. package/src/d1/delete.ts +53 -0
  142. package/src/d1/execute.tsx +371 -0
  143. package/src/d1/formatTimeAgo.ts +14 -0
  144. package/src/d1/index.ts +100 -0
  145. package/src/d1/list.tsx +62 -0
  146. package/src/d1/migrations/apply.tsx +235 -0
  147. package/src/d1/migrations/create.tsx +79 -0
  148. package/src/d1/migrations/helpers.ts +171 -0
  149. package/src/d1/migrations/index.ts +3 -0
  150. package/src/d1/migrations/list.tsx +95 -0
  151. package/src/d1/migrations/options.ts +23 -0
  152. package/src/d1/options.ts +22 -0
  153. package/src/d1/splitter.ts +161 -0
  154. package/src/d1/types.ts +32 -0
  155. package/src/d1/utils.ts +49 -0
  156. package/src/delete.ts +100 -0
  157. package/src/deployments.ts +368 -0
  158. package/src/deprecated/index.ts +144 -0
  159. package/src/dev/dev-vars.ts +20 -17
  160. package/src/dev/dev.tsx +538 -352
  161. package/src/dev/get-local-persistence-path.ts +31 -0
  162. package/src/dev/local.tsx +932 -298
  163. package/src/dev/remote.tsx +623 -215
  164. package/src/dev/start-server.ts +545 -0
  165. package/src/dev/use-esbuild.ts +194 -97
  166. package/src/dev/validate-dev-props.ts +40 -0
  167. package/src/dev-registry.ts +213 -0
  168. package/src/dev.tsx +937 -0
  169. package/src/dialogs.ts +136 -0
  170. package/src/dispatch-namespace.ts +211 -0
  171. package/src/docs/helpers.ts +50 -0
  172. package/src/docs/index.ts +54 -0
  173. package/src/durable.ts +87 -87
  174. package/src/entry.ts +253 -231
  175. package/src/environment-variables/factory.ts +89 -0
  176. package/src/environment-variables/misc-variables.ts +30 -0
  177. package/src/errors.ts +6 -6
  178. package/src/generate/index.ts +304 -0
  179. package/src/git-client.ts +135 -0
  180. package/src/global-wrangler-config-path.ts +26 -0
  181. package/src/https-options.ts +84 -80
  182. package/src/index.ts +769 -0
  183. package/src/init.ts +1123 -0
  184. package/src/inspect.ts +816 -595
  185. package/src/intl-polyfill.d.ts +123 -123
  186. package/src/is-ci.ts +14 -0
  187. package/src/is-interactive.ts +16 -0
  188. package/src/jest.d.ts +4 -0
  189. package/src/kv/helpers.ts +433 -0
  190. package/src/kv/index.ts +594 -0
  191. package/src/logger.ts +100 -43
  192. package/src/metrics/index.ts +5 -0
  193. package/src/metrics/metrics-config.ts +239 -0
  194. package/src/metrics/metrics-dispatcher.ts +96 -0
  195. package/src/metrics/metrics-usage-headers.ts +24 -0
  196. package/src/metrics/send-event.ts +99 -0
  197. package/src/miniflare-cli/assets.ts +251 -0
  198. package/src/miniflare-cli/index.ts +202 -33
  199. package/src/miniflare-cli/request-context.ts +18 -18
  200. package/src/miniflare-cli/tsconfig.json +9 -0
  201. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  202. package/src/miniflare-cli/types.ts +11 -0
  203. package/src/module-collection.ts +290 -215
  204. package/src/mtls-certificate/cli.ts +155 -0
  205. package/src/open-in-browser.ts +4 -6
  206. package/src/package-manager.ts +173 -128
  207. package/src/pages/build.ts +423 -0
  208. package/src/pages/buildFunctions.ts +140 -0
  209. package/src/pages/constants.ts +18 -0
  210. package/src/pages/deployment-tails.ts +281 -0
  211. package/src/pages/deployments.tsx +84 -0
  212. package/src/pages/dev.ts +734 -0
  213. package/src/pages/errors.ts +67 -0
  214. package/src/pages/functions/buildPlugin.ts +114 -0
  215. package/src/pages/functions/buildWorker.ts +350 -0
  216. package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
  217. package/src/pages/functions/filepath-routing.ts +189 -0
  218. package/src/pages/functions/identifiers.ts +78 -0
  219. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  220. package/src/pages/functions/routes-consolidation.ts +73 -0
  221. package/src/pages/functions/routes-transformation.test.ts +282 -0
  222. package/src/pages/functions/routes-transformation.ts +115 -0
  223. package/src/pages/functions/routes-validation.test.ts +403 -0
  224. package/src/pages/functions/routes-validation.ts +202 -0
  225. package/src/pages/functions/routes.ts +151 -0
  226. package/src/pages/functions/tsconfig.json +8 -0
  227. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  228. package/src/pages/functions.ts +86 -0
  229. package/src/pages/hash.ts +13 -0
  230. package/src/pages/index.ts +102 -0
  231. package/src/pages/projects.tsx +159 -0
  232. package/src/pages/prompt-select-project.tsx +31 -0
  233. package/src/pages/publish.tsx +267 -0
  234. package/src/pages/types.ts +46 -0
  235. package/src/pages/upload.tsx +469 -0
  236. package/src/pages/utils.ts +23 -0
  237. package/src/parse.ts +232 -126
  238. package/src/paths.ts +53 -8
  239. package/src/proxy.ts +623 -394
  240. package/src/publish/index.ts +274 -0
  241. package/src/publish/publish.ts +1067 -0
  242. package/src/pubsub/index.ts +286 -0
  243. package/src/pubsub/pubsub-commands.ts +623 -0
  244. package/src/queues/cli/commands/consumer/add.ts +71 -0
  245. package/src/queues/cli/commands/consumer/index.ts +19 -0
  246. package/src/queues/cli/commands/consumer/remove.ts +31 -0
  247. package/src/queues/cli/commands/create.ts +25 -0
  248. package/src/queues/cli/commands/delete.ts +26 -0
  249. package/src/queues/cli/commands/index.ts +35 -0
  250. package/src/queues/cli/commands/list.ts +25 -0
  251. package/src/queues/client.ts +136 -0
  252. package/src/queues/utils.ts +18 -0
  253. package/src/r2/constants.ts +4 -0
  254. package/src/r2/helpers.ts +132 -0
  255. package/src/r2/index.ts +289 -0
  256. package/src/routes.ts +140 -0
  257. package/src/secret/index.ts +379 -0
  258. package/src/selfsigned.d.ts +23 -23
  259. package/src/sites.ts +484 -0
  260. package/src/tail/createTail.ts +415 -0
  261. package/src/tail/filters.ts +109 -111
  262. package/src/tail/index.ts +208 -296
  263. package/src/tail/printing.ts +116 -51
  264. package/src/traverse-module-graph.ts +54 -0
  265. package/src/tsconfig-sanity.ts +16 -0
  266. package/src/type-generation.ts +187 -0
  267. package/src/update-check.ts +11 -11
  268. package/src/user/access.ts +68 -0
  269. package/src/user/auth-variables.ts +113 -0
  270. package/src/user/choose-account.tsx +39 -0
  271. package/src/user/generate-auth-url.ts +33 -0
  272. package/src/user/generate-random-state.ts +16 -0
  273. package/src/user/index.ts +2 -0
  274. package/src/user/user.ts +1234 -0
  275. package/src/utils/collectKeyValues.ts +14 -0
  276. package/src/utils/render.ts +93 -0
  277. package/src/whoami.ts +135 -0
  278. package/src/worker.ts +220 -106
  279. package/src/yargs-types.ts +37 -0
  280. package/src/zones.ts +191 -0
  281. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  282. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  283. package/templates/__tests__/tsconfig.json +8 -0
  284. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  285. package/templates/checked-fetch.js +23 -0
  286. package/templates/d1-beta-facade.js +244 -0
  287. package/templates/facade.d.ts +14 -0
  288. package/templates/first-party-worker-module-facade.ts +19 -0
  289. package/templates/format-dev-errors.ts +34 -0
  290. package/templates/gitignore +1 -0
  291. package/templates/init-tests/test-jest-new-worker.js +23 -0
  292. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  293. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  294. package/templates/middleware/common.ts +62 -0
  295. package/templates/middleware/loader-modules.ts +84 -0
  296. package/templates/middleware/loader-sw.ts +233 -0
  297. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  298. package/templates/middleware/middleware-pretty-error.ts +40 -0
  299. package/templates/middleware/middleware-scheduled.ts +15 -0
  300. package/templates/new-worker-scheduled.js +3 -3
  301. package/templates/new-worker-scheduled.ts +15 -15
  302. package/templates/new-worker.js +3 -3
  303. package/templates/new-worker.ts +18 -15
  304. package/templates/no-op-worker.js +10 -0
  305. package/templates/pages-dev-pipeline.ts +31 -0
  306. package/templates/pages-dev-util.ts +55 -0
  307. package/templates/pages-shim.ts +12 -0
  308. package/templates/pages-template-plugin.ts +180 -0
  309. package/templates/pages-template-worker.ts +189 -0
  310. package/templates/serve-static-assets.ts +66 -0
  311. package/templates/service-bindings-module-facade.js +55 -0
  312. package/templates/service-bindings-sw-facade.js +42 -0
  313. package/templates/tsconfig-sanity.ts +11 -0
  314. package/templates/tsconfig.init.json +105 -0
  315. package/templates/tsconfig.json +6 -103
  316. package/templates/tsconfig.tsbuildinfo +1 -0
  317. package/wrangler-dist/cli.d.ts +1673 -0
  318. package/wrangler-dist/cli.js +119141 -91468
  319. package/wrangler-dist/wasm-sync.wasm +0 -0
  320. package/pages/functions/buildPlugin.ts +0 -105
  321. package/pages/functions/buildWorker.ts +0 -151
  322. package/pages/functions/filepath-routing.ts +0 -189
  323. package/pages/functions/identifiers.ts +0 -78
  324. package/pages/functions/routes.ts +0 -156
  325. package/pages/functions/template-plugin.ts +0 -147
  326. package/pages/functions/template-worker.ts +0 -143
  327. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  328. package/src/__tests__/helpers/mock-cfetch.ts +0 -211
  329. package/src/__tests__/pages.test.ts +0 -754
  330. package/src/dialogs.tsx +0 -135
  331. package/src/environment-variables.ts +0 -35
  332. package/src/index.tsx +0 -2864
  333. package/src/kv.ts +0 -408
  334. package/src/miniflare-cli/enum-keys.ts +0 -17
  335. package/src/pages.tsx +0 -2038
  336. package/src/publish.ts +0 -583
  337. package/src/r2.ts +0 -50
  338. package/src/sites.tsx +0 -295
  339. package/src/user.tsx +0 -1203
  340. package/src/whoami.tsx +0 -70
  341. package/templates/static-asset-facade.js +0 -47
  342. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  343. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  344. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  345. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  346. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  347. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  348. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  349. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  350. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  351. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  352. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  353. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  354. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  355. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  356. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  357. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  358. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  359. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  360. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  361. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  362. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  363. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  364. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  365. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  366. package/vendor/wrangler-mime/LICENSE +0 -21
  367. package/vendor/wrangler-mime/Mime.js +0 -97
  368. package/vendor/wrangler-mime/README.md +0 -187
  369. package/vendor/wrangler-mime/cli.js +0 -46
  370. package/vendor/wrangler-mime/index.js +0 -4
  371. package/vendor/wrangler-mime/lite.js +0 -4
  372. package/vendor/wrangler-mime/package.json +0 -52
  373. package/vendor/wrangler-mime/types/other.js +0 -1
  374. package/vendor/wrangler-mime/types/standard.js +0 -1
package/src/entry.ts CHANGED
@@ -3,8 +3,11 @@ 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
+ import { COMMON_ESBUILD_OPTIONS } from "./bundle";
6
7
  import { logger } from "./logger";
8
+ import { getBasePath } from "./paths";
7
9
  import type { Config } from "./config";
10
+ import type { DurableObjectBindings } from "./config/environment";
8
11
  import type { CfScriptFormat } from "./worker";
9
12
  import type { Metafile } from "esbuild";
10
13
 
@@ -13,115 +16,142 @@ import type { Metafile } from "esbuild";
13
16
  *
14
17
  * It consists not just of a `file`, but also of a `directory` that is used to resolve relative paths.
15
18
  */
16
- export type Entry = { file: string; directory: string; format: CfScriptFormat };
19
+ export type Entry = {
20
+ /** A worker's entrypoint */
21
+ file: string;
22
+ /** A worker's directory. Usually where the wrangler.toml file is located */
23
+ directory: string;
24
+ /** Is this a module worker or a service worker? */
25
+ format: CfScriptFormat;
26
+ /** The directory that contains all of a `--no-bundle` worker's modules. Usually `${directory}/src`. Defaults to path.dirname(file) */
27
+ moduleRoot: string;
28
+
29
+ /**
30
+ * A worker's name
31
+ */
32
+ name?: string | undefined;
33
+ };
17
34
 
18
35
  /**
19
36
  * Compute the entry-point for the Worker.
20
37
  */
21
38
  export async function getEntry(
22
- args: { script?: string; format?: CfScriptFormat | undefined },
23
- config: Config,
24
- command: "dev" | "publish"
39
+ args: {
40
+ script?: string;
41
+ format?: CfScriptFormat | undefined;
42
+ assets?: string | undefined;
43
+ moduleRoot?: string;
44
+ },
45
+ config: Config,
46
+ command: "dev" | "publish" | "types"
25
47
  ): 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
- }
48
+ let file: string;
49
+ let directory = process.cwd();
50
+ if (args.script) {
51
+ // If the script name comes from the command line it is relative to the current working directory.
52
+ file = path.resolve(args.script);
53
+ } else if (config.main === undefined) {
54
+ if (config.site?.["entry-point"]) {
55
+ directory = path.resolve(path.dirname(config.configPath ?? "."));
56
+ file = path.extname(config.site?.["entry-point"])
57
+ ? path.resolve(config.site?.["entry-point"])
58
+ : // site.entry-point could be a directory
59
+ path.resolve(config.site?.["entry-point"], "index.js");
60
+ } else if (args.assets || config.assets) {
61
+ file = path.resolve(getBasePath(), "templates/no-op-worker.js");
62
+ } else {
63
+ throw new Error(
64
+ `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.`
65
+ );
66
+ }
67
+ } else {
68
+ directory = path.resolve(path.dirname(config.configPath ?? "."));
69
+ file = path.resolve(directory, config.main);
70
+ }
47
71
 
48
- const relativeFile = path.relative(directory, file) || ".";
49
- await runCustomBuild(file, relativeFile, config.build);
72
+ const relativeFile = path.relative(directory, file) || ".";
73
+ await runCustomBuild(file, relativeFile, config.build);
50
74
 
51
- if (fileExists(file) === false) {
52
- throw new Error(
53
- getMissingEntryPointMessage(
54
- `The entry-point file at "${relativeFile}" was not found.`,
55
- file,
56
- relativeFile
57
- )
58
- );
59
- }
60
- const format = await guessWorkerFormat(
61
- file,
62
- directory,
63
- args.format ?? config.build?.upload?.format,
64
- config.tsconfig
65
- );
75
+ if (fileExists(file) === false) {
76
+ throw new Error(
77
+ getMissingEntryPointMessage(
78
+ `The entry-point file at "${relativeFile}" was not found.`,
79
+ file,
80
+ relativeFile
81
+ )
82
+ );
83
+ }
84
+ const format = await guessWorkerFormat(
85
+ file,
86
+ directory,
87
+ args.format ?? config.build?.upload?.format,
88
+ config.tsconfig
89
+ );
66
90
 
67
- const { localBindings, remoteBindings } =
68
- partitionDurableObjectBindings(config);
91
+ const { localBindings, remoteBindings } =
92
+ partitionDurableObjectBindings(config);
69
93
 
70
- if (command === "dev" && remoteBindings.length > 0) {
71
- logger.warn(
72
- "WARNING: You have Durable Object bindings that are not defined locally in the worker being developed.\n" +
73
- "Be aware that changes to the data stored in these Durable Objects will be permanent and affect the live instances.\n" +
74
- "Remote Durable Objects that are affected:\n" +
75
- remoteBindings.map((b) => `- ${JSON.stringify(b)}`).join("\n")
76
- );
77
- }
94
+ if (command === "dev" && remoteBindings.length > 0) {
95
+ logger.warn(
96
+ "WARNING: You have Durable Object bindings that are not defined locally in the worker being developed.\n" +
97
+ "Be aware that changes to the data stored in these Durable Objects will be permanent and affect the live instances.\n" +
98
+ "Remote Durable Objects that are affected:\n" +
99
+ remoteBindings.map((b) => `- ${JSON.stringify(b)}`).join("\n")
100
+ );
101
+ }
78
102
 
79
- if (format === "service-worker" && localBindings.length > 0) {
80
- const errorMessage =
81
- "You seem to be trying to use Durable Objects in a Worker written as a service-worker.";
82
- const addScriptName =
83
- "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:";
84
- const addScriptNameExamples = generateAddScriptNameExamples(localBindings);
85
- const migrateText =
86
- "Alternatively, migrate your worker to ES Module syntax to implement a Durable Object in this Worker:";
87
- const migrateUrl =
88
- "https://developers.cloudflare.com/workers/learning/migrating-to-module-workers/";
89
- throw new Error(
90
- `${errorMessage}\n${addScriptName}\n${addScriptNameExamples}\n${migrateText}\n${migrateUrl}`
91
- );
92
- }
103
+ if (format === "service-worker" && localBindings.length > 0) {
104
+ const errorMessage =
105
+ "You seem to be trying to use Durable Objects in a Worker written as a service-worker.";
106
+ const addScriptName =
107
+ "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:";
108
+ const addScriptNameExamples = generateAddScriptNameExamples(localBindings);
109
+ const migrateText =
110
+ "Alternatively, migrate your worker to ES Module syntax to implement a Durable Object in this Worker:";
111
+ const migrateUrl =
112
+ "https://developers.cloudflare.com/workers/learning/migrating-to-module-workers/";
113
+ throw new Error(
114
+ `${errorMessage}\n${addScriptName}\n${addScriptNameExamples}\n${migrateText}\n${migrateUrl}`
115
+ );
116
+ }
93
117
 
94
- return { file, directory, format };
118
+ return {
119
+ file,
120
+ directory,
121
+ format,
122
+ moduleRoot: args.moduleRoot ?? config.base_dir ?? path.dirname(file),
123
+ name: config.name ?? "worker",
124
+ };
95
125
  }
96
126
 
97
127
  export async function runCustomBuild(
98
- expectedEntryAbsolute: string,
99
- expectedEntryRelative: string,
100
- build: Config["build"]
128
+ expectedEntryAbsolute: string,
129
+ expectedEntryRelative: string,
130
+ build: Config["build"]
101
131
  ) {
102
- if (build?.command) {
103
- // TODO: add a deprecation message here?
104
- logger.log("Running custom build:", build.command);
105
- await execaCommand(build.command, {
106
- shell: true,
107
- // we keep these two as "inherit" so that
108
- // logs are still visible.
109
- stdout: "inherit",
110
- stderr: "inherit",
111
- ...(build.cwd && { cwd: build.cwd }),
112
- });
132
+ if (build?.command) {
133
+ // TODO: add a deprecation message here?
134
+ logger.log("Running custom build:", build.command);
135
+ await execaCommand(build.command, {
136
+ shell: true,
137
+ // we keep these two as "inherit" so that
138
+ // logs are still visible.
139
+ stdout: "inherit",
140
+ stderr: "inherit",
141
+ ...(build.cwd && { cwd: build.cwd }),
142
+ });
113
143
 
114
- if (fileExists(expectedEntryAbsolute) === false) {
115
- throw new Error(
116
- getMissingEntryPointMessage(
117
- `The expected output file at "${expectedEntryRelative}" was not found after running custom build: ${build.command}.\n` +
118
- "The `main` property in wrangler.toml should point to the file generated by the custom build.",
119
- expectedEntryAbsolute,
120
- expectedEntryRelative
121
- )
122
- );
123
- }
124
- }
144
+ if (fileExists(expectedEntryAbsolute) === false) {
145
+ throw new Error(
146
+ getMissingEntryPointMessage(
147
+ `The expected output file at "${expectedEntryRelative}" was not found after running custom build: ${build.command}.\n` +
148
+ "The `main` property in wrangler.toml should point to the file generated by the custom build.",
149
+ expectedEntryAbsolute,
150
+ expectedEntryRelative
151
+ )
152
+ );
153
+ }
154
+ }
125
155
  }
126
156
 
127
157
  /**
@@ -133,81 +163,75 @@ export async function runCustomBuild(
133
163
  * well in practice.
134
164
  */
135
165
  export default async function guessWorkerFormat(
136
- entryFile: string,
137
- entryWorkingDirectory: string,
138
- hint: CfScriptFormat | undefined,
139
- tsconfig?: string | undefined
166
+ entryFile: string,
167
+ entryWorkingDirectory: string,
168
+ hint: CfScriptFormat | undefined,
169
+ tsconfig?: string | undefined
140
170
  ): Promise<CfScriptFormat> {
141
- const result = await esbuild.build({
142
- entryPoints: [entryFile],
143
- absWorkingDir: entryWorkingDirectory,
144
- metafile: true,
145
- bundle: false,
146
- format: "esm",
147
- target: "es2020",
148
- write: false,
149
- loader: {
150
- ".js": "jsx",
151
- ".mjs": "jsx",
152
- ".cjs": "jsx",
153
- },
154
- ...(tsconfig && { tsconfig }),
155
- });
156
- // result.metafile is defined because of the `metafile: true` option above.
157
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
158
- const metafile = result.metafile!;
159
- const entryPoints = Object.entries(metafile.outputs).filter(
160
- ([_path, output]) => output.entryPoint !== undefined
161
- );
162
- assert(
163
- entryPoints.length > 0,
164
- `Cannot find entry-point "${entryFile}" in generated bundle.` +
165
- listEntryPoints(entryPoints)
166
- );
167
- assert(
168
- entryPoints.length < 2,
169
- "More than one entry-point found for generated bundle." +
170
- listEntryPoints(entryPoints)
171
- );
171
+ const result = await esbuild.build({
172
+ ...COMMON_ESBUILD_OPTIONS,
173
+ entryPoints: [entryFile],
174
+ absWorkingDir: entryWorkingDirectory,
175
+ metafile: true,
176
+ bundle: false,
177
+ write: false,
178
+ ...(tsconfig && { tsconfig }),
179
+ });
180
+ // result.metafile is defined because of the `metafile: true` option above.
181
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
182
+ const metafile = result.metafile!;
183
+ const entryPoints = Object.entries(metafile.outputs).filter(
184
+ ([_path, output]) => output.entryPoint !== undefined
185
+ );
186
+ assert(
187
+ entryPoints.length > 0,
188
+ `Cannot find entry-point "${entryFile}" in generated bundle.` +
189
+ listEntryPoints(entryPoints)
190
+ );
191
+ assert(
192
+ entryPoints.length < 2,
193
+ "More than one entry-point found for generated bundle." +
194
+ listEntryPoints(entryPoints)
195
+ );
172
196
 
173
- let guessedWorkerFormat: CfScriptFormat;
174
- const scriptExports = entryPoints[0][1].exports;
175
- if (scriptExports.length > 0) {
176
- if (scriptExports.includes("default")) {
177
- guessedWorkerFormat = "modules";
178
- } else {
179
- logger.warn(
180
- `The entrypoint ${path.relative(
181
- process.cwd(),
182
- entryFile
183
- )} 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...`
184
- );
185
- guessedWorkerFormat = "service-worker";
186
- }
187
- } else {
188
- guessedWorkerFormat = "service-worker";
189
- }
197
+ let guessedWorkerFormat: CfScriptFormat;
198
+ const scriptExports = entryPoints[0][1].exports;
199
+ if (scriptExports.length > 0) {
200
+ if (scriptExports.includes("default")) {
201
+ guessedWorkerFormat = "modules";
202
+ } else {
203
+ logger.warn(
204
+ `The entrypoint ${path.relative(
205
+ process.cwd(),
206
+ entryFile
207
+ )} 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...`
208
+ );
209
+ guessedWorkerFormat = "service-worker";
210
+ }
211
+ } else {
212
+ guessedWorkerFormat = "service-worker";
213
+ }
190
214
 
191
- if (hint) {
192
- if (hint !== guessedWorkerFormat) {
193
- if (hint === "service-worker") {
194
- throw new Error(
195
- "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."
196
- );
197
- } else {
198
- throw new Error(
199
- "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."
200
- );
201
- }
202
- }
203
- }
204
- return guessedWorkerFormat;
215
+ if (hint) {
216
+ if (hint !== guessedWorkerFormat) {
217
+ if (hint === "service-worker") {
218
+ throw new Error(
219
+ "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."
220
+ );
221
+ } else {
222
+ throw new Error(
223
+ "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."
224
+ );
225
+ }
226
+ }
227
+ }
228
+ return guessedWorkerFormat;
205
229
  }
206
230
 
207
231
  function listEntryPoints(
208
- outputs: [string, ValueOf<Metafile["outputs"]>][]
232
+ outputs: [string, ValueOf<Metafile["outputs"]>][]
209
233
  ): string {
210
- return outputs.map(([_input, output]) => output.entryPoint).join("\n");
234
+ return outputs.map(([_input, output]) => output.entryPoint).join("\n");
211
235
  }
212
236
 
213
237
  type ValueOf<T> = T[keyof T];
@@ -217,38 +241,36 @@ type ValueOf<T> = T[keyof T];
217
241
  * or if some version of it (by appending a common extension) exists.
218
242
  */
219
243
  export function fileExists(filePath: string): boolean {
220
- if (path.extname(filePath) !== "") {
221
- return existsSync(filePath);
222
- }
223
- const base = path.join(path.dirname(filePath), path.basename(filePath));
224
- for (const ext of [".ts", ".tsx", ".js", ".jsx"]) {
225
- if (existsSync(base + ext)) {
226
- return true;
227
- }
228
- }
229
- return false;
244
+ if (path.extname(filePath) !== "") {
245
+ return existsSync(filePath);
246
+ }
247
+ const base = path.join(path.dirname(filePath), path.basename(filePath));
248
+ for (const ext of [".ts", ".tsx", ".js", ".jsx"]) {
249
+ if (existsSync(base + ext)) {
250
+ return true;
251
+ }
252
+ }
253
+ return false;
230
254
  }
231
255
 
232
- type DurableObjectBindings = Config["durable_objects"]["bindings"];
233
-
234
256
  /**
235
257
  * Groups the durable object bindings into two lists:
236
258
  * those that are defined locally and those that refer to a durable object defined in another script.
237
259
  */
238
260
  function partitionDurableObjectBindings(config: Config): {
239
- localBindings: DurableObjectBindings;
240
- remoteBindings: DurableObjectBindings;
261
+ localBindings: DurableObjectBindings;
262
+ remoteBindings: DurableObjectBindings;
241
263
  } {
242
- const localBindings: DurableObjectBindings = [];
243
- const remoteBindings: DurableObjectBindings = [];
244
- for (const binding of config.durable_objects.bindings) {
245
- if (binding.script_name === undefined) {
246
- localBindings.push(binding);
247
- } else {
248
- remoteBindings.push(binding);
249
- }
250
- }
251
- return { localBindings, remoteBindings };
264
+ const localBindings: DurableObjectBindings = [];
265
+ const remoteBindings: DurableObjectBindings = [];
266
+ for (const binding of config.durable_objects.bindings) {
267
+ if (binding.script_name === undefined) {
268
+ localBindings.push(binding);
269
+ } else {
270
+ remoteBindings.push(binding);
271
+ }
272
+ }
273
+ return { localBindings, remoteBindings };
252
274
  }
253
275
 
254
276
  /**
@@ -257,21 +279,21 @@ function partitionDurableObjectBindings(config: Config): {
257
279
  * externally defined Durable Object.
258
280
  */
259
281
  function generateAddScriptNameExamples(
260
- localBindings: DurableObjectBindings
282
+ localBindings: DurableObjectBindings
261
283
  ): string {
262
- function exampleScriptName(binding_name: string): string {
263
- return `${binding_name.toLowerCase().replaceAll("_", "-")}-worker`;
264
- }
284
+ function exampleScriptName(binding_name: string): string {
285
+ return `${binding_name.toLowerCase().replaceAll("_", "-")}-worker`;
286
+ }
265
287
 
266
- return localBindings
267
- .map(({ name, class_name }) => {
268
- const script_name = exampleScriptName(name);
269
- const currentBinding = `{ name = ${name}, class_name = ${class_name} }`;
270
- const fixedBinding = `{ name = ${name}, class_name = ${class_name}, script_name = ${script_name} }`;
288
+ return localBindings
289
+ .map(({ name, class_name }) => {
290
+ const script_name = exampleScriptName(name);
291
+ const currentBinding = `{ name = ${name}, class_name = ${class_name} }`;
292
+ const fixedBinding = `{ name = ${name}, class_name = ${class_name}, script_name = ${script_name} }`;
271
293
 
272
- return `${currentBinding} ==> ${fixedBinding}`;
273
- })
274
- .join("\n");
294
+ return `${currentBinding} ==> ${fixedBinding}`;
295
+ })
296
+ .join("\n");
275
297
  }
276
298
 
277
299
  /**
@@ -281,42 +303,42 @@ function generateAddScriptNameExamples(
281
303
  * nearby to the expected file path.
282
304
  */
283
305
  function getMissingEntryPointMessage(
284
- message: string,
285
- absoluteEntryPointPath: string,
286
- relativeEntryPointPath: string
306
+ message: string,
307
+ absoluteEntryPointPath: string,
308
+ relativeEntryPointPath: string
287
309
  ): string {
288
- if (
289
- existsSync(absoluteEntryPointPath) &&
290
- statSync(absoluteEntryPointPath).isDirectory()
291
- ) {
292
- // The expected entry-point is a directory, so offer further guidance.
293
- message += `\nThe provided entry-point path, "${relativeEntryPointPath}", points to a directory, rather than a file.\n`;
310
+ if (
311
+ existsSync(absoluteEntryPointPath) &&
312
+ statSync(absoluteEntryPointPath).isDirectory()
313
+ ) {
314
+ // The expected entry-point is a directory, so offer further guidance.
315
+ message += `\nThe provided entry-point path, "${relativeEntryPointPath}", points to a directory, rather than a file.\n`;
294
316
 
295
- // Perhaps we can even guess what the correct path should be...
296
- const possiblePaths: string[] = [];
297
- for (const basenamePath of [
298
- "worker",
299
- "dist/worker",
300
- "index",
301
- "dist/index",
302
- ]) {
303
- for (const extension of [".ts", ".tsx", ".js", ".jsx"]) {
304
- const filePath = basenamePath + extension;
305
- if (fileExists(path.resolve(absoluteEntryPointPath, filePath))) {
306
- possiblePaths.push(path.join(relativeEntryPointPath, filePath));
307
- }
308
- }
309
- }
317
+ // Perhaps we can even guess what the correct path should be...
318
+ const possiblePaths: string[] = [];
319
+ for (const basenamePath of [
320
+ "worker",
321
+ "dist/worker",
322
+ "index",
323
+ "dist/index",
324
+ ]) {
325
+ for (const extension of [".ts", ".tsx", ".js", ".jsx"]) {
326
+ const filePath = basenamePath + extension;
327
+ if (fileExists(path.resolve(absoluteEntryPointPath, filePath))) {
328
+ possiblePaths.push(path.join(relativeEntryPointPath, filePath));
329
+ }
330
+ }
331
+ }
310
332
 
311
- if (possiblePaths.length > 0) {
312
- message +=
313
- `\nDid you mean to set the main field to${
314
- possiblePaths.length > 1 ? " one of" : ""
315
- }:\n` +
316
- "```\n" +
317
- possiblePaths.map((filePath) => `main = "./${filePath}"\n`).join("") +
318
- "```";
319
- }
320
- }
321
- return message;
333
+ if (possiblePaths.length > 0) {
334
+ message +=
335
+ `\nDid you mean to set the main field to${
336
+ possiblePaths.length > 1 ? " one of" : ""
337
+ }:\n` +
338
+ "```\n" +
339
+ possiblePaths.map((filePath) => `main = "./${filePath}"\n`).join("") +
340
+ "```";
341
+ }
342
+ }
343
+ return message;
322
344
  }
@@ -0,0 +1,89 @@
1
+ import { logger } from "../logger";
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
+ | "WRANGLER_API_ENVIRONMENT"
12
+ | "WRANGLER_CLIENT_ID"
13
+ | "WRANGLER_AUTH_DOMAIN"
14
+ | "WRANGLER_AUTH_URL"
15
+ | "WRANGLER_TOKEN_URL"
16
+ | "WRANGLER_REVOKE_URL"
17
+ | "WRANGLER_CF_AUTHORIZATION_TOKEN"
18
+ | "NO_CONSTELLATION_WARNING";
19
+
20
+ type DeprecatedNames =
21
+ | "CF_ACCOUNT_ID"
22
+ | "CF_API_TOKEN"
23
+ | "CF_API_KEY"
24
+ | "CF_EMAIL"
25
+ | "CF_API_BASE_URL";
26
+
27
+ /**
28
+ * Create a function used to access an environment variable.
29
+ *
30
+ * This is not memoized to allow us to change the value at runtime, such as in testing.
31
+ * A warning is shown if the client is using a deprecated version - but only once.
32
+ */
33
+ export function getEnvironmentVariableFactory({
34
+ variableName,
35
+ deprecatedName,
36
+ }: {
37
+ variableName: VariableNames;
38
+ deprecatedName?: DeprecatedNames;
39
+ }): () => string | undefined;
40
+
41
+ /**
42
+ * Create a function used to access an environment variable, with a default value.
43
+ *
44
+ * This is not memoized to allow us to change the value at runtime, such as in testing.
45
+ * A warning is shown if the client is using a deprecated version - but only once.
46
+ */
47
+ export function getEnvironmentVariableFactory({
48
+ variableName,
49
+ deprecatedName,
50
+ defaultValue,
51
+ }: {
52
+ variableName: VariableNames;
53
+ deprecatedName?: DeprecatedNames;
54
+ defaultValue: () => string;
55
+ }): () => string;
56
+
57
+ /**
58
+ * Create a function used to access an environment variable.
59
+ *
60
+ * This is not memoized to allow us to change the value at runtime, such as in testing.
61
+ * A warning is shown if the client is using a deprecated version - but only once.
62
+ */
63
+ export function getEnvironmentVariableFactory({
64
+ variableName,
65
+ deprecatedName,
66
+ defaultValue,
67
+ }: {
68
+ variableName: VariableNames;
69
+ deprecatedName?: DeprecatedNames;
70
+ defaultValue?: () => string;
71
+ }): () => string | undefined {
72
+ let hasWarned = false;
73
+ return () => {
74
+ if (process.env[variableName]) {
75
+ return process.env[variableName];
76
+ } else if (deprecatedName && process.env[deprecatedName]) {
77
+ if (!hasWarned) {
78
+ // Only show the warning once.
79
+ hasWarned = true;
80
+ logger.warn(
81
+ `Using "${deprecatedName}" environment variable. This is deprecated. Please use "${variableName}", instead.`
82
+ );
83
+ }
84
+ return process.env[deprecatedName];
85
+ } else {
86
+ return defaultValue?.();
87
+ }
88
+ };
89
+ }