wrangler 0.0.0-e64812e → 0.0.0-e665ccc3

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 (373) 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 +1643 -83
  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 +4506 -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 +237 -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 +3167 -1605
  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__/user.test.ts +107 -120
  99. package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
  100. package/src/__tests__/validate-dev-props.test.ts +56 -0
  101. package/src/__tests__/version.test.ts +35 -0
  102. package/src/__tests__/whoami.test.tsx +165 -98
  103. package/src/__tests__/worker-namespace.test.ts +340 -0
  104. package/src/abort.d.ts +1 -1
  105. package/src/api/dev.ts +321 -0
  106. package/src/api/index.ts +11 -0
  107. package/src/api/mtls-certificate.ts +148 -0
  108. package/src/api/pages/create-worker-bundle-contents.ts +77 -0
  109. package/src/api/pages/index.ts +5 -0
  110. package/src/api/pages/publish.tsx +371 -0
  111. package/src/bundle-reporter.ts +68 -0
  112. package/src/bundle.ts +890 -161
  113. package/src/cfetch/index.ts +120 -83
  114. package/src/cfetch/internal.ts +210 -97
  115. package/src/cli.ts +23 -8
  116. package/src/config/config.ts +244 -196
  117. package/src/config/diagnostics.ts +61 -61
  118. package/src/config/environment.ts +562 -357
  119. package/src/config/index.ts +374 -196
  120. package/src/config/validation-helpers.ts +379 -357
  121. package/src/config/validation.ts +2197 -1367
  122. package/src/config-cache.ts +81 -41
  123. package/src/constellation/createProject.tsx +51 -0
  124. package/src/constellation/deleteProject.ts +51 -0
  125. package/src/constellation/deleteProjectModel.ts +68 -0
  126. package/src/constellation/index.ts +75 -0
  127. package/src/constellation/listCatalog.tsx +35 -0
  128. package/src/constellation/listModel.tsx +41 -0
  129. package/src/constellation/listProject.tsx +28 -0
  130. package/src/constellation/listRuntime.tsx +28 -0
  131. package/src/constellation/options.ts +17 -0
  132. package/src/constellation/types.ts +17 -0
  133. package/src/constellation/uploadModel.tsx +64 -0
  134. package/src/constellation/utils.ts +90 -0
  135. package/src/create-worker-preview.ts +250 -142
  136. package/src/create-worker-upload-form.ts +347 -238
  137. package/src/d1/backups.tsx +219 -0
  138. package/src/d1/constants.ts +2 -0
  139. package/src/d1/create.tsx +70 -0
  140. package/src/d1/delete.ts +53 -0
  141. package/src/d1/execute.tsx +357 -0
  142. package/src/d1/formatTimeAgo.ts +14 -0
  143. package/src/d1/index.ts +100 -0
  144. package/src/d1/list.tsx +62 -0
  145. package/src/d1/migrations/apply.tsx +212 -0
  146. package/src/d1/migrations/create.tsx +79 -0
  147. package/src/d1/migrations/helpers.ts +169 -0
  148. package/src/d1/migrations/index.ts +3 -0
  149. package/src/d1/migrations/list.tsx +95 -0
  150. package/src/d1/migrations/options.ts +23 -0
  151. package/src/d1/options.ts +22 -0
  152. package/src/d1/splitter.ts +161 -0
  153. package/src/d1/types.ts +25 -0
  154. package/src/d1/utils.ts +49 -0
  155. package/src/delete.ts +100 -0
  156. package/src/deployments.ts +368 -0
  157. package/src/deprecated/index.ts +144 -0
  158. package/src/dev/dev-vars.ts +20 -17
  159. package/src/dev/dev.tsx +538 -352
  160. package/src/dev/get-local-persistence-path.ts +31 -0
  161. package/src/dev/local.tsx +932 -298
  162. package/src/dev/remote.tsx +623 -215
  163. package/src/dev/start-server.ts +545 -0
  164. package/src/dev/use-esbuild.ts +194 -97
  165. package/src/dev/validate-dev-props.ts +40 -0
  166. package/src/dev-registry.ts +202 -0
  167. package/src/dev.tsx +934 -0
  168. package/src/dialogs.ts +136 -0
  169. package/src/dispatch-namespace.ts +211 -0
  170. package/src/docs/helpers.ts +50 -0
  171. package/src/docs/index.ts +54 -0
  172. package/src/durable.ts +87 -87
  173. package/src/entry.ts +253 -231
  174. package/src/environment-variables/factory.ts +89 -0
  175. package/src/environment-variables/misc-variables.ts +30 -0
  176. package/src/errors.ts +6 -6
  177. package/src/generate/index.ts +298 -0
  178. package/src/git-client.ts +135 -0
  179. package/src/global-wrangler-config-path.ts +26 -0
  180. package/src/https-options.ts +84 -80
  181. package/src/index.ts +768 -0
  182. package/src/init.ts +1037 -0
  183. package/src/inspect.ts +816 -595
  184. package/src/intl-polyfill.d.ts +123 -123
  185. package/src/is-ci.ts +14 -0
  186. package/src/is-interactive.ts +16 -0
  187. package/src/jest.d.ts +4 -0
  188. package/src/kv/helpers.ts +433 -0
  189. package/src/kv/index.ts +594 -0
  190. package/src/logger.ts +100 -43
  191. package/src/metrics/index.ts +5 -0
  192. package/src/metrics/metrics-config.ts +239 -0
  193. package/src/metrics/metrics-dispatcher.ts +96 -0
  194. package/src/metrics/metrics-usage-headers.ts +24 -0
  195. package/src/metrics/send-event.ts +99 -0
  196. package/src/miniflare-cli/assets.ts +255 -0
  197. package/src/miniflare-cli/index.ts +202 -33
  198. package/src/miniflare-cli/request-context.ts +18 -18
  199. package/src/miniflare-cli/tsconfig.json +9 -0
  200. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  201. package/src/miniflare-cli/types.ts +11 -0
  202. package/src/module-collection.ts +290 -215
  203. package/src/mtls-certificate/cli.ts +155 -0
  204. package/src/open-in-browser.ts +4 -6
  205. package/src/package-manager.ts +173 -128
  206. package/src/pages/build.ts +423 -0
  207. package/src/pages/buildFunctions.ts +140 -0
  208. package/src/pages/constants.ts +18 -0
  209. package/src/pages/deployment-tails.ts +281 -0
  210. package/src/pages/deployments.tsx +84 -0
  211. package/src/pages/dev.ts +734 -0
  212. package/src/pages/errors.ts +67 -0
  213. package/src/pages/functions/buildPlugin.ts +114 -0
  214. package/src/pages/functions/buildWorker.ts +350 -0
  215. package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
  216. package/src/pages/functions/filepath-routing.ts +189 -0
  217. package/src/pages/functions/identifiers.ts +78 -0
  218. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  219. package/src/pages/functions/routes-consolidation.ts +73 -0
  220. package/src/pages/functions/routes-transformation.test.ts +282 -0
  221. package/src/pages/functions/routes-transformation.ts +115 -0
  222. package/src/pages/functions/routes-validation.test.ts +403 -0
  223. package/src/pages/functions/routes-validation.ts +202 -0
  224. package/src/pages/functions/routes.ts +151 -0
  225. package/src/pages/functions/tsconfig.json +8 -0
  226. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  227. package/src/pages/functions.ts +86 -0
  228. package/src/pages/hash.ts +13 -0
  229. package/src/pages/index.ts +102 -0
  230. package/src/pages/projects.tsx +159 -0
  231. package/src/pages/prompt-select-project.tsx +31 -0
  232. package/src/pages/publish.tsx +267 -0
  233. package/src/pages/types.ts +46 -0
  234. package/src/pages/upload.tsx +469 -0
  235. package/src/pages/utils.ts +23 -0
  236. package/src/parse.ts +232 -126
  237. package/src/paths.ts +53 -8
  238. package/src/proxy.ts +623 -394
  239. package/src/publish/index.ts +274 -0
  240. package/src/publish/publish.ts +1065 -0
  241. package/src/pubsub/index.ts +286 -0
  242. package/src/pubsub/pubsub-commands.ts +623 -0
  243. package/src/queues/cli/commands/consumer/add.ts +71 -0
  244. package/src/queues/cli/commands/consumer/index.ts +19 -0
  245. package/src/queues/cli/commands/consumer/remove.ts +31 -0
  246. package/src/queues/cli/commands/create.ts +25 -0
  247. package/src/queues/cli/commands/delete.ts +26 -0
  248. package/src/queues/cli/commands/index.ts +35 -0
  249. package/src/queues/cli/commands/list.ts +25 -0
  250. package/src/queues/client.ts +136 -0
  251. package/src/queues/utils.ts +18 -0
  252. package/src/r2/constants.ts +4 -0
  253. package/src/r2/helpers.ts +132 -0
  254. package/src/r2/index.ts +289 -0
  255. package/src/routes.ts +140 -0
  256. package/src/secret/index.ts +377 -0
  257. package/src/selfsigned.d.ts +23 -23
  258. package/src/sites.ts +484 -0
  259. package/src/tail/createTail.ts +415 -0
  260. package/src/tail/filters.ts +109 -111
  261. package/src/tail/index.ts +208 -296
  262. package/src/tail/printing.ts +116 -51
  263. package/src/traverse-module-graph.ts +54 -0
  264. package/src/tsconfig-sanity.ts +16 -0
  265. package/src/type-generation.ts +181 -0
  266. package/src/update-check.ts +11 -11
  267. package/src/user/access.ts +68 -0
  268. package/src/user/auth-variables.ts +113 -0
  269. package/src/user/choose-account.tsx +39 -0
  270. package/src/user/generate-auth-url.ts +33 -0
  271. package/src/user/generate-random-state.ts +16 -0
  272. package/src/user/index.ts +2 -0
  273. package/src/user/user.ts +1234 -0
  274. package/src/utils/collectKeyValues.ts +14 -0
  275. package/src/utils/render.ts +93 -0
  276. package/src/whoami.ts +135 -0
  277. package/src/worker.ts +205 -106
  278. package/src/yargs-types.ts +37 -0
  279. package/src/zones.ts +191 -0
  280. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  281. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  282. package/templates/__tests__/tsconfig.json +8 -0
  283. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  284. package/templates/checked-fetch.js +23 -0
  285. package/templates/d1-beta-facade.js +244 -0
  286. package/templates/facade.d.ts +14 -0
  287. package/templates/first-party-worker-module-facade.ts +19 -0
  288. package/templates/format-dev-errors.ts +34 -0
  289. package/templates/gitignore +1 -0
  290. package/templates/init-tests/test-jest-new-worker.js +23 -0
  291. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  292. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  293. package/templates/middleware/common.ts +62 -0
  294. package/templates/middleware/loader-modules.ts +84 -0
  295. package/templates/middleware/loader-sw.ts +233 -0
  296. package/templates/middleware/middleware-miniflare3-json-error.ts +32 -0
  297. package/templates/middleware/middleware-pretty-error.ts +40 -0
  298. package/templates/middleware/middleware-scheduled.ts +15 -0
  299. package/templates/new-worker-scheduled.js +3 -3
  300. package/templates/new-worker-scheduled.ts +15 -15
  301. package/templates/new-worker.js +3 -3
  302. package/templates/new-worker.ts +18 -15
  303. package/templates/no-op-worker.js +10 -0
  304. package/templates/pages-dev-pipeline.ts +31 -0
  305. package/templates/pages-dev-util.ts +52 -0
  306. package/templates/pages-shim.ts +12 -0
  307. package/templates/pages-template-plugin.ts +180 -0
  308. package/templates/pages-template-worker.ts +189 -0
  309. package/templates/serve-static-assets.ts +66 -0
  310. package/templates/service-bindings-module-facade.js +55 -0
  311. package/templates/service-bindings-sw-facade.js +42 -0
  312. package/templates/tsconfig-sanity.ts +11 -0
  313. package/templates/tsconfig.init.json +105 -0
  314. package/templates/tsconfig.json +6 -103
  315. package/templates/tsconfig.tsbuildinfo +1 -0
  316. package/wrangler-dist/cli.d.ts +1652 -0
  317. package/wrangler-dist/cli.js +137978 -110578
  318. package/wrangler-dist/wasm-sync.wasm +0 -0
  319. package/pages/functions/buildPlugin.ts +0 -105
  320. package/pages/functions/buildWorker.ts +0 -151
  321. package/pages/functions/filepath-routing.ts +0 -189
  322. package/pages/functions/identifiers.ts +0 -78
  323. package/pages/functions/routes.ts +0 -156
  324. package/pages/functions/template-plugin.ts +0 -147
  325. package/pages/functions/template-worker.ts +0 -143
  326. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  327. package/src/__tests__/helpers/mock-cfetch.ts +0 -211
  328. package/src/__tests__/pages.test.ts +0 -754
  329. package/src/dialogs.tsx +0 -135
  330. package/src/environment-variables.ts +0 -35
  331. package/src/index.tsx +0 -2864
  332. package/src/kv.ts +0 -408
  333. package/src/miniflare-cli/enum-keys.ts +0 -17
  334. package/src/pages.tsx +0 -2038
  335. package/src/publish.ts +0 -583
  336. package/src/r2.ts +0 -50
  337. package/src/sites.tsx +0 -295
  338. package/src/user.tsx +0 -1203
  339. package/src/whoami.tsx +0 -70
  340. package/templates/static-asset-facade.js +0 -47
  341. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  342. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  343. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  344. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  345. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  346. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  347. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  348. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  349. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  350. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  351. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  352. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  353. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  354. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  355. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  356. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  357. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  358. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  359. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  360. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  361. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  362. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  363. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  364. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  365. package/vendor/wrangler-mime/LICENSE +0 -21
  366. package/vendor/wrangler-mime/Mime.js +0 -97
  367. package/vendor/wrangler-mime/README.md +0 -187
  368. package/vendor/wrangler-mime/cli.js +0 -46
  369. package/vendor/wrangler-mime/index.js +0 -4
  370. package/vendor/wrangler-mime/lite.js +0 -4
  371. package/vendor/wrangler-mime/package.json +0 -52
  372. package/vendor/wrangler-mime/types/other.js +0 -1
  373. package/vendor/wrangler-mime/types/standard.js +0 -1
