wrangler 0.0.0-e6733a3 → 0.0.0-e6e1daba

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 (362) hide show
  1. package/Cloudflare_CA.pem +18 -0
  2. package/README.md +47 -14
  3. package/bin/wrangler.js +180 -28
  4. package/kv-asset-handler.js +1 -0
  5. package/miniflare-dist/index.mjs +6368 -0
  6. package/package.json +193 -124
  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.js +64 -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 +42 -0
  13. package/src/__tests__/configuration.test.ts +4233 -0
  14. package/src/__tests__/d1/d1.test.ts +82 -0
  15. package/src/__tests__/d1/execute.test.ts +64 -0
  16. package/src/__tests__/d1/migrate.test.ts +155 -0
  17. package/src/__tests__/d1/splitter.test.ts +255 -0
  18. package/src/__tests__/delete.test.ts +266 -0
  19. package/src/__tests__/deployments.test.ts +129 -0
  20. package/src/__tests__/dev.test.tsx +1583 -62
  21. package/src/__tests__/generate.test.ts +238 -0
  22. package/src/__tests__/get-host-from-url.test.ts +16 -0
  23. package/src/__tests__/guess-worker-format.test.ts +120 -0
  24. package/src/__tests__/helpers/cmd-shim.d.ts +11 -0
  25. package/src/__tests__/helpers/end-event-loop.ts +6 -0
  26. package/src/__tests__/helpers/mock-account-id.ts +48 -0
  27. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  28. package/src/__tests__/helpers/mock-bin.ts +36 -0
  29. package/src/__tests__/helpers/mock-console.ts +106 -0
  30. package/src/__tests__/helpers/mock-dialogs.ts +139 -0
  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 +46 -0
  34. package/src/__tests__/helpers/mock-istty.ts +74 -0
  35. package/src/__tests__/helpers/mock-known-routes.ts +12 -0
  36. package/src/__tests__/helpers/mock-kv.ts +46 -0
  37. package/src/__tests__/helpers/mock-oauth-flow.ts +263 -0
  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 +108 -0
  41. package/src/__tests__/helpers/mock-web-socket.ts +29 -0
  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 +93 -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 +50 -0
  52. package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
  53. package/src/__tests__/helpers/run-in-tmp.ts +38 -0
  54. package/src/__tests__/helpers/run-wrangler.ts +16 -0
  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 +8 -0
  60. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  61. package/src/__tests__/helpers/write-worker-source.ts +31 -0
  62. package/src/__tests__/helpers/write-wrangler-toml.ts +17 -0
  63. package/src/__tests__/https-options.test.ts +163 -0
  64. package/src/__tests__/index.test.ts +271 -284
  65. package/src/__tests__/init.test.ts +3164 -0
  66. package/src/__tests__/jest.setup.ts +169 -16
  67. package/src/__tests__/kv.test.ts +1794 -1093
  68. package/src/__tests__/logger.test.ts +141 -0
  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 +815 -0
  73. package/src/__tests__/mtls-certificates.test.ts +585 -0
  74. package/src/__tests__/package-manager.test.ts +353 -0
  75. package/src/__tests__/pages/deployment-list.test.ts +78 -0
  76. package/src/__tests__/pages/functions-build.test.ts +402 -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 +108 -0
  80. package/src/__tests__/pages/project-upload.test.ts +481 -0
  81. package/src/__tests__/pages/publish.test.ts +2745 -0
  82. package/src/__tests__/pages-deployment-tail.test.ts +955 -0
  83. package/src/__tests__/parse.test.ts +436 -0
  84. package/src/__tests__/paths.test.ts +39 -0
  85. package/src/__tests__/publish.test.ts +8167 -0
  86. package/src/__tests__/pubsub.test.ts +493 -0
  87. package/src/__tests__/queues.test.ts +529 -0
  88. package/src/__tests__/r2.test.ts +374 -0
  89. package/src/__tests__/route.test.ts +45 -0
  90. package/src/__tests__/secret.test.ts +693 -0
  91. package/src/__tests__/tail.test.ts +958 -0
  92. package/src/__tests__/test-old-node-version.js +31 -0
  93. package/src/__tests__/tsconfig-sanity.ts +12 -0
  94. package/src/__tests__/tsconfig.json +8 -0
  95. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  96. package/src/__tests__/type-generation.test.ts +233 -0
  97. package/src/__tests__/user.test.ts +118 -0
  98. package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
  99. package/src/__tests__/validate-dev-props.test.ts +56 -0
  100. package/src/__tests__/version.test.ts +35 -0
  101. package/src/__tests__/whoami.test.tsx +172 -0
  102. package/src/__tests__/worker-namespace.test.ts +339 -0
  103. package/src/abort.d.ts +3 -0
  104. package/src/api/dev.ts +328 -0
  105. package/src/api/index.ts +11 -0
  106. package/src/api/mtls-certificate.ts +148 -0
  107. package/src/api/pages/create-worker-bundle-contents.ts +75 -0
  108. package/src/api/pages/index.ts +5 -0
  109. package/src/api/pages/publish.tsx +368 -0
  110. package/src/bundle-reporter.ts +68 -0
  111. package/src/bundle.ts +877 -0
  112. package/src/cfetch/index.ts +127 -71
  113. package/src/cfetch/internal.ts +235 -46
  114. package/src/cli.ts +25 -6
  115. package/src/config/README.md +107 -0
  116. package/src/config/config.ts +282 -0
  117. package/src/config/diagnostics.ts +80 -0
  118. package/src/config/environment.ts +586 -0
  119. package/src/config/index.ts +375 -0
  120. package/src/config/validation-helpers.ts +597 -0
  121. package/src/config/validation.ts +2198 -0
  122. package/src/config-cache.ts +85 -0
  123. package/src/create-worker-preview.ts +293 -0
  124. package/src/create-worker-upload-form.ts +334 -0
  125. package/src/d1/backups.tsx +215 -0
  126. package/src/d1/constants.ts +2 -0
  127. package/src/d1/create.tsx +64 -0
  128. package/src/d1/delete.ts +53 -0
  129. package/src/d1/execute.tsx +354 -0
  130. package/src/d1/formatTimeAgo.ts +14 -0
  131. package/src/d1/index.ts +100 -0
  132. package/src/d1/list.tsx +60 -0
  133. package/src/d1/migrations/apply.tsx +206 -0
  134. package/src/d1/migrations/create.tsx +76 -0
  135. package/src/d1/migrations/helpers.ts +172 -0
  136. package/src/d1/migrations/index.ts +3 -0
  137. package/src/d1/migrations/list.tsx +92 -0
  138. package/src/d1/migrations/options.ts +23 -0
  139. package/src/d1/options.ts +22 -0
  140. package/src/d1/splitter.ts +161 -0
  141. package/src/d1/types.ts +25 -0
  142. package/src/d1/utils.ts +49 -0
  143. package/src/delete.ts +100 -0
  144. package/src/deployments.ts +116 -0
  145. package/src/deprecated/index.ts +144 -0
  146. package/src/dev/dev-vars.ts +39 -0
  147. package/src/dev/dev.tsx +600 -0
  148. package/src/dev/get-local-persistence-path.ts +31 -0
  149. package/src/dev/local.tsx +922 -0
  150. package/src/dev/remote.tsx +632 -0
  151. package/src/dev/start-server.ts +538 -0
  152. package/src/dev/use-esbuild.ts +205 -0
  153. package/src/dev/validate-dev-props.ts +31 -0
  154. package/src/dev-registry.ts +201 -0
  155. package/src/dev.tsx +895 -752
  156. package/src/dialogs.ts +136 -0
  157. package/src/dispatch-namespace.ts +211 -0
  158. package/src/docs/index.ts +97 -0
  159. package/src/durable.ts +102 -0
  160. package/src/entry.ts +327 -0
  161. package/src/environment-variables/factory.ts +88 -0
  162. package/src/environment-variables/misc-variables.ts +30 -0
  163. package/src/errors.ts +11 -0
  164. package/src/generate/index.ts +298 -0
  165. package/src/git-client.ts +135 -0
  166. package/src/global-wrangler-config-path.ts +26 -0
  167. package/src/https-options.ts +127 -0
  168. package/src/index.ts +705 -0
  169. package/src/init.ts +1022 -0
  170. package/src/inspect.ts +735 -477
  171. package/src/intl-polyfill.d.ts +139 -0
  172. package/src/is-ci.ts +14 -0
  173. package/src/is-interactive.ts +16 -0
  174. package/src/jest.d.ts +4 -0
  175. package/src/kv/helpers.ts +430 -0
  176. package/src/kv/index.ts +594 -0
  177. package/src/logger.ts +104 -0
  178. package/src/metrics/index.ts +5 -0
  179. package/src/metrics/metrics-config.ts +239 -0
  180. package/src/metrics/metrics-dispatcher.ts +96 -0
  181. package/src/metrics/metrics-usage-headers.ts +24 -0
  182. package/src/metrics/send-event.ts +98 -0
  183. package/src/miniflare-cli/README.md +30 -0
  184. package/src/miniflare-cli/assets.ts +251 -0
  185. package/src/miniflare-cli/index.ts +210 -0
  186. package/src/miniflare-cli/request-context.ts +40 -0
  187. package/src/miniflare-cli/tsconfig.json +9 -0
  188. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  189. package/src/miniflare-cli/types.ts +11 -0
  190. package/src/module-collection.ts +256 -53
  191. package/src/mtls-certificate/cli.ts +155 -0
  192. package/src/open-in-browser.ts +17 -0
  193. package/src/package-manager.ts +219 -0
  194. package/src/pages/build.ts +232 -0
  195. package/src/pages/buildFunctions.ts +130 -0
  196. package/src/pages/constants.ts +18 -0
  197. package/src/pages/deployment-tails.ts +281 -0
  198. package/src/pages/deployments.tsx +86 -0
  199. package/src/pages/dev.ts +716 -0
  200. package/src/pages/errors.ts +66 -0
  201. package/src/pages/functions/buildPlugin.ts +90 -0
  202. package/src/pages/functions/buildWorker.ts +288 -0
  203. package/src/pages/functions/filepath-routing.test.ts +234 -0
  204. package/src/pages/functions/filepath-routing.ts +189 -0
  205. package/src/pages/functions/identifiers.ts +78 -0
  206. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  207. package/src/pages/functions/routes-consolidation.ts +73 -0
  208. package/src/pages/functions/routes-transformation.test.ts +282 -0
  209. package/src/pages/functions/routes-transformation.ts +115 -0
  210. package/src/pages/functions/routes-validation.test.ts +403 -0
  211. package/src/pages/functions/routes-validation.ts +202 -0
  212. package/src/pages/functions/routes.ts +151 -0
  213. package/src/pages/functions/tsconfig.json +8 -0
  214. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  215. package/src/pages/functions.ts +86 -0
  216. package/src/pages/hash.ts +13 -0
  217. package/src/pages/index.ts +102 -0
  218. package/src/pages/projects.tsx +162 -0
  219. package/src/pages/prompt-select-project.tsx +31 -0
  220. package/src/pages/publish.tsx +276 -0
  221. package/src/pages/types.ts +46 -0
  222. package/src/pages/upload.tsx +449 -0
  223. package/src/pages/utils.ts +23 -0
  224. package/src/parse.ts +308 -0
  225. package/src/paths.ts +71 -0
  226. package/src/proxy.ts +652 -252
  227. package/src/publish/index.ts +274 -0
  228. package/src/publish/publish.ts +1065 -0
  229. package/src/pubsub/index.ts +286 -0
  230. package/src/pubsub/pubsub-commands.ts +623 -0
  231. package/src/queues/cli/commands/consumer/add.ts +65 -0
  232. package/src/queues/cli/commands/consumer/index.ts +19 -0
  233. package/src/queues/cli/commands/consumer/remove.ts +31 -0
  234. package/src/queues/cli/commands/create.ts +25 -0
  235. package/src/queues/cli/commands/delete.ts +26 -0
  236. package/src/queues/cli/commands/index.ts +35 -0
  237. package/src/queues/cli/commands/list.ts +25 -0
  238. package/src/queues/client.ts +135 -0
  239. package/src/queues/utils.ts +18 -0
  240. package/src/r2/constants.ts +4 -0
  241. package/src/r2/helpers.ts +132 -0
  242. package/src/r2/index.ts +289 -0
  243. package/src/routes.ts +140 -0
  244. package/src/secret/index.ts +375 -0
  245. package/src/selfsigned.d.ts +29 -0
  246. package/src/sites.ts +372 -0
  247. package/src/tail/createTail.ts +406 -0
  248. package/src/tail/filters.ts +277 -0
  249. package/src/tail/index.ts +211 -0
  250. package/src/tail/printing.ts +122 -0
  251. package/src/tsconfig-sanity.ts +16 -0
  252. package/src/type-generation.ts +181 -0
  253. package/src/update-check.ts +19 -0
  254. package/src/user/access.ts +68 -0
  255. package/src/user/auth-variables.ts +113 -0
  256. package/src/user/choose-account.tsx +39 -0
  257. package/src/user/generate-auth-url.ts +33 -0
  258. package/src/user/generate-random-state.ts +16 -0
  259. package/src/user/index.ts +2 -0
  260. package/src/user/user.ts +1233 -0
  261. package/src/utils/collectKeyValues.ts +14 -0
  262. package/src/whoami.ts +135 -0
  263. package/src/worker.ts +257 -0
  264. package/src/yargs-types.ts +37 -0
  265. package/src/zones.ts +191 -0
  266. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  267. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  268. package/templates/__tests__/tsconfig.json +8 -0
  269. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  270. package/templates/checked-fetch.js +23 -0
  271. package/templates/d1-beta-facade.js +241 -0
  272. package/templates/facade.d.ts +14 -0
  273. package/templates/first-party-worker-module-facade.ts +19 -0
  274. package/templates/format-dev-errors.ts +34 -0
  275. package/templates/gitignore +171 -0
  276. package/templates/init-tests/test-jest-new-worker.js +23 -0
  277. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  278. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  279. package/templates/middleware/common.ts +62 -0
  280. package/templates/middleware/loader-modules.ts +84 -0
  281. package/templates/middleware/loader-sw.ts +233 -0
  282. package/templates/middleware/middleware-miniflare3-json-error.ts +20 -0
  283. package/templates/middleware/middleware-pretty-error.ts +40 -0
  284. package/templates/middleware/middleware-scheduled.ts +15 -0
  285. package/templates/new-worker-scheduled.js +17 -0
  286. package/templates/new-worker-scheduled.ts +32 -0
  287. package/templates/new-worker.js +15 -0
  288. package/templates/new-worker.ts +33 -0
  289. package/templates/no-op-worker.js +10 -0
  290. package/templates/pages-dev-pipeline.ts +31 -0
  291. package/templates/pages-dev-util.ts +52 -0
  292. package/templates/pages-shim.ts +12 -0
  293. package/templates/pages-template-plugin.ts +180 -0
  294. package/templates/pages-template-worker.ts +189 -0
  295. package/templates/serve-static-assets.ts +66 -0
  296. package/templates/service-bindings-module-facade.js +55 -0
  297. package/templates/service-bindings-sw-facade.js +42 -0
  298. package/templates/tsconfig-sanity.ts +11 -0
  299. package/templates/tsconfig.init.json +106 -0
  300. package/templates/tsconfig.json +8 -0
  301. package/templates/tsconfig.tsbuildinfo +1 -0
  302. package/wrangler-dist/cli.d.ts +1621 -0
  303. package/wrangler-dist/cli.js +142082 -113808
  304. package/wrangler-dist/wasm-sync.wasm +0 -0
  305. package/pages/functions/buildWorker.ts +0 -62
  306. package/pages/functions/filepath-routing.test.ts +0 -39
  307. package/pages/functions/filepath-routing.ts +0 -221
  308. package/pages/functions/identifiers.ts +0 -78
  309. package/pages/functions/routes.ts +0 -158
  310. package/pages/functions/template-worker.ts +0 -144
  311. package/src/__tests__/mock-cfetch.ts +0 -171
  312. package/src/__tests__/mock-dialogs.ts +0 -65
  313. package/src/__tests__/run-in-tmp.ts +0 -19
  314. package/src/__tests__/run-wrangler.ts +0 -32
  315. package/src/api/form_data.ts +0 -131
  316. package/src/api/preview.ts +0 -128
  317. package/src/api/worker.ts +0 -155
  318. package/src/config.ts +0 -487
  319. package/src/dialogs.tsx +0 -77
  320. package/src/index.tsx +0 -1974
  321. package/src/kv.tsx +0 -267
  322. package/src/pages.tsx +0 -1031
  323. package/src/publish.ts +0 -358
  324. package/src/sites.tsx +0 -114
  325. package/src/tail.tsx +0 -73
  326. package/src/user.tsx +0 -1025
  327. package/static-asset-facade.js +0 -47
  328. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  329. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  330. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  331. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  332. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  333. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  334. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  335. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  336. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  337. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  338. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  339. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  340. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  341. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  342. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  343. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  344. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  345. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  346. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  347. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  348. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  349. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  350. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  351. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  352. package/vendor/wrangler-mime/LICENSE +0 -21
  353. package/vendor/wrangler-mime/Mime.js +0 -97
  354. package/vendor/wrangler-mime/README.md +0 -187
  355. package/vendor/wrangler-mime/cli.js +0 -46
  356. package/vendor/wrangler-mime/index.js +0 -4
  357. package/vendor/wrangler-mime/lite.js +0 -4
  358. package/vendor/wrangler-mime/package.json +0 -52
  359. package/vendor/wrangler-mime/types/other.js +0 -1
  360. package/vendor/wrangler-mime/types/standard.js +0 -1
  361. package/wrangler-dist/cli.js.map +0 -7
  362. /package/src/__tests__/{clipboardy-mock.js → helpers/clipboardy-mock.js} +0 -0
