wrangler 0.0.0-e452a04 → 0.0.0-e464fcdb

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 (379) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +47 -14
  3. package/bin/wrangler.js +181 -29
  4. package/kv-asset-handler.js +1 -0
  5. package/miniflare-dist/index.mjs +6442 -0
  6. package/package.json +198 -140
  7. package/src/__tests__/access.test.ts +25 -0
  8. package/src/__tests__/api-dev.test.ts +238 -0
  9. package/src/__tests__/api-devregistry.test.ts +121 -0
  10. package/src/__tests__/api.test.ts +102 -0
  11. package/src/__tests__/config-cache-without-cache-dir.test.ts +38 -0
  12. package/src/__tests__/config-cache.test.ts +42 -0
  13. package/src/__tests__/configuration.test.ts +4501 -2209
  14. package/src/__tests__/constellation.test.ts +371 -0
  15. package/src/__tests__/d1/d1.test.ts +82 -0
  16. package/src/__tests__/d1/execute.test.ts +66 -0
  17. package/src/__tests__/d1/migrate.test.ts +257 -0
  18. package/src/__tests__/d1/splitter.test.ts +255 -0
  19. package/src/__tests__/delete.test.ts +272 -0
  20. package/src/__tests__/deployments.test.ts +369 -0
  21. package/src/__tests__/dev.test.tsx +1604 -392
  22. package/src/__tests__/generate.test.ts +237 -0
  23. package/src/__tests__/get-host-from-url.test.ts +16 -0
  24. package/src/__tests__/guess-worker-format.test.ts +113 -51
  25. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  26. package/src/__tests__/helpers/end-event-loop.ts +6 -0
  27. package/src/__tests__/helpers/mock-account-id.ts +26 -22
  28. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  29. package/src/__tests__/helpers/mock-bin.ts +20 -20
  30. package/src/__tests__/helpers/mock-console.ts +74 -32
  31. package/src/__tests__/helpers/mock-dialogs.ts +107 -33
  32. package/src/__tests__/helpers/mock-get-pages-upload-token.ts +25 -0
  33. package/src/__tests__/helpers/mock-get-zone-from-host.ts +11 -0
  34. package/src/__tests__/helpers/mock-http-server.ts +46 -0
  35. package/src/__tests__/helpers/mock-istty.ts +74 -0
  36. package/src/__tests__/helpers/mock-known-routes.ts +12 -0
  37. package/src/__tests__/helpers/mock-kv.ts +42 -36
  38. package/src/__tests__/helpers/mock-oauth-flow.ts +263 -0
  39. package/src/__tests__/helpers/mock-process.ts +34 -0
  40. package/src/__tests__/helpers/mock-set-timeout.ts +16 -0
  41. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  42. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  43. package/src/__tests__/helpers/msw/blob-worker.cjs +19 -0
  44. package/src/__tests__/helpers/msw/handlers/access.ts +13 -0
  45. package/src/__tests__/helpers/msw/handlers/deployments.ts +160 -0
  46. package/src/__tests__/helpers/msw/handlers/namespaces.ts +81 -0
  47. package/src/__tests__/helpers/msw/handlers/oauth.ts +31 -0
  48. package/src/__tests__/helpers/msw/handlers/r2.ts +60 -0
  49. package/src/__tests__/helpers/msw/handlers/script.ts +56 -0
  50. package/src/__tests__/helpers/msw/handlers/user.ts +52 -0
  51. package/src/__tests__/helpers/msw/handlers/zones.ts +20 -0
  52. package/src/__tests__/helpers/msw/index.ts +52 -0
  53. package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
  54. package/src/__tests__/helpers/run-in-tmp.ts +29 -20
  55. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  56. package/src/__tests__/helpers/string-dynamic-values-matcher.ts +28 -0
  57. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
  58. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
  59. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
  60. package/src/__tests__/helpers/worker-scripts/parent-worker.js +11 -0
  61. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  62. package/src/__tests__/helpers/write-worker-source.ts +31 -0
  63. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  64. package/src/__tests__/https-options.test.ts +144 -108
  65. package/src/__tests__/index.test.ts +266 -975
  66. package/src/__tests__/init.test.ts +3196 -0
  67. package/src/__tests__/jest.setup.ts +158 -48
  68. package/src/__tests__/kv.test.ts +1789 -1398
  69. package/src/__tests__/logger.test.ts +207 -0
  70. package/src/__tests__/logout.test.ts +41 -44
  71. package/src/__tests__/metrics.test.ts +493 -0
  72. package/src/__tests__/middleware.scheduled.test.ts +145 -0
  73. package/src/__tests__/middleware.test.ts +816 -0
  74. package/src/__tests__/mtls-certificates.test.ts +589 -0
  75. package/src/__tests__/package-manager.test.ts +312 -165
  76. package/src/__tests__/pages/deployment-list.test.ts +80 -0
  77. package/src/__tests__/pages/functions-build.test.ts +452 -0
  78. package/src/__tests__/pages/pages.test.ts +81 -0
  79. package/src/__tests__/pages/project-create.test.ts +63 -0
  80. package/src/__tests__/pages/project-list.test.ts +110 -0
  81. package/src/__tests__/pages/project-upload.test.ts +500 -0
  82. package/src/__tests__/pages/publish.test.ts +2864 -0
  83. package/src/__tests__/pages-deployment-tail.test.ts +955 -0
  84. package/src/__tests__/parse.test.ts +359 -245
  85. package/src/__tests__/paths.test.ts +39 -0
  86. package/src/__tests__/publish.test.ts +8796 -2199
  87. package/src/__tests__/pubsub.test.ts +496 -0
  88. package/src/__tests__/queues.test.ts +532 -0
  89. package/src/__tests__/r2.test.ts +369 -193
  90. package/src/__tests__/route.test.ts +22 -22
  91. package/src/__tests__/secret.test.ts +683 -415
  92. package/src/__tests__/tail.test.ts +838 -444
  93. package/src/__tests__/test-old-node-version.js +31 -0
  94. package/src/__tests__/traverse-module-graph.test.ts +220 -0
  95. package/src/__tests__/tsconfig-sanity.ts +12 -0
  96. package/src/__tests__/tsconfig.json +8 -0
  97. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  98. package/src/__tests__/type-generation.test.ts +234 -0
  99. package/src/__tests__/user.test.ts +118 -0
  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 +167 -81
  104. package/src/__tests__/worker-namespace.test.ts +340 -0
  105. package/src/abort.d.ts +3 -0
  106. package/src/api/dev.ts +316 -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 +76 -0
  110. package/src/api/pages/index.ts +5 -0
  111. package/src/api/pages/publish.tsx +355 -0
  112. package/src/bundle-reporter.ts +68 -0
  113. package/src/bundle.ts +876 -110
  114. package/src/cfetch/index.ts +123 -69
  115. package/src/cfetch/internal.ts +217 -94
  116. package/src/cli.ts +23 -14
  117. package/src/config/README.md +7 -7
  118. package/src/config/config.ts +232 -229
  119. package/src/config/diagnostics.ts +61 -61
  120. package/src/config/environment.ts +569 -256
  121. package/src/config/index.ts +385 -34
  122. package/src/config/validation-helpers.ts +448 -239
  123. package/src/config/validation.ts +2227 -912
  124. package/src/config-cache.ts +85 -0
  125. package/src/constellation/createProject.tsx +51 -0
  126. package/src/constellation/deleteProject.ts +51 -0
  127. package/src/constellation/deleteProjectModel.ts +68 -0
  128. package/src/constellation/index.ts +75 -0
  129. package/src/constellation/listCatalog.tsx +35 -0
  130. package/src/constellation/listModel.tsx +41 -0
  131. package/src/constellation/listProject.tsx +28 -0
  132. package/src/constellation/listRuntime.tsx +28 -0
  133. package/src/constellation/options.ts +17 -0
  134. package/src/constellation/types.ts +17 -0
  135. package/src/constellation/uploadModel.tsx +64 -0
  136. package/src/constellation/utils.ts +90 -0
  137. package/src/create-worker-preview.ts +251 -124
  138. package/src/create-worker-upload-form.ts +343 -201
  139. package/src/d1/backups.tsx +219 -0
  140. package/src/d1/constants.ts +6 -0
  141. package/src/d1/create.tsx +103 -0
  142. package/src/d1/delete.ts +53 -0
  143. package/src/d1/execute.tsx +371 -0
  144. package/src/d1/formatTimeAgo.ts +14 -0
  145. package/src/d1/index.ts +100 -0
  146. package/src/d1/list.tsx +62 -0
  147. package/src/d1/migrations/apply.tsx +235 -0
  148. package/src/d1/migrations/create.tsx +79 -0
  149. package/src/d1/migrations/helpers.ts +171 -0
  150. package/src/d1/migrations/index.ts +3 -0
  151. package/src/d1/migrations/list.tsx +95 -0
  152. package/src/d1/migrations/options.ts +23 -0
  153. package/src/d1/options.ts +22 -0
  154. package/src/d1/splitter.ts +161 -0
  155. package/src/d1/types.ts +32 -0
  156. package/src/d1/utils.ts +49 -0
  157. package/src/delete.ts +100 -0
  158. package/src/deployments.ts +368 -0
  159. package/src/deprecated/index.ts +144 -0
  160. package/src/dev/dev-vars.ts +39 -0
  161. package/src/dev/dev.tsx +544 -301
  162. package/src/dev/get-local-persistence-path.ts +31 -0
  163. package/src/dev/local.tsx +934 -227
  164. package/src/dev/remote.tsx +621 -190
  165. package/src/dev/start-server.ts +534 -0
  166. package/src/dev/use-esbuild.ts +183 -80
  167. package/src/dev/validate-dev-props.ts +40 -0
  168. package/src/dev-registry.ts +202 -0
  169. package/src/dev.tsx +929 -0
  170. package/src/dialogs.ts +136 -0
  171. package/src/dispatch-namespace.ts +211 -0
  172. package/src/docs/helpers.ts +50 -0
  173. package/src/docs/index.ts +54 -0
  174. package/src/durable.ts +102 -0
  175. package/src/entry.ts +288 -110
  176. package/src/environment-variables/factory.ts +89 -0
  177. package/src/environment-variables/misc-variables.ts +30 -0
  178. package/src/errors.ts +11 -0
  179. package/src/generate/index.ts +298 -0
  180. package/src/git-client.ts +135 -0
  181. package/src/global-wrangler-config-path.ts +26 -0
  182. package/src/https-options.ts +85 -80
  183. package/src/index.ts +768 -0
  184. package/src/init.ts +1032 -0
  185. package/src/inspect.ts +722 -557
  186. package/src/intl-polyfill.d.ts +139 -0
  187. package/src/is-ci.ts +14 -0
  188. package/src/is-interactive.ts +16 -0
  189. package/src/jest.d.ts +4 -0
  190. package/src/kv/helpers.ts +433 -0
  191. package/src/kv/index.ts +594 -0
  192. package/src/logger.ts +123 -0
  193. package/src/metrics/index.ts +5 -0
  194. package/src/metrics/metrics-config.ts +239 -0
  195. package/src/metrics/metrics-dispatcher.ts +96 -0
  196. package/src/metrics/metrics-usage-headers.ts +24 -0
  197. package/src/metrics/send-event.ts +99 -0
  198. package/src/miniflare-cli/README.md +30 -0
  199. package/src/miniflare-cli/assets.ts +251 -0
  200. package/src/miniflare-cli/index.ts +210 -0
  201. package/src/miniflare-cli/request-context.ts +40 -0
  202. package/src/miniflare-cli/tsconfig.json +9 -0
  203. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  204. package/src/miniflare-cli/types.ts +11 -0
  205. package/src/module-collection.ts +307 -227
  206. package/src/mtls-certificate/cli.ts +155 -0
  207. package/src/open-in-browser.ts +8 -16
  208. package/src/package-manager.ts +183 -90
  209. package/src/pages/build.ts +410 -0
  210. package/src/pages/buildFunctions.ts +140 -0
  211. package/src/pages/constants.ts +18 -0
  212. package/src/pages/deployment-tails.ts +281 -0
  213. package/src/pages/deployments.tsx +84 -0
  214. package/src/pages/dev.ts +716 -0
  215. package/src/pages/errors.ts +67 -0
  216. package/src/pages/functions/buildPlugin.ts +113 -0
  217. package/src/pages/functions/buildWorker.ts +291 -0
  218. package/src/pages/functions/filepath-routing.test.ts +234 -0
  219. package/src/pages/functions/filepath-routing.ts +189 -0
  220. package/src/pages/functions/identifiers.ts +78 -0
  221. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  222. package/src/pages/functions/routes-consolidation.ts +73 -0
  223. package/src/pages/functions/routes-transformation.test.ts +282 -0
  224. package/src/pages/functions/routes-transformation.ts +115 -0
  225. package/src/pages/functions/routes-validation.test.ts +403 -0
  226. package/src/pages/functions/routes-validation.ts +202 -0
  227. package/src/pages/functions/routes.ts +151 -0
  228. package/src/pages/functions/tsconfig.json +8 -0
  229. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  230. package/src/pages/functions.ts +86 -0
  231. package/src/pages/hash.ts +13 -0
  232. package/src/pages/index.ts +102 -0
  233. package/src/pages/projects.tsx +159 -0
  234. package/src/pages/prompt-select-project.tsx +31 -0
  235. package/src/pages/publish.tsx +267 -0
  236. package/src/pages/types.ts +46 -0
  237. package/src/pages/upload.tsx +469 -0
  238. package/src/pages/utils.ts +23 -0
  239. package/src/parse.ts +247 -122
  240. package/src/paths.ts +53 -8
  241. package/src/proxy.ts +629 -373
  242. package/src/publish/index.ts +274 -0
  243. package/src/publish/publish.ts +1060 -0
  244. package/src/pubsub/index.ts +286 -0
  245. package/src/pubsub/pubsub-commands.ts +623 -0
  246. package/src/queues/cli/commands/consumer/add.ts +71 -0
  247. package/src/queues/cli/commands/consumer/index.ts +19 -0
  248. package/src/queues/cli/commands/consumer/remove.ts +31 -0
  249. package/src/queues/cli/commands/create.ts +25 -0
  250. package/src/queues/cli/commands/delete.ts +26 -0
  251. package/src/queues/cli/commands/index.ts +35 -0
  252. package/src/queues/cli/commands/list.ts +25 -0
  253. package/src/queues/client.ts +136 -0
  254. package/src/queues/utils.ts +18 -0
  255. package/src/r2/constants.ts +4 -0
  256. package/src/r2/helpers.ts +132 -0
  257. package/src/r2/index.ts +289 -0
  258. package/src/routes.ts +140 -0
  259. package/src/secret/index.ts +376 -0
  260. package/src/selfsigned.d.ts +23 -23
  261. package/src/sites.ts +484 -0
  262. package/src/tail/createTail.ts +406 -0
  263. package/src/tail/filters.ts +109 -111
  264. package/src/tail/index.ts +208 -296
  265. package/src/tail/printing.ts +107 -47
  266. package/src/traverse-module-graph.ts +53 -0
  267. package/src/tsconfig-sanity.ts +16 -0
  268. package/src/type-generation.ts +181 -0
  269. package/src/update-check.ts +19 -0
  270. package/src/user/access.ts +68 -0
  271. package/src/user/auth-variables.ts +113 -0
  272. package/src/user/choose-account.tsx +39 -0
  273. package/src/user/generate-auth-url.ts +33 -0
  274. package/src/user/generate-random-state.ts +16 -0
  275. package/src/user/index.ts +2 -0
  276. package/src/user/user.ts +1234 -0
  277. package/src/utils/collectKeyValues.ts +14 -0
  278. package/src/utils/render.ts +93 -0
  279. package/src/whoami.ts +135 -0
  280. package/src/worker.ts +211 -100
  281. package/src/yargs-types.ts +37 -0
  282. package/src/zones.ts +191 -0
  283. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  284. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  285. package/templates/__tests__/tsconfig.json +8 -0
  286. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  287. package/templates/checked-fetch.js +23 -0
  288. package/templates/d1-beta-facade.js +244 -0
  289. package/templates/facade.d.ts +14 -0
  290. package/templates/first-party-worker-module-facade.ts +19 -0
  291. package/templates/format-dev-errors.ts +34 -0
  292. package/templates/gitignore +172 -0
  293. package/templates/init-tests/test-jest-new-worker.js +23 -0
  294. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  295. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  296. package/templates/middleware/common.ts +62 -0
  297. package/templates/middleware/loader-modules.ts +84 -0
  298. package/templates/middleware/loader-sw.ts +233 -0
  299. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  300. package/templates/middleware/middleware-pretty-error.ts +40 -0
  301. package/templates/middleware/middleware-scheduled.ts +15 -0
  302. package/templates/new-worker-scheduled.js +17 -0
  303. package/templates/new-worker-scheduled.ts +32 -0
  304. package/templates/new-worker.js +3 -3
  305. package/templates/new-worker.ts +21 -3
  306. package/templates/no-op-worker.js +10 -0
  307. package/templates/pages-dev-pipeline.ts +31 -0
  308. package/templates/pages-dev-util.ts +52 -0
  309. package/templates/pages-shim.ts +12 -0
  310. package/templates/pages-template-plugin.ts +180 -0
  311. package/templates/pages-template-worker.ts +189 -0
  312. package/templates/serve-static-assets.ts +66 -0
  313. package/templates/service-bindings-module-facade.js +55 -0
  314. package/templates/service-bindings-sw-facade.js +42 -0
  315. package/templates/tsconfig-sanity.ts +11 -0
  316. package/templates/tsconfig.init.json +105 -0
  317. package/templates/tsconfig.json +6 -103
  318. package/templates/tsconfig.tsbuildinfo +1 -0
  319. package/wrangler-dist/cli.d.ts +1641 -0
  320. package/wrangler-dist/cli.js +146057 -132724
  321. package/wrangler-dist/wasm-sync.wasm +0 -0
  322. package/pages/functions/buildWorker.ts +0 -62
  323. package/pages/functions/filepath-routing.test.ts +0 -123
  324. package/pages/functions/filepath-routing.ts +0 -178
  325. package/pages/functions/identifiers.ts +0 -78
  326. package/pages/functions/routes.ts +0 -151
  327. package/pages/functions/template-worker.ts +0 -130
  328. package/src/__tests__/dev2.test.tsx +0 -152
  329. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  330. package/src/__tests__/helpers/mock-cfetch.ts +0 -207
  331. package/src/__tests__/helpers/mock-user.ts +0 -27
  332. package/src/__tests__/pages.test.ts +0 -44
  333. package/src/__tests__/sentry.test.ts +0 -146
  334. package/src/dialogs.tsx +0 -77
  335. package/src/environment-variables.ts +0 -33
  336. package/src/index.tsx +0 -2329
  337. package/src/kv/index.tsx +0 -339
  338. package/src/pages.tsx +0 -1045
  339. package/src/publish.ts +0 -352
  340. package/src/r2.ts +0 -50
  341. package/src/reporting.ts +0 -131
  342. package/src/sites.tsx +0 -238
  343. package/src/user.tsx +0 -1065
  344. package/src/whoami.tsx +0 -69
  345. package/templates/static-asset-facade.js +0 -47
  346. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  347. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  348. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  349. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  350. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  351. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  352. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  353. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  354. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  355. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  356. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  357. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  358. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  359. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  360. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  361. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  362. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  363. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  364. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  365. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  366. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  367. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  368. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  369. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  370. package/vendor/wrangler-mime/LICENSE +0 -21
  371. package/vendor/wrangler-mime/Mime.js +0 -97
  372. package/vendor/wrangler-mime/README.md +0 -187
  373. package/vendor/wrangler-mime/cli.js +0 -46
  374. package/vendor/wrangler-mime/index.js +0 -4
  375. package/vendor/wrangler-mime/lite.js +0 -4
  376. package/vendor/wrangler-mime/package.json +0 -52
  377. package/vendor/wrangler-mime/types/other.js +0 -1
  378. package/vendor/wrangler-mime/types/standard.js +0 -1
  379. package/wrangler-dist/cli.js.map +0 -7