@@ -0,0 +1,63 @@
1
+ import { rest } from "msw";
2
+ import { endEventLoop } from "../helpers/end-event-loop";
3
+ import { mockAccountId, mockApiToken } from "./../helpers/mock-account-id";
4
+ import { mockConsoleMethods } from "./../helpers/mock-console";
5
+ import { msw } from "./../helpers/msw";
6
+ import { runInTempDir } from "./../helpers/run-in-tmp";
7
+ import { runWrangler } from "./../helpers/run-wrangler";
8
+
9
+ describe("project create", () => {
10
+ const std = mockConsoleMethods();
11
+
12
+ runInTempDir();
13
+ mockAccountId();
14
+ mockApiToken();
15
+
16
+ afterEach(async () => {
17
+ // Force a tick to ensure that all promises resolve
18
+ await endEventLoop();
19
+ // Reset MSW after tick to ensure that all requests have been handled
20
+ msw.resetHandlers();
21
+ msw.restoreHandlers();
22
+ });
23
+
24
+ it("should create a project with a production branch", async () => {
25
+ msw.use(
26
+ rest.post(
27
+ "*/accounts/:accountId/pages/projects",
28
+ async (req, res, ctx) => {
29
+ const body = await req.json();
30
+
31
+ expect(req.params.accountId).toEqual("some-account-id");
32
+ expect(body).toEqual({
33
+ name: "a-new-project",
34
+ production_branch: "main",
35
+ });
36
+
37
+ return res.once(
38
+ ctx.status(200),
39
+ ctx.json({
40
+ success: true,
41
+ errors: [],
42
+ messages: [],
43
+ result: {
44
+ name: "a-new-project",
45
+ subdomain: "a-new-project.pages.dev",
46
+ production_branch: "main",
47
+ },
48
+ })
49
+ );
50
+ }
51
+ )
52
+ );
53
+
54
+ await runWrangler(
55
+ "pages project create a-new-project --production-branch=main"
56
+ );
57
+
58
+ expect(std.out).toMatchInlineSnapshot(`
59
+ "✨ Successfully created the 'a-new-project' project. It will be available at https://a-new-project.pages.dev/ once you create your first deployment.
60
+ To deploy a folder of assets, run 'wrangler pages publish [directory]'."
61
+ `);
62
+ });
63
+ });
@@ -0,0 +1,110 @@
1
+ import { rest } from "msw";
2
+ import { endEventLoop } from "../helpers/end-event-loop";
3
+ import { mockConsoleMethods } from "../helpers/mock-console";
4
+ import { mockAccountId, mockApiToken } from "./../helpers/mock-account-id";
5
+ import { msw } from "./../helpers/msw";
6
+ import { runInTempDir } from "./../helpers/run-in-tmp";
7
+ import { runWrangler } from "./../helpers/run-wrangler";
8
+ import type { Project } from "./../../pages/types";
9
+
10
+ describe("project list", () => {
11
+ runInTempDir();
12
+ mockConsoleMethods();
13
+ mockAccountId();
14
+ mockApiToken();
15
+
16
+ afterEach(async () => {
17
+ // Force a tick to ensure that all promises resolve
18
+ await endEventLoop();
19
+ // Reset MSW after tick to ensure that all requests have been handled
20
+ msw.resetHandlers();
21
+ msw.restoreHandlers();
22
+ });
23
+
24
+ it("should make request to list projects", async () => {
25
+ const projects: Project[] = [
26
+ {
27
+ name: "dogs",
28
+ subdomain: "docs.pages.dev",
29
+ domains: ["dogs.pages.dev"],
30
+ source: {
31
+ type: "github",
32
+ },
33
+ latest_deployment: {
34
+ modified_on: "2021-11-17T14:52:26.133835Z",
35
+ },
36
+ created_on: "2021-11-17T14:52:26.133835Z",
37
+ production_branch: "main",
38
+ },
39
+ {
40
+ name: "cats",
41
+ subdomain: "cats.pages.dev",
42
+ domains: ["cats.pages.dev", "kitten.com"],
43
+ latest_deployment: {
44
+ modified_on: "2021-11-17T14:52:26.133835Z",
45
+ },
46
+ created_on: "2021-11-17T14:52:26.133835Z",
47
+ production_branch: "main",
48
+ },
49
+ ];
50
+
51
+ const requests = mockProjectListRequest(projects);
52
+ await runWrangler("pages project list");
53
+
54
+ expect(requests.count).toBe(1);
55
+ });
56
+
57
+ it("should make multiple requests for paginated results", async () => {
58
+ const projects: Project[] = [];
59
+ for (let i = 0; i < 15; i++) {
60
+ projects.push({
61
+ name: "dogs" + i,
62
+ subdomain: i + "dogs.pages.dev",
63
+ domains: [i + "dogs.pages.dev"],
64
+ source: {
65
+ type: "github",
66
+ },
67
+ latest_deployment: {
68
+ modified_on: "2021-11-17T14:52:26.133835Z",
69
+ },
70
+ created_on: "2021-11-17T14:52:26.133835Z",
71
+ production_branch: "main",
72
+ });
73
+ }
74
+ const requests = mockProjectListRequest(projects);
75
+ await runWrangler("pages project list");
76
+ expect(requests.count).toEqual(2);
77
+ });
78
+ });
79
+
80
+ /* -------------------------------------------------- */
81
+ /* Helper Functions */
82
+ /* -------------------------------------------------- */
83
+
84
+ function mockProjectListRequest(projects: unknown[]) {
85
+ const requests = { count: 0 };
86
+ msw.use(
87
+ rest.get("*/accounts/:accountId/pages/projects", async (req, res, ctx) => {
88
+ requests.count++;
89
+ const pageSize = Number(req.url.searchParams.get("per_page"));
90
+ const page = Number(req.url.searchParams.get("page"));
91
+ const expectedPageSize = 10;
92
+ const expectedPage = requests.count;
93
+ expect(req.params.accountId).toEqual("some-account-id");
94
+ expect(pageSize).toEqual(expectedPageSize);
95
+ expect(page).toEqual(expectedPage);
96
+ expect(await req.text()).toEqual("");
97
+
98
+ return res(
99
+ ctx.status(200),
100
+ ctx.json({
101
+ success: true,
102
+ errors: [],
103
+ messages: [],
104
+ result: projects.slice((page - 1) * pageSize, page * pageSize),
105
+ })
106
+ );
107
+ })
108
+ );
109
+ return requests;
110
+ }
@@ -0,0 +1,500 @@
1
+ // /* eslint-disable no-shadow */
2
+ import { mkdirSync, writeFileSync } from "node:fs";
3
+ import { rest } from "msw";
4
+ import { endEventLoop } from "../helpers/end-event-loop";
5
+ import { mockAccountId, mockApiToken } from "../helpers/mock-account-id";
6
+ import { mockConsoleMethods } from "../helpers/mock-console";
7
+ import { mockGetUploadTokenRequest } from "../helpers/mock-get-pages-upload-token";
8
+ import { mockSetTimeout } from "../helpers/mock-set-timeout";
9
+ import { msw } from "../helpers/msw";
10
+ import { runInTempDir } from "../helpers/run-in-tmp";
11
+ import { runWrangler } from "../helpers/run-wrangler";
12
+ import type { UploadPayloadFile } from "../../pages/types";
13
+ import type { RestRequest } from "msw";
14
+
15
+ describe("project upload", () => {
16
+ const ENV_COPY = process.env;
17
+ const std = mockConsoleMethods();
18
+
19
+ runInTempDir();
20
+ mockAccountId();
21
+ mockApiToken();
22
+ mockSetTimeout();
23
+
24
+ beforeEach(() => {
25
+ process.env.CI = "true";
26
+ process.env.CF_PAGES_UPLOAD_JWT = "<<funfetti-auth-jwt>>";
27
+ });
28
+
29
+ afterEach(async () => {
30
+ process.env = ENV_COPY;
31
+
32
+ // Force a tick to ensure that all promises resolve
33
+ await endEventLoop();
34
+ // Reset MSW after tick to ensure that all requests have been handled
35
+ msw.resetHandlers();
36
+ msw.restoreHandlers();
37
+ });
38
+
39
+ it("should upload a directory of files with a provided JWT", async () => {
40
+ writeFileSync("logo.png", "foobar");
41
+
42
+ msw.use(
43
+ rest.post("*/pages/assets/check-missing", async (req, res, ctx) => {
44
+ const body = (await req.json()) as {
45
+ hashes: string[];
46
+ };
47
+
48
+ expect(req.headers.get("Authorization")).toBe(
49
+ "Bearer <<funfetti-auth-jwt>>"
50
+ );
51
+ expect(body).toMatchObject({
52
+ hashes: ["2082190357cfd3617ccfe04f340c6247"],
53
+ });
54
+
55
+ return res.once(
56
+ ctx.status(200),
57
+ ctx.json({
58
+ success: true,
59
+ errors: [],
60
+ messages: [],
61
+ result: body.hashes,
62
+ })
63
+ );
64
+ }),
65
+ rest.post("*/pages/assets/upload", async (req, res, ctx) => {
66
+ expect(req.headers.get("Authorization")).toBe(
67
+ "Bearer <<funfetti-auth-jwt>>"
68
+ );
69
+
70
+ expect(await req.json()).toMatchObject([
71
+ {
72
+ base64: true,
73
+ key: "2082190357cfd3617ccfe04f340c6247",
74
+ metadata: {
75
+ contentType: "image/png",
76
+ },
77
+ value: "Zm9vYmFy",
78
+ },
79
+ ]);
80
+
81
+ return res(
82
+ ctx.status(200),
83
+ ctx.json({
84
+ success: true,
85
+ errors: [],
86
+ messages: [],
87
+ result: null,
88
+ })
89
+ );
90
+ })
91
+ );
92
+
93
+ await runWrangler("pages project upload .");
94
+
95
+ expect(normalizeProgressSteps(std.out)).toMatchInlineSnapshot(`
96
+ "✨ Success! Uploaded 1 files (TIMINGS)
97
+
98
+ ✨ Upload complete!"
99
+ `);
100
+ });
101
+
102
+ it("should avoid uploading some files", async () => {
103
+ mkdirSync("some_dir/node_modules", { recursive: true });
104
+ mkdirSync("some_dir/functions", { recursive: true });
105
+
106
+ writeFileSync("logo.png", "foobar");
107
+ writeFileSync("some_dir/functions/foo.js", "func");
108
+ writeFileSync("some_dir/_headers", "headersfile");
109
+
110
+ writeFileSync("_headers", "headersfile");
111
+ writeFileSync("_redirects", "redirectsfile");
112
+ writeFileSync("_worker.js", "workerfile");
113
+ writeFileSync("_routes.json", "routesfile");
114
+ mkdirSync(".git");
115
+ writeFileSync(".git/foo", "gitfile");
116
+ writeFileSync("some_dir/node_modules/some_package", "nodefile");
117
+ mkdirSync("functions");
118
+ writeFileSync("functions/foo.js", "func");
119
+
120
+ // Accumulate multiple requests then assert afterwards
121
+ const requests: RestRequest[] = [];
122
+ msw.use(
123
+ rest.post("*/pages/assets/check-missing", async (req, res, ctx) => {
124
+ const body = (await req.json()) as {
125
+ hashes: string[];
126
+ };
127
+
128
+ expect(req.headers.get("Authorization")).toBe(
129
+ "Bearer <<funfetti-auth-jwt>>"
130
+ );
131
+ expect(body).toMatchObject({
132
+ hashes: [
133
+ "2082190357cfd3617ccfe04f340c6247",
134
+ "95dedb64e6d4940fc2e0f11f711cc2f4",
135
+ "09a79777abda8ccc8bdd51dd3ff8e9e9",
136
+ ],
137
+ });
138
+
139
+ return res.once(
140
+ ctx.status(200),
141
+ ctx.json({
142
+ success: true,
143
+ errors: [],
144
+ messages: [],
145
+ result: body.hashes,
146
+ })
147
+ );
148
+ }),
149
+ rest.post("*/pages/assets/upload", (req, res, ctx) => {
150
+ requests.push(req);
151
+
152
+ return res(
153
+ ctx.status(200),
154
+ ctx.json({
155
+ success: true,
156
+ errors: [],
157
+ messages: [],
158
+ result: null,
159
+ })
160
+ );
161
+ })
162
+ );
163
+
164
+ await runWrangler("pages project upload .");
165
+ expect(requests.length).toBe(3);
166
+
167
+ const resolvedRequests = (
168
+ await Promise.all(
169
+ requests.map(async (req) => await req.json<UploadPayloadFile[]>())
170
+ )
171
+ ).flat();
172
+
173
+ const requestMap = resolvedRequests.reduce<{
174
+ [key: string]: UploadPayloadFile;
175
+ }>((map, req) => Object.assign(map, { [req.key]: req }), {});
176
+
177
+ for (const req of requests) {
178
+ expect(req.headers.get("Authorization")).toBe(
179
+ "Bearer <<funfetti-auth-jwt>>"
180
+ );
181
+ }
182
+
183
+ expect(Object.keys(requestMap).length).toBe(3);
184
+
185
+ expect(requestMap["95dedb64e6d4940fc2e0f11f711cc2f4"]).toMatchObject({
186
+ base64: true,
187
+ key: "95dedb64e6d4940fc2e0f11f711cc2f4",
188
+ metadata: {
189
+ contentType: "application/octet-stream",
190
+ },
191
+ value: "aGVhZGVyc2ZpbGU=",
192
+ });
193
+
194
+ expect(requestMap["2082190357cfd3617ccfe04f340c6247"]).toMatchObject({
195
+ base64: true,
196
+ key: "2082190357cfd3617ccfe04f340c6247",
197
+ metadata: {
198
+ contentType: "image/png",
199
+ },
200
+ value: "Zm9vYmFy",
201
+ });
202
+
203
+ expect(requestMap["09a79777abda8ccc8bdd51dd3ff8e9e9"]).toMatchObject({
204
+ base64: true,
205
+ key: "09a79777abda8ccc8bdd51dd3ff8e9e9",
206
+ metadata: {
207
+ contentType: "application/javascript",
208
+ },
209
+ value: "ZnVuYw==",
210
+ });
211
+
212
+ expect(normalizeProgressSteps(std.out)).toMatchInlineSnapshot(`
213
+ "✨ Success! Uploaded 3 files (TIMINGS)
214
+
215
+ ✨ Upload complete!"
216
+ `);
217
+ });
218
+
219
+ it("should retry uploads", async () => {
220
+ writeFileSync("logo.txt", "foobar");
221
+
222
+ // Accumulate multiple requests then assert afterwards
223
+ const requests: RestRequest[] = [];
224
+ msw.use(
225
+ rest.post("*/pages/assets/check-missing", async (req, res, ctx) => {
226
+ const body = (await req.json()) as { hashes: string[] };
227
+
228
+ expect(req.headers.get("Authorization")).toBe(
229
+ "Bearer <<funfetti-auth-jwt>>"
230
+ );
231
+ expect(body).toMatchObject({
232
+ hashes: ["1a98fb08af91aca4a7df1764a2c4ddb0"],
233
+ });
234
+
235
+ return res.once(
236
+ ctx.status(200),
237
+ ctx.json({
238
+ success: true,
239
+ errors: [],
240
+ messages: [],
241
+ result: body.hashes,
242
+ })
243
+ );
244
+ }),
245
+ rest.post("*/pages/assets/upload", async (req, res, ctx) => {
246
+ requests.push(req);
247
+
248
+ if (requests.length < 2) {
249
+ return res(
250
+ ctx.status(200),
251
+ ctx.json({
252
+ success: false,
253
+ errors: [
254
+ {
255
+ code: 800000,
256
+ message: "Something exploded, please retry",
257
+ },
258
+ ],
259
+ messages: [],
260
+ result: null,
261
+ })
262
+ );
263
+ } else {
264
+ return res(
265
+ ctx.status(200),
266
+ ctx.json({
267
+ success: true,
268
+ errors: [],
269
+ messages: [],
270
+ result: null,
271
+ })
272
+ );
273
+ }
274
+ })
275
+ );
276
+
277
+ await runWrangler("pages project upload .");
278
+
279
+ // Assert two identical requests
280
+ expect(requests.length).toBe(2);
281
+ for (const init of requests) {
282
+ expect(init.headers.get("Authorization")).toBe(
283
+ "Bearer <<funfetti-auth-jwt>>"
284
+ );
285
+
286
+ const body = (await init.json()) as UploadPayloadFile[];
287
+ expect(body).toMatchObject([
288
+ {
289
+ key: "1a98fb08af91aca4a7df1764a2c4ddb0",
290
+ value: Buffer.from("foobar").toString("base64"),
291
+ metadata: {
292
+ contentType: "text/plain",
293
+ },
294
+ base64: true,
295
+ },
296
+ ]);
297
+ }
298
+
299
+ expect(normalizeProgressSteps(std.out)).toMatchInlineSnapshot(`
300
+ "✨ Success! Uploaded 1 files (TIMINGS)
301
+
302
+ ✨ Upload complete!"
303
+ `);
304
+ });
305
+
306
+ it("should try to use multiple buckets (up to the max concurrency)", async () => {
307
+ writeFileSync("logo.txt", "foobar");
308
+ writeFileSync("logo.png", "foobar");
309
+ writeFileSync("logo.html", "foobar");
310
+ writeFileSync("logo.js", "foobar");
311
+
312
+ mockGetUploadTokenRequest(
313
+ "<<funfetti-auth-jwt>>",
314
+ "some-account-id",
315
+ "foo"
316
+ );
317
+
318
+ // Accumulate multiple requests then assert afterwards
319
+ const requests: RestRequest[] = [];
320
+ msw.use(
321
+ rest.post("*/pages/assets/check-missing", async (req, res, ctx) => {
322
+ const body = (await req.json()) as { hashes: string[] };
323
+
324
+ expect(req.headers.get("Authorization")).toBe(
325
+ "Bearer <<funfetti-auth-jwt>>"
326
+ );
327
+ expect(body).toMatchObject({
328
+ hashes: expect.arrayContaining([
329
+ "d96fef225537c9f5e44a3cb27fd0b492",
330
+ "2082190357cfd3617ccfe04f340c6247",
331
+ "6be321bef99e758250dac034474ddbb8",
332
+ "1a98fb08af91aca4a7df1764a2c4ddb0",
333
+ ]),
334
+ });
335
+
336
+ return res.once(
337
+ ctx.status(200),
338
+ ctx.json({
339
+ success: true,
340
+ errors: [],
341
+ messages: [],
342
+ result: body.hashes,
343
+ })
344
+ );
345
+ }),
346
+ rest.post("*/pages/assets/upload", async (req, res, ctx) => {
347
+ requests.push(req);
348
+
349
+ expect(req.headers.get("Authorization")).toBe(
350
+ "Bearer <<funfetti-auth-jwt>>"
351
+ );
352
+
353
+ return res(
354
+ ctx.status(200),
355
+ ctx.json({
356
+ success: true,
357
+ errors: [],
358
+ messages: [],
359
+ result: null,
360
+ })
361
+ );
362
+ })
363
+ );
364
+
365
+ await runWrangler("pages project upload .");
366
+
367
+ // We have 3 buckets, so expect 3 uploads
368
+ expect(requests.length).toBe(3);
369
+ const bodies: UploadPayloadFile[][] = [];
370
+ for (const init of requests) {
371
+ bodies.push((await init.json()) as UploadPayloadFile[]);
372
+ }
373
+ // One bucket should end up with 2 files
374
+ expect(bodies.map((b) => b.length).sort()).toEqual([1, 1, 2]);
375
+ // But we don't know the order, so flatten and test without ordering
376
+ expect(bodies.flatMap((b) => b)).toEqual(
377
+ expect.arrayContaining([
378
+ {
379
+ base64: true,
380
+ key: "d96fef225537c9f5e44a3cb27fd0b492",
381
+ metadata: { contentType: "text/html" },
382
+ value: "Zm9vYmFy",
383
+ },
384
+ {
385
+ base64: true,
386
+ key: "1a98fb08af91aca4a7df1764a2c4ddb0",
387
+ metadata: { contentType: "text/plain" },
388
+ value: "Zm9vYmFy",
389
+ },
390
+ {
391
+ base64: true,
392
+ key: "6be321bef99e758250dac034474ddbb8",
393
+ metadata: { contentType: "application/javascript" },
394
+ value: "Zm9vYmFy",
395
+ },
396
+ {
397
+ base64: true,
398
+ key: "2082190357cfd3617ccfe04f340c6247",
399
+ metadata: { contentType: "image/png" },
400
+ value: "Zm9vYmFy",
401
+ },
402
+ ])
403
+ );
404
+
405
+ expect(normalizeProgressSteps(std.out)).toMatchInlineSnapshot(`
406
+ "✨ Success! Uploaded 4 files (TIMINGS)
407
+
408
+ ✨ Upload complete!"
409
+ `);
410
+ });
411
+
412
+ it("should not error when directory names contain periods and houses a extensionless file", async () => {
413
+ mkdirSync(".well-known");
414
+ // Note: same content as previous test, but since it's a different extension,
415
+ // it hashes to a different value
416
+ writeFileSync(".well-known/foobar", "foobar");
417
+
418
+ mockGetUploadTokenRequest(
419
+ "<<funfetti-auth-jwt>>",
420
+ "some-account-id",
421
+ "foo"
422
+ );
423
+
424
+ msw.use(
425
+ rest.post(
426
+ "*/pages/assets/check-missing",
427
+
428
+ async (req, res, ctx) => {
429
+ const body = (await req.json()) as { hashes: string[] };
430
+
431
+ expect(req.headers.get("Authorization")).toBe(
432
+ "Bearer <<funfetti-auth-jwt>>"
433
+ );
434
+ expect(body).toMatchObject({
435
+ hashes: ["7b764dacfd211bebd8077828a7ddefd7"],
436
+ });
437
+
438
+ return res.once(
439
+ ctx.status(200),
440
+ ctx.json({
441
+ success: true,
442
+ errors: [],
443
+ messages: [],
444
+ result: body.hashes,
445
+ })
446
+ );
447
+ }
448
+ ),
449
+ rest.post("*/pages/assets/upload", async (req, res, ctx) => {
450
+ expect(req.headers.get("Authorization")).toBe(
451
+ "Bearer <<funfetti-auth-jwt>>"
452
+ );
453
+ const body = (await req.json()) as UploadPayloadFile[];
454
+ expect(body).toMatchObject([
455
+ {
456
+ key: "7b764dacfd211bebd8077828a7ddefd7",
457
+ value: Buffer.from("foobar").toString("base64"),
458
+ metadata: {
459
+ contentType: "application/octet-stream",
460
+ },
461
+ base64: true,
462
+ },
463
+ ]);
464
+
465
+ return res.once(
466
+ ctx.status(200),
467
+ ctx.json({
468
+ success: true,
469
+ errors: [],
470
+ messages: [],
471
+ result: null,
472
+ })
473
+ );
474
+ })
475
+ );
476
+
477
+ await runWrangler("pages project upload .");
478
+
479
+ expect(std.err).toMatchInlineSnapshot(`""`);
480
+ });
481
+ });
482
+
483
+ /**
484
+ * When uploading assets we print out progress messages that look like:
485
+ *
486
+ * Uploading... (1/4)
487
+ * Uploading... (2/4)
488
+ * Uploading... (4/4)
489
+ *
490
+ * Note that we don't always get a progress message for every item uploaded.
491
+ * These upload counts are not deterministic and can change from test run to test run.
492
+ *
493
+ * Also if you run the tests in --runInBand mode then we never see any of
494
+ * these progress messages in the tests!!
495
+ *
496
+ * So this helper removes these message from the snapshots to keep them consistent.
497
+ */
498
+ export function normalizeProgressSteps(str: string): string {
499
+ return str.replace(/Uploading... \(\d\/\d\)\r?\n?/g, "");
500
+ }