@@ -1,64 +1,267 @@
1
- import type { CfModule } from "./api/worker";
2
- import type esbuild from "esbuild";
3
- import path from "node:path";
4
- import { readFile } from "node:fs/promises";
5
1
  import crypto from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import globToRegExp from "glob-to-regexp";
5
+ import { logger } from "./logger";
6
+ import type { Config, ConfigModuleRuleType } from "./config";
7
+ import type { CfModule, CfModuleType, CfScriptFormat } from "./worker";
8
+ import type esbuild from "esbuild";
9
+
10
+ function flipObject<
11
+ K extends string | number | symbol,
12
+ V extends string | number | symbol
13
+ >(obj: Record<K, V>): Record<V, K> {
14
+ return Object.fromEntries(Object.entries(obj).map(([k, v]) => [v, k]));
15
+ }
16
+
17
+ const RuleTypeToModuleType: Record<ConfigModuleRuleType, CfModuleType> = {
18
+ ESModule: "esm",
19
+ CommonJS: "commonjs",
20
+ CompiledWasm: "compiled-wasm",
21
+ Data: "buffer",
22
+ Text: "text",
23
+ };
24
+
25
+ export const ModuleTypeToRuleType = flipObject(RuleTypeToModuleType);
6
26
 
7
27
  // This is a combination of an esbuild plugin and a mutable array