@@ -1,19 +1,30 @@
1
1
  import crypto from "node:crypto";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import path from "node:path";
4
+ import chalk from "chalk";
4
5
  import globToRegExp from "glob-to-regexp";
6
+ import { logger } from "./logger";
5
7
  import type { Config, ConfigModuleRuleType } from "./config";
6
8
  import type { CfModule, CfModuleType, CfScriptFormat } from "./worker";
7
9
  import type esbuild from "esbuild";
8
10
 
11
+ function flipObject<
12
+ K extends string | number | symbol,
13
+ V extends string | number | symbol
14
+ >(obj: Record<K, V>): Record<V, K> {
15
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [v, k]));
16
+ }
17
+
9
18
  const RuleTypeToModuleType: Record<ConfigModuleRuleType, CfModuleType> = {
10
- ESModule: "esm",
11
- CommonJS: "commonjs",
12
- CompiledWasm: "compiled-wasm",
13
- Data: "buffer",
14
- Text: "text",
19
+ ESModule: "esm",
20
+ CommonJS: "commonjs",
21
+ CompiledWasm: "compiled-wasm",
22
+ Data: "buffer",
23
+ Text: "text",
15
24
  };
16
25
 
26
+ export const ModuleTypeToRuleType = flipObject(RuleTypeToModuleType);
27
+
17
28
  // This is a combination of an esbuild plugin and a mutable array