8
28
  // that we use to collect module references from source code.
9
29
  // There will be modules that _shouldn't_ be inlined directly into
10
30
  // the bundle. (eg. wasm modules, some text files, etc). We can include
11
- // those files as modules in the multi part forker form upload. This
31
+ // those files as modules in the multi part worker form upload. This
12
32
  // plugin+array is used to collect references to these modules, reference
13
33
  // them correctly in the bundle, and add them to the form upload.
14
34
 
15
- export default function makeModuleCollector(): {
16
- modules: CfModule[];
17
- plugin: esbuild.Plugin;
35
+ export const DEFAULT_MODULE_RULES: Config["rules"] = [
36
+ { type: "Text", globs: ["**/*.txt", "**/*.html"] },
37
+ { type: "Data", globs: ["**/*.bin"] },
38
+ { type: "CompiledWasm", globs: ["**/*.wasm"] },
39
+ ];
40
+
41
+ export default function createModuleCollector(props: {
42
+ format: CfScriptFormat;
43
+ rules?: Config["rules"];
44
+ // a collection of "legacy" style module references, which are just file names
45
+ // we will eventually deprecate this functionality, hence the verbose greppable name
46
+ wrangler1xlegacyModuleReferences: {
47
+ rootDirectory: string;
48
+ fileNames: Set<string>;
49
+ };
50
+ }): {
51
+ modules: CfModule[];
52
+ plugin: esbuild.Plugin;
18
53
  } {
19
- const modules: CfModule[] = [];
20
- return {
21
- modules,
22
- plugin: {
23
- name: "wrangler-module-collector",
24
- setup(build) {
25
- build.onStart(() => {
26
- // reset the moduels collection
27
- modules.splice(0);
28
- });
29
-
30
- build.onResolve(
31
- // filter on "known" file types,
32
- // we can expand this list later
33
- { filter: /.*\.(pem|txt|html|wasm)$/ },
34
- async (args: esbuild.OnResolveArgs) => {
35
- // take the file and massage it to a
36
- // transportable/manageable format
37
- const fileExt = path.extname(args.path);
38
- const filePath = path.join(args.resolveDir, args.path);
39
- const fileContent = await readFile(filePath);
40
- const fileHash = crypto
41
- .createHash("sha1")
42
- .update(fileContent)
43
- .digest("hex");
44
- const fileName = `${fileHash}-${path.basename(args.path)}`;
45
-
46
- // add the module to the array
47
- modules.push({
48
- name: fileName,
49
- content: fileContent,
50
- type: fileExt === ".wasm" ? "compiled-wasm" : "text",
51
- });
52
-
53
- return {
54
- path: fileName, // change the reference to the changed module
55
- external: true, // mark it as external in the bundle
56
- namespace: "wrangler-module-collector-ns", // just a tag, this isn't strictly necessary
57
- watchFiles: [filePath], // we also add the file to esbuild's watch list
58
- };
59
- }
60
- );
61
- },
62
- },
63
- };
54
+ const rules: Config["rules"] = [
55
+ ...(props.rules || []),
56
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
57
+ ...DEFAULT_MODULE_RULES!,
58
+ ];
59
+
60
+ // First, we want to add some validations to the module rules
61
+ // We want to warn if rules are accidentally configured in such a way that
62
+ // subsequent rules will never match because `fallthrough` hasn't been set
63
+
64
+ const completedRuleLocations: Record<string, number> = {};
65
+ let index = 0;
66
+ const rulesToRemove: Config["rules"] = [];
67
+ for (const rule of rules) {
68
+ if (rule.type in completedRuleLocations) {
69
+ if (rules[completedRuleLocations[rule.type]].fallthrough !== false) {
70
+ if (index < (props.rules || []).length) {
71
+ logger.warn(
72
+ `The module rule at position ${index} (${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 this one to also be used, or \`fallthrough = false\` to silence this warning.`
79
+ );
80
+ } else {
81
+ logger.warn(
82
+ `The default module rule ${JSON.stringify(
83
+ rule
84
+ )} has the same type as a previous rule (at position ${
85
+ completedRuleLocations[rule.type]
86
+ }, ${JSON.stringify(
87
+ rules[completedRuleLocations[rule.type]]
88
+ )}). 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.`
89
+ );
90
+ }
91
+ }
92
+
93
+ rulesToRemove.push(rule);
94
+ }
95
+ if (!(rule.type in completedRuleLocations) && rule.fallthrough !== true) {
96
+ completedRuleLocations[rule.type] = index;
97
+ }
98
+ index++;
99
+ }
100
+
101
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
102
+ rulesToRemove.forEach((rule) => rules!.splice(rules!.indexOf(rule), 1));
103
+
104
+ const modules: CfModule[] = [];
105
+ return {
106
+ modules,
107
+ plugin: {
108
+ name: "wrangler-module-collector",
109
+ setup(build) {
110
+ build.onStart(() => {
111
+ // reset the module collection array
112
+ modules.splice(0);
113
+ });
114
+
115
+ // ~ start legacy module specifier support ~
116
+
117
+ // This section detects usage of "legacy" 1.x style module specifiers
118
+ // and modifies them so they "work" in wrangler v2, but with a warning
119
+
120
+ const rulesMatchers = rules.flatMap((rule) => {
121
+ return rule.globs.map((glob) => {
122
+ const regex = globToRegExp(glob);
123
+ return {
124
+ regex,
125
+ rule,
126
+ };
127
+ });
128
+ });
129
+
130
+ if (props.wrangler1xlegacyModuleReferences.fileNames.size > 0) {
131
+ build.onResolve(
132
+ {
133
+ filter: new RegExp(
134
+ "^(" +
135
+ [...props.wrangler1xlegacyModuleReferences.fileNames]
136
+ .map((name) => name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"))
137
+ .join("|") +
138
+ ")$"
139
+ ),
140
+ },
141
+ async (args: esbuild.OnResolveArgs) => {
142
+ if (
143
+ args.kind !== "import-statement" &&
144
+ args.kind !== "require-call"
145
+ ) {
146
+ return;
147
+ }
148
+ // In the future, this will simply throw an error
149
+ logger.warn(
150
+ `Deprecation: detected a legacy module import in "./${path.relative(
151
+ process.cwd(),
152
+ args.importer
153
+ )}". This will stop working in the future. Replace references to "${
154
+ args.path
155
+ }" with "./${args.path}";`
156
+ );
157
+
158
+ // take the file and massage it to a
159
+ // transportable/manageable format
160
+ const filePath = path.join(
161
+ props.wrangler1xlegacyModuleReferences.rootDirectory,
162
+ args.path
163
+ );
164
+ const fileContent = await readFile(filePath);
165
+ const fileHash = crypto
166
+ .createHash("sha1")
167
+ .update(fileContent)
168
+ .digest("hex");
169
+ const fileName = `./${fileHash}-${path.basename(args.path)}`;
170
+
171
+ const { rule } =
172
+ rulesMatchers.find(({ regex }) => regex.test(fileName)) || {};
173
+ if (rule) {
174
+ // add the module to the array
175
+ modules.push({
176
+ name: fileName,
177
+ content: fileContent,
178
+ type: RuleTypeToModuleType[rule.type],
179
+ });
180
+ return {
181
+ path: fileName, // change the reference to the changed module
182
+ external: props.format === "modules", // mark it as external in the bundle
183
+ namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
184
+ watchFiles: [filePath], // we also add the file to esbuild's watch list
185
+ };
186
+ }
187
+ }
188
+ );
189
+ }
190
+
191
+ // ~ end legacy module specifier support ~
192
+
193
+ rules?.forEach((rule) => {
194
+ if (rule.type === "ESModule" || rule.type === "CommonJS") return; // TODO: we should treat these as js files, and use the jsx loader
195
+
196
+ rule.globs.forEach((glob) => {
197
+ build.onResolve(
198
+ { filter: globToRegExp(glob) },
199
+ async (args: esbuild.OnResolveArgs) => {
200
+ // take the file and massage it to a
201
+ // transportable/manageable format
202
+
203
+ const filePath = path.join(args.resolveDir, args.path);
204
+ const fileContent = await readFile(filePath);
205
+ const fileHash = crypto
206
+ .createHash("sha1")
207
+ .update(fileContent)
208
+ .digest("hex");
209
+ const fileName = `./${fileHash}-${path.basename(args.path)}`;
210
+
211
+ // add the module to the array
212
+ modules.push({
213
+ name: fileName,
214
+ content: fileContent,
215
+ type: RuleTypeToModuleType[rule.type],
216
+ });
217
+
218
+ return {
219
+ path: fileName, // change the reference to the changed module
220
+ external: props.format === "modules", // mark it as external in the bundle
221
+ namespace: `wrangler-module-${rule.type}`, // just a tag, this isn't strictly necessary
222
+ watchFiles: [filePath], // we also add the file to esbuild's watch list
223
+ };
224
+ }
225
+ );
226
+
227
+ if (props.format === "service-worker") {
228
+ build.onLoad(
229
+ { filter: globToRegExp(glob) },
230
+ async (args: esbuild.OnLoadArgs) => {
231
+ return {
232
+ // We replace the the module with an identifier
233
+ // that we'll separately add to the form upload
234
+ // as part of [wasm_modules]/[text_blobs]/[data_blobs]. This identifier has to be a valid
235
+ // JS identifier, so we replace all non alphanumeric characters
236
+ // with an underscore.
237
+ contents: `export default ${args.path.replace(
238
+ /[^a-zA-Z0-9_$]/g,
239
+ "_"
240
+ )};`,
241
+ };
242
+ }
243
+ );
244
+ }
245
+ });
246
+ });
247
+
248
+ rulesToRemove.forEach((rule) => {
249
+ rule.globs.forEach((glob) => {
250
+ build.onResolve(
251
+ { filter: globToRegExp(glob) },
252
+ async (args: esbuild.OnResolveArgs) => {
253
+ throw new Error(
254
+ `The file ${
255
+ args.path
256
+ } matched a module rule in your configuration (${JSON.stringify(
257
+ rule
258
+ )}), but was ignored because a previous rule with the same type was not marked as \`fallthrough = true\`.`
259
+ );
260
+ }
261
+ );
262
+ });
263
+ });
264
+ },
265
+ },
266
+ };
64
267
  }
@@ -0,0 +1,155 @@
1
+ import {
2
+ uploadMTlsCertificateFromFs,
3
+ listMTlsCertificates,
4
+ deleteMTlsCertificate,
5
+ getMTlsCertificate,
6
+ getMTlsCertificateByName,
7
+ type MTlsCertificateResponse,
8
+ } from "../api/mtls-certificate";
9
+ import { withConfig } from "../config";
10
+ import { confirm } from "../dialogs";
11
+ import { logger } from "../logger";
12
+ import { requireAuth } from "../user";
13
+ import type {
14
+ CommonYargsOptions,
15
+ CommonYargsArgv,
16
+ StrictYargsOptionsToInterface,
17
+ } from "../yargs-types";
18
+ import type { BuilderCallback } from "yargs";
19
+
20
+ function uploadMTlsCertificateOptions(yargs: CommonYargsArgv) {
21
+ return yargs
22
+ .option("cert", {
23
+ describe:
24
+ "The path to a certificate file (.pem) containing a chain of certificates to upload",
25
+ type: "string",
26
+ demandOption: true,
27
+ })
28
+ .option("key", {
29
+ describe:
30
+ "The path to a file containing the private key for your leaf certificate",
31
+ type: "string",
32
+ demandOption: true,
33
+ })
34
+ .option("name", {
35
+ describe: "The name for the certificate",
36
+ type: "string",
37
+ });
38
+ }
39
+
40
+ const uploadMTlsCertificateHandler = withConfig<
41
+ StrictYargsOptionsToInterface<typeof uploadMTlsCertificateOptions>
42
+ >(async ({ config, cert, key, name }) => {
43
+ const accountId = await requireAuth(config);
44
+ logger.log(
45
+ name
46
+ ? `Uploading mTLS Certificate ${name}...`
47
+ : `Uploading mTLS Certificate...`
48
+ );
49
+ const certResponse = await uploadMTlsCertificateFromFs(accountId, {
50
+ certificateChainFilename: cert,
51
+ privateKeyFilename: key,
52
+ name: name,
53
+ });
54
+ const expiresOn = new Date(certResponse.expires_on).toLocaleDateString();
55
+ logger.log(
56
+ name
57
+ ? `Success! Uploaded mTLS Certificate ${name}`
58
+ : `Success! Uploaded mTLS Certificate`
59
+ );
60
+ logger.log(`ID: ${certResponse.id}`);
61
+ logger.log(`Issuer: ${certResponse.issuer}`);
62
+ logger.log(`Expires on ${expiresOn}`);
63
+ });
64
+
65
+ const listMTlsCertificatesHandler = withConfig(async ({ config }) => {
66
+ const accountId = await requireAuth(config);
67
+ const certificates = await listMTlsCertificates(accountId, {});
68
+ for (const certificate of certificates) {
69
+ logger.log(`ID: ${certificate.id}`);
70
+ if (certificate.name) {
71
+ logger.log(`Name: ${certificate.name}`);
72
+ }
73
+ logger.log(`Issuer: ${certificate.issuer}`);
74
+ logger.log(
75
+ `Created on: ${new Date(certificate.uploaded_on).toLocaleDateString()}`
76
+ );
77
+ logger.log(
78
+ `Expires on: ${new Date(certificate.expires_on).toLocaleDateString()}`
79
+ );
80
+ logger.log("\n");
81
+ }
82
+ });
83
+
84
+ function deleteMTlsCertificateOptions(yargs: CommonYargsArgv) {
85
+ return yargs
86
+ .option("id", {
87
+ describe: "The id of the mTLS certificate to delete",
88
+ type: "string",
89
+ })
90
+ .option("name", {
91
+ describe: "The name of the mTLS certificate record to delete",
92
+ type: "string",
93
+ });
94
+ }
95
+
96
+ const deleteMTlsCertificateHandler = withConfig<
97
+ StrictYargsOptionsToInterface<typeof deleteMTlsCertificateOptions>
98
+ >(async ({ config, id, name }) => {
99
+ const accountId = await requireAuth(config);
100
+ if (id && name) {
101
+ return logger.error(`Error: can't provide both --id and --name.`);
102
+ } else if (!id && !name) {
103
+ return logger.error(`Error: must provide --id or --name.`);
104
+ }
105
+ let certificate: MTlsCertificateResponse;
106
+ if (id) {
107
+ certificate = await getMTlsCertificate(accountId, id);
108
+ } else {
109
+ certificate = await getMTlsCertificateByName(accountId, name as string);
110
+ }
111
+
112
+ const response = await confirm(
113
+ certificate.name
114
+ ? `Are you sure you want to delete certificate ${certificate.id} (${certificate.name})?`
115
+ : `Are you sure you want to delete certificate ${certificate.id}?`
116
+ );
117
+ if (!response) {
118
+ logger.log("Not deleting");
119
+ return;
120
+ }
121
+
122
+ await deleteMTlsCertificate(accountId, certificate.id);
123
+
124
+ logger.log(
125
+ certificate.name
126
+ ? `Deleted certificate ${certificate.id} (${certificate.name}) successfully`
127
+ : `Deleted certificate ${certificate.id} successfully`
128
+ );
129
+ });
130
+
131
+ export const mTlsCertificateCommands: BuilderCallback<
132
+ CommonYargsOptions,
133
+ unknown
134
+ > = (yargs) => {
135
+ yargs.command(
136
+ "upload",
137
+ "Upload an mTLS certificate",
138
+ uploadMTlsCertificateOptions,
139
+ uploadMTlsCertificateHandler
140
+ );
141
+
142
+ yargs.command(
143
+ "list",
144
+ "List uploaded mTLS certificates",
145
+ (a) => a,
146
+ listMTlsCertificatesHandler
147
+ );
148
+
149
+ yargs.command(
150
+ "delete",
151
+ "Delete an mTLS certificate",
152
+ deleteMTlsCertificateOptions,
153
+ deleteMTlsCertificateHandler
154
+ );
155
+ };
@@ -0,0 +1,17 @@
1
+ import open from "open";
2
+ import { logger } from "./logger";
3
+
4
+ /**
5
+ * An extremely simple wrapper around the open command.
6
+ * Specifically, it adds an 'error' event handler so that when this function
7
+ * is called in environments where we can't open the browser (e.g. GitHub Codespaces,
8
+ * StackBlitz, remote servers), it doesn't just crash the process.
9
+ *
10
+ * @param url the URL to point the browser at
11
+ */
12
+ export default async function openInBrowser(url: string): Promise<void> {
13
+ const childProcess = await open(url);
14
+ childProcess.on("error", () => {
15
+ logger.warn("Failed to open");
16
+ });
17
+ }