18
29
  // that we use to collect module references from source code.
19
30
  // There will be modules that _shouldn't_ be inlined directly into
@@ -23,231 +34,300 @@ const RuleTypeToModuleType: Record<ConfigModuleRuleType, CfModuleType> = {
23
34
  // them correctly in the bundle, and add them to the form upload.
24
35
 
25
36
  export const DEFAULT_MODULE_RULES: Config["rules"] = [
26
- { type: "Text", globs: ["**/*.txt", "**/*.html"] },
27
- { type: "Data", globs: ["**/*.bin"] },
28
- { type: "CompiledWasm", globs: ["**/*.wasm"] },
37
+ { type: "Text", globs: ["**/*.txt", "**/*.html"] },
38
+ { type: "Data", globs: ["**/*.bin"] },
39
+ { type: "CompiledWasm", globs: ["**/*.wasm", "**/*.wasm?module"] },
29
40
  ];
30
41
 
42
+ export function parseRules(userRules: Config["rules"] = []) {
43
+ const rules: Config["rules"] = [...userRules, ...DEFAULT_MODULE_RULES];
44
+
45
+ const completedRuleLocations: Record<string, number> = {};
46
+ let index = 0;
47
+ const rulesToRemove: Config["rules"] = [];
48
+ for (const rule of rules) {
49
+ if (rule.type in completedRuleLocations) {
50
+ if (rules[completedRuleLocations[rule.type]].fallthrough !== false) {
51
+ if (index < userRules.length) {
52
+ logger.warn(
53
+ `The module rule at position ${index} (${JSON.stringify(
54
+ rule
55
+ )}) has the same type as a previous rule (at position ${
56
+ completedRuleLocations[rule.type]
57
+ }, ${JSON.stringify(
58
+ rules[completedRuleLocations[rule.type]]
59
+ )}). 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.`
60
+ );
61
+ } else {
62
+ logger.warn(
63
+ `The default module rule ${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 the default one to also be used, or \`fallthrough = false\` to silence this warning.`
70
+ );
71
+ }
72
+ }
73
+
74
+ rulesToRemove.push(rule);
75
+ }
76
+ if (!(rule.type in completedRuleLocations) && rule.fallthrough !== true) {
77
+ completedRuleLocations[rule.type] = index;
78
+ }
79
+ index++;
80
+ }
81
+
82
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
83
+ rulesToRemove.forEach((rule) => rules!.splice(rules!.indexOf(rule), 1));
84
+
85
+ return { rules, removedRules: rulesToRemove };
86
+ }
87
+
88
+ export async function matchFiles(
89
+ files: string[],
90
+ relativeTo: string,
91
+ {
92
+ rules,
93
+ removedRules,
94
+ }: { rules: Config["rules"]; removedRules: Config["rules"] }
95
+ ) {
96
+ const modules: CfModule[] = [];
97
+
98
+ // Deduplicate modules. This is usually a poorly specified `wrangler.toml` configuration, but duplicate modules will cause a crash at runtime
99
+ const moduleNames = new Set<string>();
100
+ for (const rule of rules) {
101
+ for (const glob of rule.globs) {
102
+ const regexp = globToRegExp(glob, {
103
+ globstar: true,
104
+ });
105
+ const newModules = await Promise.all(
106
+ files
107
+ .filter((f) => regexp.test(f))
108
+ .map(async (name) => {
109
+ const filePath = name;
110
+ const fileContent = await readFile(path.join(relativeTo, filePath));
111
+
112
+ return {
113
+ name: filePath,
114
+ content: fileContent,
115
+ type: RuleTypeToModuleType[rule.type],
116
+ };
117
+ })
118
+ );
119
+ for (const module of newModules) {
120
+ if (!moduleNames.has(module.name)) {
121
+ moduleNames.add(module.name);
122
+ modules.push(module);
123
+ } else {
124
+ logger.warn(
125
+ `Ignoring duplicate module: ${chalk.blue(
126
+ module.name
127
+ )} (${chalk.green(module.type ?? "")})`
128
+ );
129
+ }
130
+ }
131
+ }
132
+ }
133
+
134
+ // This is just a sanity check verifying that no files match rules that were removed
135
+ for (const rule of removedRules) {
136
+ for (const glob of rule.globs) {
137
+ const regexp = globToRegExp(glob);
138
+ for (const file of files) {
139
+ if (regexp.test(file)) {
140
+ throw new Error(
141
+ `The file ${file} matched a module rule in your configuration (${JSON.stringify(
142
+ rule
143
+ )}), but was ignored because a previous rule with the same type was not marked as \`fallthrough = true\`.`
144
+ );
145
+ }
146
+ }
147
+ }
148
+ }
149
+ return modules;
150
+ }
151
+
31
152
  export default function createModuleCollector(props: {
32
- format: CfScriptFormat;
33
- rules?: Config["rules"];
34
- // a collection of "legacy" style module references, which are just file names
35
- // we will eventually deprecate this functionality, hence the verbose greppable name
36
- wrangler1xlegacyModuleReferences: {
37
- rootDirectory: string;
38
- fileNames: Set<string>;
39
- };
153
+ format: CfScriptFormat;
154
+ rules?: Config["rules"];
155
+ // a collection of "legacy" style module references, which are just file names
156
+ // we will eventually deprecate this functionality, hence the verbose greppable name
157
+ wrangler1xlegacyModuleReferences: {
158
+ rootDirectory: string;
159
+ fileNames: Set<string>;
160
+ };
161
+ preserveFileNames?: boolean;
40
162
  }): {
41
- modules: CfModule[];
42
- plugin: esbuild.Plugin;
163
+ modules: CfModule[];
164
+ plugin: esbuild.Plugin;
43
165
  } {
44
- const rules: Config["rules"] = [
45
- ...(props.rules || []),
46
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
47
- ...DEFAULT_MODULE_RULES!,
48
- ];
49
-
50
- // First, we want to add some validations to the module rules
51
- // We want to warn if rules are accidentally configured in such a way that
52
- // subsequent rules will never match because `fallthrough` hasn't been set
53
-
54
- const completedRuleLocations: Record<string, number> = {};
55
- let index = 0;
56
- const rulesToRemove: Config["rules"] = [];
57
- for (const rule of rules) {
58
- if (rule.type in completedRuleLocations) {
59
- if (rules[completedRuleLocations[rule.type]].fallthrough !== false) {
60
- if (index < (props.rules || []).length) {
61
- console.warn(
62
- `The module rule at position ${index} (${JSON.stringify(
63
- rule
64
- )}) has the same type as a previous rule (at position ${
65
- completedRuleLocations[rule.type]
66
- }, ${JSON.stringify(
67
- rules[completedRuleLocations[rule.type]]
68
- )}). 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.`
69
- );
70
- } else {
71
- console.warn(
72
- `The default module rule ${JSON.stringify(
73
- rule
74
- )} has the same type as a previous rule (at position ${
75
- completedRuleLocations[rule.type]
76
- }, ${JSON.stringify(
77
- rules[completedRuleLocations[rule.type]]
78
- )}). 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.`
79
- );
80
- }
81
- }
82
-
83
- rulesToRemove.push(rule);
84
- }
85
- if (!(rule.type in completedRuleLocations) && rule.fallthrough !== true) {
86
- completedRuleLocations[rule.type] = index;
87
- }
88
- index++;
89
- }
90
-
91
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
92
- rulesToRemove.forEach((rule) => rules!.splice(rules!.indexOf(rule), 1));
93
-
94
- const modules: CfModule[] = [];
95
- return {
96
- modules,
97
- plugin: {
98
- name: "wrangler-module-collector",
99
- setup(build) {
100
- build.onStart(() => {
101
- // reset the module collection array
102
- modules.splice(0);
103
- });
104
-
105
- // ~ start legacy module specifier support ~
106
-
107
- // This section detects usage of "legacy" 1.x style module specifiers
108
- // and modifies them so they "work" in wrangler v2, but with a warning
109
-
110
- const rulesMatchers = rules.flatMap((rule) => {
111
- return rule.globs.map((glob) => {
112
- const regex = globToRegExp(glob);
113
- return {
114
- regex,
115
- rule,
116
- };
117
- });
118
- });
119
-
120
- build.onResolve(
121
- {
122
- filter: new RegExp(
123
- [...props.wrangler1xlegacyModuleReferences.fileNames]
124
- .map((fileName) => `^${fileName}$`)
125
- .join("|")
126
- ),
127
- },
128
- async (args: esbuild.OnResolveArgs) => {
129
- if (
130
- args.kind !== "import-statement" &&
131
- args.kind !== "require-call"
132
- ) {
133
- return;
134
- }
135
- // In the future, this will simply throw an error
136
- console.warn(
137
- `Deprecation warning: detected a legacy module import in "./${path.relative(
138
- process.cwd(),
139
- args.importer
140
- )}". This will stop working in the future. Replace references to "${
141
- args.path
142
- }" with "./${args.path}";`
143
- );
144
-
145
- // take the file and massage it to a
146
- // transportable/manageable format
147
- const filePath = path.join(
148
- props.wrangler1xlegacyModuleReferences.rootDirectory,
149
- args.path
150
- );
151
- const fileContent = await readFile(filePath);
152
- const fileHash = crypto
153
- .createHash("sha1")
154
- .update(fileContent)
155
- .digest("hex");
156
- const fileName = `./${fileHash}-${path.basename(args.path)}`;
157
-
158
- const { rule } =
159
- rulesMatchers.find(({ regex }) => regex.test(fileName)) || {};
160
- if (rule) {
161
- // add the module to the array
162
- modules.push({
163
- name: fileName,
164
- content: fileContent,
165
- type: RuleTypeToModuleType[rule.type],
166
- });
167
- return {
168
- path: fileName, // change the reference to the changed module
169
- external: props.format === "modules", // mark it as external in the bundle
170
- namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
171
- watchFiles: [filePath], // we also add the file to esbuild's watch list
172
- };
173
- }
174
- }
175
- );
176
- // ~ end legacy module specifier support ~
177
-
178
- rules?.forEach((rule) => {
179
- if (rule.type === "ESModule" || rule.type === "CommonJS") return; // TODO: we should treat these as js files, and use the jsx loader
180
-
181
- rule.globs.forEach((glob) => {
182
- build.onResolve(
183
- { filter: globToRegExp(glob) },
184
- async (args: esbuild.OnResolveArgs) => {
185
- // take the file and massage it to a
186
- // transportable/manageable format
187
-
188
- const filePath = path.join(args.resolveDir, args.path);
189
- const fileContent = await readFile(filePath);
190
- const fileHash = crypto
191
- .createHash("sha1")
192
- .update(fileContent)
193
- .digest("hex");
194
- const fileName = `./${fileHash}-${path.basename(args.path)}`;
195
-
196
- // add the module to the array
197
- modules.push({
198
- name: fileName,
199
- content: fileContent,
200
- type: RuleTypeToModuleType[rule.type],
201
- });
202
-
203
- return {
204
- path: fileName, // change the reference to the changed module
205
- external: props.format === "modules", // mark it as external in the bundle
206
- namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
207
- watchFiles: [filePath], // we also add the file to esbuild's watch list
208
- };
209
- }
210
- );
211
-
212
- if (props.format === "service-worker") {
213
- build.onLoad(
214
- { filter: globToRegExp(glob) },
215
- async (args: esbuild.OnLoadArgs) => {
216
- return {
217
- // We replace the the module with an identifier
218
- // that we'll separately add to the form upload
219
- // as part of [wasm_modules]/[text_blobs]. This identifier has to be a valid
220
- // JS identifier, so we replace all non alphanumeric characters
221
- // with an underscore.
222
- // TODO: what of "Data"?
223
- contents: `export default ${args.path.replace(
224
- /[^a-zA-Z0-9_$]/g,
225
- "_"
226
- )};`,
227
- };
228
- }
229
- );
230
- }
231
- });
232
- });
233
-
234
- rulesToRemove.forEach((rule) => {
235
- rule.globs.forEach((glob) => {
236
- build.onResolve(
237
- { filter: globToRegExp(glob) },
238
- async (args: esbuild.OnResolveArgs) => {
239
- throw new Error(
240
- `The file ${
241
- args.path
242
- } matched a module rule in your configuration (${JSON.stringify(
243
- rule
244
- )}), but was ignored because a previous rule with the same type was not marked as \`fallthrough = true\`.`
245
- );
246
- }
247
- );
248
- });
249
- });
250
- },
251
- },
252
- };
166
+ const { rules, removedRules } = parseRules(props.rules);
167
+
168
+ const modules: CfModule[] = [];
169
+ return {
170
+ modules,
171
+ plugin: {
172
+ name: "wrangler-module-collector",
173
+ setup(build) {
174
+ build.onStart(() => {
175
+ // reset the module collection array
176
+ modules.splice(0);
177
+ });
178
+
179
+ // ~ start legacy module specifier support ~
180
+
181
+ // This section detects usage of "legacy" 1.x style module specifiers
182
+ // and modifies them so they "work" in wrangler v2, but with a warning
183
+
184
+ const rulesMatchers = rules.flatMap((rule) => {
185
+ return rule.globs.map((glob) => {
186
+ const regex = globToRegExp(glob);
187
+ return {
188
+ regex,
189
+ rule,
190
+ };
191
+ });
192
+ });
193
+
194
+ if (props.wrangler1xlegacyModuleReferences.fileNames.size > 0) {
195
+ build.onResolve(
196
+ {
197
+ filter: new RegExp(
198
+ "^(" +
199
+ [...props.wrangler1xlegacyModuleReferences.fileNames]
200
+ .map((name) => name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
201
+ .join("|") +
202
+ ")$"
203
+ ),
204
+ },
205
+ async (args: esbuild.OnResolveArgs) => {
206
+ if (
207
+ args.kind !== "import-statement" &&
208
+ args.kind !== "require-call"
209
+ ) {
210
+ return;
211
+ }
212
+ // In the future, this will simply throw an error
213
+ logger.warn(
214
+ `Deprecation: detected a legacy module import in "./${path.relative(
215
+ process.cwd(),
216
+ args.importer
217
+ )}". This will stop working in the future. Replace references to "${
218
+ args.path
219
+ }" with "./${args.path}";`
220
+ );
221
+
222
+ // take the file and massage it to a
223
+ // transportable/manageable format
224
+ const filePath = path.join(
225
+ props.wrangler1xlegacyModuleReferences.rootDirectory,
226
+ args.path
227
+ );
228
+ const fileContent = await readFile(filePath);
229
+ const fileHash = crypto
230
+ .createHash("sha1")
231
+ .update(fileContent)
232
+ .digest("hex");
233
+ const fileName = `./${fileHash}-${path.basename(args.path)}`;
234
+
235
+ const { rule } =
236
+ rulesMatchers.find(({ regex }) => regex.test(fileName)) || {};
237
+ if (rule) {
238
+ // add the module to the array
239
+ modules.push({
240
+ name: fileName,
241
+ content: fileContent,
242
+ type: RuleTypeToModuleType[rule.type],
243
+ });
244
+ return {
245
+ path: fileName, // change the reference to the changed module
246
+ external: props.format === "modules", // mark it as external in the bundle
247
+ namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
248
+ watchFiles: [filePath], // we also add the file to esbuild's watch list
249
+ };
250
+ }
251
+ }
252
+ );
253
+ }
254
+
255
+ // ~ end legacy module specifier support ~
256
+
257
+ rules?.forEach((rule) => {
258
+ if (rule.type === "ESModule" || rule.type === "CommonJS") return; // TODO: we should treat these as js files, and use the jsx loader
259
+
260
+ rule.globs.forEach((glob) => {
261
+ build.onResolve(
262
+ { filter: globToRegExp(glob) },
263
+ async (args: esbuild.OnResolveArgs) => {
264
+ // take the file and massage it to a
265
+ // transportable/manageable format
266
+
267
+ const filePath = path.join(args.resolveDir, args.path);
268
+ const fileContent = await readFile(filePath);
269
+ const fileHash = crypto
270
+ .createHash("sha1")
271
+ .update(fileContent)
272
+ .digest("hex");
273
+ const fileName = props.preserveFileNames
274
+ ? filePath
275
+ : `./${fileHash}-${path.basename(args.path)}`;
276
+
277
+ // add the module to the array
278
+ modules.push({
279
+ name: fileName,
280
+ content: fileContent,
281
+ type: RuleTypeToModuleType[rule.type],
282
+ });
283
+
284
+ return {
285
+ path: fileName, // change the reference to the changed module
286
+ external: props.format === "modules", // mark it as external in the bundle
287
+ namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
288
+ watchFiles: [filePath], // we also add the file to esbuild's watch list
289
+ };
290
+ }
291
+ );
292
+
293
+ if (props.format === "service-worker") {
294
+ build.onLoad(
295
+ { filter: globToRegExp(glob) },
296
+ async (args: esbuild.OnLoadArgs) => {
297
+ return {
298
+ // We replace the the module with an identifier
299
+ // that we'll separately add to the form upload
300
+ // as part of [wasm_modules]/[text_blobs]/[data_blobs]. This identifier has to be a valid
301
+ // JS identifier, so we replace all non alphanumeric characters
302
+ // with an underscore.
303
+ contents: `export default ${args.path.replace(
304
+ /[^a-zA-Z0-9_$]/g,
305
+ "_"
306
+ )};`,
307
+ };
308
+ }
309
+ );
310
+ }
311
+ });
312
+ });
313
+
314
+ removedRules.forEach((rule) => {
315
+ rule.globs.forEach((glob) => {
316
+ build.onResolve(
317
+ { filter: globToRegExp(glob) },
318
+ async (args: esbuild.OnResolveArgs) => {
319
+ throw new Error(
320
+ `The file ${
321
+ args.path
322
+ } matched a module rule in your configuration (${JSON.stringify(
323
+ rule
324
+ )}), but was ignored because a previous rule with the same type was not marked as \`fallthrough = true\`.`
325
+ );
326
+ }
327
+ );
328
+ });
329
+ });
330
+ },
331
+ },
332
+ };
253
333
  }