wrangler 0.0.0-e64812e → 0.0.0-e6c9c5c0

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 (338) hide show
  1. package/README.md +23 -3
  2. package/bin/wrangler.js +170 -62
  3. package/kv-asset-handler.js +1 -0
  4. package/miniflare-dist/index.mjs +1499 -21
  5. package/package.json +193 -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.js +64 -0
  9. package/src/__tests__/api.test.ts +80 -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 +4152 -3363
  13. package/src/__tests__/d1/d1.test.ts +127 -0
  14. package/src/__tests__/d1/splitter.test.ts +255 -0
  15. package/src/__tests__/delete.test.ts +266 -0
  16. package/src/__tests__/deployments.test.ts +105 -0
  17. package/src/__tests__/dev.test.tsx +1558 -952
  18. package/src/__tests__/generate.test.ts +238 -0
  19. package/src/__tests__/get-host-from-url.test.ts +16 -0
  20. package/src/__tests__/guess-worker-format.test.ts +68 -68
  21. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  22. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  23. package/src/__tests__/helpers/mock-auth-domain.ts +20 -0
  24. package/src/__tests__/helpers/mock-bin.ts +20 -20
  25. package/src/__tests__/helpers/mock-console.ts +58 -39
  26. package/src/__tests__/helpers/mock-dialogs.ts +88 -79
  27. package/src/__tests__/helpers/mock-get-zone-from-host.ts +11 -0
  28. package/src/__tests__/helpers/mock-http-server.ts +30 -30
  29. package/src/__tests__/helpers/mock-istty.ts +65 -18
  30. package/src/__tests__/helpers/mock-known-routes.ts +12 -0
  31. package/src/__tests__/helpers/mock-kv.ts +41 -28
  32. package/src/__tests__/helpers/mock-oauth-flow.ts +241 -233
  33. package/src/__tests__/helpers/mock-process.ts +34 -0
  34. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  35. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  36. package/src/__tests__/helpers/msw/blob-worker.cjs +19 -0
  37. package/src/__tests__/helpers/msw/handlers/access.ts +13 -0
  38. package/src/__tests__/helpers/msw/handlers/deployments.ts +69 -0
  39. package/src/__tests__/helpers/msw/handlers/namespaces.ts +81 -0
  40. package/src/__tests__/helpers/msw/handlers/oauth.ts +31 -0
  41. package/src/__tests__/helpers/msw/handlers/r2.ts +60 -0
  42. package/src/__tests__/helpers/msw/handlers/script.ts +56 -0
  43. package/src/__tests__/helpers/msw/handlers/user.ts +52 -0
  44. package/src/__tests__/helpers/msw/handlers/zones.ts +20 -0
  45. package/src/__tests__/helpers/msw/index.ts +50 -0
  46. package/src/__tests__/helpers/msw/read-file-sync.js +61 -0
  47. package/src/__tests__/helpers/run-in-tmp.ts +27 -28
  48. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  49. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
  50. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
  51. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
  52. package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
  53. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  54. package/src/__tests__/helpers/write-worker-source.ts +16 -16
  55. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  56. package/src/__tests__/https-options.test.ts +142 -109
  57. package/src/__tests__/index.test.ts +245 -233
  58. package/src/__tests__/init.test.ts +3135 -1605
  59. package/src/__tests__/jest.setup.ts +148 -50
  60. package/src/__tests__/kv.test.ts +1778 -1471
  61. package/src/__tests__/logger.test.ts +100 -74
  62. package/src/__tests__/logout.test.ts +47 -0
  63. package/src/__tests__/metrics.test.ts +493 -0
  64. package/src/__tests__/middleware.scheduled.test.ts +145 -0
  65. package/src/__tests__/middleware.test.ts +750 -0
  66. package/src/__tests__/package-manager.test.ts +303 -303
  67. package/src/__tests__/pages-deployment-tail.test.ts +955 -0
  68. package/src/__tests__/pages.test.ts +2887 -743
  69. package/src/__tests__/parse.test.ts +252 -252
  70. package/src/__tests__/paths.test.ts +39 -0
  71. package/src/__tests__/publish.test.ts +8004 -5355
  72. package/src/__tests__/pubsub.test.ts +490 -0
  73. package/src/__tests__/queues.test.ts +522 -0
  74. package/src/__tests__/r2.test.ts +364 -228
  75. package/src/__tests__/route.test.ts +18 -18
  76. package/src/__tests__/secret.test.ts +681 -469
  77. package/src/__tests__/tail.test.ts +835 -567
  78. package/src/__tests__/test-old-node-version.js +31 -0
  79. package/src/__tests__/tsconfig-sanity.ts +12 -0
  80. package/src/__tests__/tsconfig.json +8 -0
  81. package/src/__tests__/tsconfig.tsbuildinfo +1 -0
  82. package/src/__tests__/type-generation.test.ts +233 -0
  83. package/src/__tests__/user.test.ts +107 -120
  84. package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
  85. package/src/__tests__/validate-dev-props.test.ts +56 -0
  86. package/src/__tests__/version.test.ts +35 -0
  87. package/src/__tests__/whoami.test.tsx +165 -98
  88. package/src/__tests__/worker-namespace.test.ts +334 -0
  89. package/src/abort.d.ts +1 -1
  90. package/src/api/dev.ts +259 -0
  91. package/src/api/index.ts +3 -0
  92. package/src/api/pages/index.ts +5 -0
  93. package/src/api/pages/publish.tsx +321 -0
  94. package/src/bundle-reporter.ts +68 -0
  95. package/src/bundle.ts +838 -163
  96. package/src/cfetch/index.ts +120 -83
  97. package/src/cfetch/internal.ts +210 -97
  98. package/src/cli.ts +23 -8
  99. package/src/config/config.ts +236 -195
  100. package/src/config/diagnostics.ts +61 -61
  101. package/src/config/environment.ts +516 -357
  102. package/src/config/index.ts +326 -193
  103. package/src/config/validation-helpers.ts +379 -357
  104. package/src/config/validation.ts +1979 -1367
  105. package/src/config-cache.ts +81 -41
  106. package/src/create-worker-preview.ts +239 -142
  107. package/src/create-worker-upload-form.ts +309 -238
  108. package/src/d1/backups.tsx +219 -0
  109. package/src/d1/constants.ts +2 -0
  110. package/src/d1/create.tsx +63 -0
  111. package/src/d1/delete.ts +56 -0
  112. package/src/d1/execute.tsx +323 -0
  113. package/src/d1/formatTimeAgo.ts +14 -0
  114. package/src/d1/index.ts +101 -0
  115. package/src/d1/list.tsx +48 -0
  116. package/src/d1/migrations/apply.tsx +197 -0
  117. package/src/d1/migrations/create.tsx +77 -0
  118. package/src/d1/migrations/helpers.ts +147 -0
  119. package/src/d1/migrations/index.ts +3 -0
  120. package/src/d1/migrations/list.tsx +79 -0
  121. package/src/d1/migrations/options.ts +18 -0
  122. package/src/d1/options.ts +22 -0
  123. package/src/d1/splitter.ts +161 -0
  124. package/src/d1/types.ts +24 -0
  125. package/src/d1/utils.ts +48 -0
  126. package/src/delete.ts +103 -0
  127. package/src/deployments.ts +93 -0
  128. package/src/deprecated/index.ts +145 -0
  129. package/src/dev/dev-vars.ts +20 -17
  130. package/src/dev/dev.tsx +547 -352
  131. package/src/dev/get-local-persistence-path.ts +31 -0
  132. package/src/dev/local.tsx +903 -298
  133. package/src/dev/remote.tsx +620 -215
  134. package/src/dev/start-server.ts +538 -0
  135. package/src/dev/use-esbuild.ts +184 -97
  136. package/src/dev/validate-dev-props.ts +31 -0
  137. package/src/dev-registry.ts +201 -0
  138. package/src/dev.tsx +949 -0
  139. package/src/dialogs.ts +136 -0
  140. package/src/dispatch-namespace.ts +207 -0
  141. package/src/docs/index.ts +98 -0
  142. package/src/durable.ts +87 -87
  143. package/src/entry.ts +236 -230
  144. package/src/environment-variables/factory.ts +88 -0
  145. package/src/environment-variables/misc-variables.ts +30 -0
  146. package/src/errors.ts +6 -6
  147. package/src/generate/index.ts +300 -0
  148. package/src/git-client.ts +135 -0
  149. package/src/global-wrangler-config-path.ts +26 -0
  150. package/src/https-options.ts +84 -80
  151. package/src/index.ts +694 -0
  152. package/src/init.ts +1024 -0
  153. package/src/inspect.ts +698 -593
  154. package/src/intl-polyfill.d.ts +123 -123
  155. package/src/is-ci.ts +14 -0
  156. package/src/is-interactive.ts +16 -0
  157. package/src/jest.d.ts +4 -0
  158. package/src/kv/helpers.ts +430 -0
  159. package/src/kv/index.ts +596 -0
  160. package/src/logger.ts +80 -42
  161. package/src/metrics/index.ts +5 -0
  162. package/src/metrics/metrics-config.ts +239 -0
  163. package/src/metrics/metrics-dispatcher.ts +96 -0
  164. package/src/metrics/metrics-usage-headers.ts +24 -0
  165. package/src/metrics/send-event.ts +98 -0
  166. package/src/miniflare-cli/assets.ts +250 -0
  167. package/src/miniflare-cli/index.ts +202 -33
  168. package/src/miniflare-cli/request-context.ts +18 -18
  169. package/src/miniflare-cli/tsconfig.json +9 -0
  170. package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -0
  171. package/src/miniflare-cli/types.ts +11 -0
  172. package/src/module-collection.ts +221 -212
  173. package/src/open-in-browser.ts +4 -6
  174. package/src/package-manager.ts +173 -128
  175. package/src/pages/build.ts +150 -0
  176. package/src/pages/buildFunctions.ts +129 -0
  177. package/src/pages/constants.ts +18 -0
  178. package/src/pages/deployment-tails.ts +284 -0
  179. package/src/pages/deployments.tsx +84 -0
  180. package/src/pages/dev.ts +716 -0
  181. package/src/pages/errors.ts +66 -0
  182. package/src/pages/functions/buildPlugin.ts +90 -0
  183. package/src/pages/functions/buildWorker.ts +288 -0
  184. package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
  185. package/src/pages/functions/filepath-routing.ts +189 -0
  186. package/src/pages/functions/identifiers.ts +78 -0
  187. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  188. package/src/pages/functions/routes-consolidation.ts +73 -0
  189. package/src/pages/functions/routes-transformation.test.ts +282 -0
  190. package/src/pages/functions/routes-transformation.ts +115 -0
  191. package/src/pages/functions/routes-validation.test.ts +403 -0
  192. package/src/pages/functions/routes-validation.ts +202 -0
  193. package/src/pages/functions/routes.ts +151 -0
  194. package/src/pages/functions/tsconfig.json +8 -0
  195. package/src/pages/functions/tsconfig.tsbuildinfo +1 -0
  196. package/src/pages/functions.ts +82 -0
  197. package/src/pages/hash.ts +13 -0
  198. package/src/pages/index.ts +102 -0
  199. package/src/pages/projects.tsx +167 -0
  200. package/src/pages/prompt-select-project.tsx +31 -0
  201. package/src/pages/publish.tsx +263 -0
  202. package/src/pages/types.ts +41 -0
  203. package/src/pages/upload.tsx +447 -0
  204. package/src/pages/utils.ts +23 -0
  205. package/src/parse.ts +209 -125
  206. package/src/paths.ts +53 -8
  207. package/src/proxy.ts +623 -394
  208. package/src/publish/index.ts +270 -0
  209. package/src/publish/publish.ts +1064 -0
  210. package/src/pubsub/index.ts +286 -0
  211. package/src/pubsub/pubsub-commands.ts +624 -0
  212. package/src/queues/cli/commands/consumer/add.ts +71 -0
  213. package/src/queues/cli/commands/consumer/index.ts +22 -0
  214. package/src/queues/cli/commands/consumer/remove.ts +38 -0
  215. package/src/queues/cli/commands/create.ts +25 -0
  216. package/src/queues/cli/commands/delete.ts +26 -0
  217. package/src/queues/cli/commands/index.ts +36 -0
  218. package/src/queues/cli/commands/list.ts +25 -0
  219. package/src/queues/client.ts +135 -0
  220. package/src/queues/utils.ts +18 -0
  221. package/src/r2/constants.ts +4 -0
  222. package/src/r2/helpers.ts +131 -0
  223. package/src/r2/index.ts +289 -0
  224. package/src/routes.ts +140 -0
  225. package/src/secret/index.ts +379 -0
  226. package/src/selfsigned.d.ts +23 -23
  227. package/src/sites.ts +372 -0
  228. package/src/tail/createTail.ts +406 -0
  229. package/src/tail/filters.ts +108 -110
  230. package/src/tail/index.ts +210 -296
  231. package/src/tail/printing.ts +101 -46
  232. package/src/tsconfig-sanity.ts +16 -0
  233. package/src/type-generation.ts +181 -0
  234. package/src/update-check.ts +11 -11
  235. package/src/user/access.ts +68 -0
  236. package/src/user/auth-variables.ts +113 -0
  237. package/src/user/choose-account.tsx +39 -0
  238. package/src/user/generate-auth-url.ts +33 -0
  239. package/src/user/generate-random-state.ts +16 -0
  240. package/src/user/index.ts +2 -0
  241. package/src/user/user.ts +1232 -0
  242. package/src/utils/collectKeyValues.ts +14 -0
  243. package/src/whoami.ts +135 -0
  244. package/src/worker.ts +177 -106
  245. package/src/yargs-types.ts +24 -0
  246. package/src/zones.ts +191 -0
  247. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  248. package/templates/__tests__/tsconfig-sanity.ts +12 -0
  249. package/templates/__tests__/tsconfig.json +8 -0
  250. package/templates/__tests__/tsconfig.tsbuildinfo +1 -0
  251. package/templates/checked-fetch.js +15 -0
  252. package/templates/d1-beta-facade.js +241 -0
  253. package/templates/facade.d.ts +14 -0
  254. package/templates/first-party-worker-module-facade.ts +19 -0
  255. package/templates/format-dev-errors.ts +33 -0
  256. package/templates/init-tests/test-jest-new-worker.js +23 -0
  257. package/templates/init-tests/test-vitest-new-worker.js +24 -0
  258. package/templates/init-tests/test-vitest-new-worker.ts +25 -0
  259. package/templates/middleware/common.ts +62 -0
  260. package/templates/middleware/loader-modules.ts +84 -0
  261. package/templates/middleware/loader-sw.ts +233 -0
  262. package/templates/middleware/middleware-miniflare3-json-error.ts +20 -0
  263. package/templates/middleware/middleware-pretty-error.ts +40 -0
  264. package/templates/middleware/middleware-scheduled.ts +15 -0
  265. package/templates/new-worker-scheduled.js +3 -3
  266. package/templates/new-worker-scheduled.ts +15 -15
  267. package/templates/new-worker.js +3 -3
  268. package/templates/new-worker.ts +15 -15
  269. package/templates/no-op-worker.js +10 -0
  270. package/templates/pages-dev-pipeline.ts +31 -0
  271. package/templates/pages-dev-util.ts +52 -0
  272. package/templates/pages-shim.ts +12 -0
  273. package/templates/pages-template-plugin.ts +176 -0
  274. package/templates/pages-template-worker.ts +189 -0
  275. package/templates/serve-static-assets.ts +65 -0
  276. package/templates/service-bindings-module-facade.js +54 -0
  277. package/templates/service-bindings-sw-facade.js +42 -0
  278. package/templates/tsconfig-sanity.ts +11 -0
  279. package/templates/tsconfig.init.json +106 -0
  280. package/templates/tsconfig.json +6 -103
  281. package/templates/tsconfig.tsbuildinfo +1 -0
  282. package/wrangler-dist/cli.d.ts +1028 -0
  283. package/wrangler-dist/cli.js +129259 -110922
  284. package/wrangler-dist/wasm-sync.wasm +0 -0
  285. package/pages/functions/buildPlugin.ts +0 -105
  286. package/pages/functions/buildWorker.ts +0 -151
  287. package/pages/functions/filepath-routing.ts +0 -189
  288. package/pages/functions/identifiers.ts +0 -78
  289. package/pages/functions/routes.ts +0 -156
  290. package/pages/functions/template-plugin.ts +0 -147
  291. package/pages/functions/template-worker.ts +0 -143
  292. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  293. package/src/__tests__/helpers/mock-cfetch.ts +0 -211
  294. package/src/dialogs.tsx +0 -135
  295. package/src/environment-variables.ts +0 -35
  296. package/src/index.tsx +0 -2864
  297. package/src/kv.ts +0 -408
  298. package/src/miniflare-cli/enum-keys.ts +0 -17
  299. package/src/pages.tsx +0 -2038
  300. package/src/publish.ts +0 -583
  301. package/src/r2.ts +0 -50
  302. package/src/sites.tsx +0 -295
  303. package/src/user.tsx +0 -1203
  304. package/src/whoami.tsx +0 -70
  305. package/templates/static-asset-facade.js +0 -47
  306. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  307. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  308. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  309. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  310. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  311. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  312. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  313. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  314. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  315. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  316. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  317. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  318. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  319. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  320. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  321. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  322. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  323. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  324. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  325. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  326. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  327. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  328. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  329. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  330. package/vendor/wrangler-mime/LICENSE +0 -21
  331. package/vendor/wrangler-mime/Mime.js +0 -97
  332. package/vendor/wrangler-mime/README.md +0 -187
  333. package/vendor/wrangler-mime/cli.js +0 -46
  334. package/vendor/wrangler-mime/index.js +0 -4
  335. package/vendor/wrangler-mime/lite.js +0 -4
  336. package/vendor/wrangler-mime/package.json +0 -52
  337. package/vendor/wrangler-mime/types/other.js +0 -1
  338. package/vendor/wrangler-mime/types/standard.js +0 -1
package/src/api/dev.ts ADDED
@@ -0,0 +1,259 @@
1
+ import { fetch, Request } from "undici";
2
+ import { startApiDev, startDev } from "../dev";
3
+ import { logger } from "../logger";
4
+
5
+ import type { Environment } from "../config";
6
+ import type { EnablePagesAssetsServiceBindingOptions } from "../miniflare-cli/types";
7
+ import type { RequestInit, Response, RequestInfo } from "undici";
8
+
9
+ export interface UnstableDevOptions {
10
+ config?: string; // Path to .toml configuration file, relative to cwd
11
+ env?: string; // Environment to use for operations and .env files
12
+ ip?: string; // IP address to listen on
13
+ port?: number; // Port to listen on
14
+ bundle?: boolean; // Set to false to skip internal build steps and directly publish script
15
+ inspectorPort?: number; // Port for devtools to connect to
16
+ localProtocol?: "http" | "https"; // Protocol to listen to requests on, defaults to http.
17
+ assets?: string; // Static assets to be served
18
+ site?: string; // Root folder of static assets for Workers Sites
19
+ siteInclude?: string[]; // Array of .gitignore-style patterns that match file or directory names from the sites directory. Only matched items will be uploaded.
20
+ siteExclude?: string[]; // Array of .gitignore-style patterns that match file or directory names from the sites directory. Matched items will not be uploaded.
21
+ nodeCompat?: boolean; // Enable node.js compatibility
22
+ compatibilityDate?: string; // Date to use for compatibility checks
23
+ compatibilityFlags?: string[]; // Flags to use for compatibility checks
24
+ persist?: boolean; // Enable persistence for local mode, using default path: .wrangler/state
25
+ persistTo?: string; // Specify directory to use for local persistence (implies --persist)
26
+ vars?: {
27
+ [key: string]: unknown;
28
+ };
29
+ kv?: {
30
+ binding: string;
31
+ id: string;
32
+ preview_id?: string;
33
+ }[];
34
+ durableObjects?: {
35
+ name: string;
36
+ class_name: string;
37
+ script_name?: string | undefined;
38
+ environment?: string | undefined;
39
+ }[];
40
+ r2?: {
41
+ binding: string;
42
+ bucket_name: string;
43
+ preview_bucket_name?: string;
44
+ }[];
45
+ logLevel?: "none" | "info" | "error" | "log" | "warn" | "debug"; // Specify logging level [choices: "debug", "info", "log", "warn", "error", "none"] [default: "log"]
46
+ logPrefix?: string;
47
+ inspect?: boolean;
48
+ local?: boolean;
49
+ accountId?: string;
50
+ experimental?: {
51
+ d1Databases?: Environment["d1_databases"];
52
+ disableExperimentalWarning?: boolean; // Disables wrangler's warning when unstable APIs are used.
53
+ disableDevRegistry?: boolean; // Disables wrangler's support multi-worker setups. May reduce flakiness when used in tests in CI.
54
+ enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
55
+ experimentalLocal?: boolean; // Use Miniflare 3 instead of Miniflare 2
56
+ experimentalLocalRemoteKv?: boolean;
57
+ forceLocal?: boolean;
58
+ liveReload?: boolean; // Auto reload HTML pages when change is detected in local mode
59
+ showInteractiveDevSession?: boolean;
60
+ testMode?: boolean; // This option shouldn't be used - We plan on removing it eventually
61
+ testScheduled?: boolean; // Test scheduled events by visiting /__scheduled in browser
62
+ watch?: boolean; // unstable_dev doesn't support watch-mode yet in testMode
63
+ };
64
+ }
65
+
66
+ export interface UnstableDevWorker {
67
+ port: number;
68
+ address: string;
69
+ stop: () => Promise<void>;
70
+ fetch: (input?: RequestInfo, init?: RequestInit) => Promise<Response>;
71
+ waitUntilExit: () => Promise<void>;
72
+ }
73
+ /**
74
+ * unstable_dev starts a wrangler dev server, and returns a promise that resolves with utility functions to interact with it.
75
+ */
76
+ export async function unstable_dev(
77
+ script: string,
78
+ options?: UnstableDevOptions,
79
+ apiOptions?: unknown
80
+ ): Promise<UnstableDevWorker> {
81
+ // Note that not every experimental option is passed directly through to the underlying dev API - experimental options can be used here in unstable_dev. Otherwise we could just pass experimental down to dev blindly.
82
+
83
+ const experimentalOptions = {
84
+ // Defaults for "experimental" options
85
+ disableDevRegistry: false,
86
+ disableExperimentalWarning: false,
87
+ showInteractiveDevSession: false,
88
+ testMode: true,
89
+ // Override all options, including overwriting with "undefined"
90
+ ...options?.experimental,
91
+ };
92
+
93
+ const {
94
+ // there are two types of "experimental" options:
95
+ // 1. options to unstable_dev that we're still testing or are unsure of
96
+ disableDevRegistry,
97
+ disableExperimentalWarning,
98
+ forceLocal,
99
+ liveReload,
100
+ showInteractiveDevSession,
101
+ testMode,
102
+ testScheduled,
103
+ watch,
104
+ // 2. options for alpha/beta products/libs
105
+ d1Databases,
106
+ experimentalLocal,
107
+ experimentalLocalRemoteKv,
108
+ enablePagesAssetsServiceBinding,
109
+ } = experimentalOptions;
110
+
111
+ if (apiOptions) {
112
+ logger.error(
113
+ "unstable_dev's third argument (apiOptions) has been deprecated in favor of an `experimental` property within the second argument (options).\nPlease update your code from:\n`await unstable_dev('...', {...}, {...});`\nto:\n`await unstable_dev('...', {..., experimental: {...}});`"
114
+ );
115
+ }
116
+
117
+ if (!disableExperimentalWarning) {
118
+ logger.warn(
119
+ `unstable_dev() is experimental\nunstable_dev()'s behaviour will likely change in future releases`
120
+ );
121
+ }
122
+ let readyPort: number;
123
+ let readyAddress: string;
124
+ //due to Pages adoption of unstable_dev, we can't *just* disable rebuilds and watching. instead, we'll have two versions of startDev, which will converge.
125
+ if (testMode) {
126
+ //in testMode, we can run multiple wranglers in parallel, but rebuilds might not work out of the box
127
+ return new Promise<UnstableDevWorker>((resolve) => {
128
+ //lmao
129
+ return new Promise<Awaited<ReturnType<typeof startApiDev>>>((ready) => {
130
+ // once the devServer is ready for requests, we resolve the inner promise
131
+ // (where we've named the resolve function "ready")
132
+ const devServer = startApiDev({
133
+ script: script,
134
+ inspect: false,
135
+ logLevel: "none",
136
+ _: [],
137
+ $0: "",
138
+ port: options?.port ?? 0,
139
+ local: true,
140
+ d1Databases,
141
+ disableDevRegistry,
142
+ testScheduled,
143
+ experimentalLocal,
144
+ experimentalLocalRemoteKv,
145
+ enablePagesAssetsServiceBinding,
146
+ liveReload,
147
+ showInteractiveDevSession,
148
+ forceLocal,
149
+ watch,
150
+ ...options,
151
+ onReady: (address, port) => {
152
+ readyPort = port;
153
+ readyAddress = address;
154
+ ready(devServer);
155
+ },
156
+ });
157
+ }).then((devServer) => {
158
+ // now that the inner promise has resolved, we can resolve the outer promise
159
+ // with an object that lets you fetch and stop the dev server
160
+ resolve({
161
+ port: readyPort,
162
+ address: readyAddress,
163
+ stop: devServer.stop,
164
+ fetch: async (input?: RequestInfo, init?: RequestInit) => {
165
+ return await fetch(
166
+ ...parseRequestInput(
167
+ readyAddress,
168
+ readyPort,
169
+ input,
170
+ init,
171
+ options?.localProtocol
172
+ )
173
+ );
174
+ },
175
+ //no-op, does nothing in tests
176
+ waitUntilExit: async () => {
177
+ return;
178
+ },
179
+ });
180
+ });
181
+ });
182
+ } else {
183
+ //outside of test mode, rebuilds work fine, but only one instance of wrangler will work at a time
184
+
185
+ return new Promise<UnstableDevWorker>((resolve) => {
186
+ //lmao
187
+ return new Promise<Awaited<ReturnType<typeof startDev>>>((ready) => {
188
+ const devServer = startDev({
189
+ script: script,
190
+ inspect: false,
191
+ _: [],
192
+ $0: "",
193
+ local: true,
194
+ showInteractiveDevSession,
195
+ d1Databases,
196
+ disableDevRegistry,
197
+ testScheduled,
198
+ experimentalLocal,
199
+ experimentalLocalRemoteKv,
200
+ enablePagesAssetsServiceBinding,
201
+ liveReload,
202
+ watch,
203
+ ...options,
204
+ onReady: (address, port) => {
205
+ readyPort = port;
206
+ readyAddress = address;
207
+ ready(devServer);
208
+ },
209
+ });
210
+ }).then((devServer) => {
211
+ resolve({
212
+ port: readyPort,
213
+ address: readyAddress,
214
+ stop: devServer.stop,
215
+ fetch: async (input?: RequestInfo, init?: RequestInit) => {
216
+ return await fetch(
217
+ ...parseRequestInput(
218
+ readyAddress,
219
+ readyPort,
220
+ input,
221
+ init,
222
+ options?.localProtocol
223
+ )
224
+ );
225
+ },
226
+ waitUntilExit: devServer.devReactElement.waitUntilExit,
227
+ });
228
+ });
229
+ });
230
+ }
231
+ }
232
+
233
+ export function parseRequestInput(
234
+ readyAddress: string,
235
+ readyPort: number,
236
+ input?: RequestInfo,
237
+ init?: RequestInit,
238
+ protocol: "http" | "https" = "http"
239
+ ): [RequestInfo, RequestInit | undefined] {
240
+ if (input instanceof Request) {
241
+ return [input, undefined];
242
+ } else if (input instanceof URL) {
243
+ input = `${protocol}://${readyAddress}:${readyPort}${input.pathname}`;
244
+ } else if (typeof input === "string") {
245
+ try {
246
+ // Want to strip the URL to only get the pathname, but the user could pass in only the pathname
247
+ // Will error if we try and pass "/something" into new URL("/something")
248
+ input = `${protocol}://${readyAddress}:${readyPort}${
249
+ new URL(input).pathname
250
+ }`;
251
+ } catch {
252
+ input = `${protocol}://${readyAddress}:${readyPort}${input}`;
253
+ }
254
+ } else {
255
+ input = `${protocol}://${readyAddress}:${readyPort}`;
256
+ }
257
+
258
+ return [input, init];
259
+ }
@@ -0,0 +1,3 @@
1
+ export { unstable_dev } from "./dev";
2
+ export type { UnstableDevWorker, UnstableDevOptions } from "./dev";
3
+ export { unstable_pages } from "./pages";
@@ -0,0 +1,5 @@
1
+ import { publish } from "./publish";
2
+
3
+ export const unstable_pages = {
4
+ publish,
5
+ };
@@ -0,0 +1,321 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join, resolve as resolvePath } from "node:path";
4
+ import { cwd } from "node:process";
5
+ import { File, FormData } from "undici";
6
+ import { fetchResult } from "../../cfetch";
7
+ import { FatalError } from "../../errors";
8
+ import { logger } from "../../logger";
9
+ import { buildFunctions } from "../../pages/buildFunctions";
10
+ import {
11
+ FunctionsNoRoutesError,
12
+ getFunctionsNoRoutesWarning,
13
+ } from "../../pages/errors";
14
+ import {
15
+ buildRawWorker,
16
+ checkRawWorker,
17
+ } from "../../pages/functions/buildWorker";
18
+ import { validateRoutes } from "../../pages/functions/routes-validation";
19
+ import { upload } from "../../pages/upload";
20
+ import type { Project, Deployment } from "@cloudflare/types";
21
+
22
+ interface PagesPublishOptions {
23
+ /**
24
+ * Path to static assets to publish to Pages
25
+ */
26
+ directory: string;
27
+ /**
28
+ * The Cloudflare Account ID that owns the project that's
29
+ * being published
30
+ */
31
+ accountId: string;
32
+ /**
33
+ * The name of the project to be published
34
+ */
35
+ projectName: string;
36
+ /**
37
+ * Branch name to use. Defaults to production branch
38
+ */
39
+ branch?: string;
40
+ /**
41
+ * Whether or not to skip local file upload result caching
42
+ */
43
+ skipCaching?: boolean;
44
+ /**
45
+ * Commit message associated to deployment
46
+ */
47
+ commitMessage?: string;
48
+ /**
49
+ * Commit hash associated to deployment
50
+ */
51
+ commitHash?: string;
52
+ /**
53
+ * Whether or not the deployment should be considered to be
54
+ * in a dirty commit state
55
+ */
56
+ commitDirty?: boolean;
57
+ /**
58
+ * Path to the project's functions directory. Default uses
59
+ * the current working directory + /functions since this is
60
+ * typically called in a CLI
61
+ */
62
+ functionsDirectory?: string;
63
+
64
+ /**
65
+ * Whether to run bundling on `_worker.js` before deploying.
66
+ * Default: false
67
+ */
68
+ bundle?: boolean;
69
+
70
+ // TODO: Allow passing in the API key and plumb it through
71
+ // to the API calls so that the publish function does not
72
+ // rely on the `CLOUDFLARE_API_KEY` environment variable
73
+ }
74
+
75
+ /**
76
+ * Publish a directory to an account/project.
77
+ * NOTE: You will need the `CLOUDFLARE_API_KEY` environment
78
+ * variable set
79
+ */
80
+ export async function publish({
81
+ directory,
82
+ accountId,
83
+ projectName,
84
+ branch,
85
+ skipCaching,
86
+ commitMessage,
87
+ commitHash,
88
+ commitDirty,
89
+ functionsDirectory: customFunctionsDirectory,
90
+ bundle,
91
+ }: PagesPublishOptions) {
92
+ let _headers: string | undefined,
93
+ _redirects: string | undefined,
94
+ _routesGenerated: string | undefined,
95
+ _routesCustom: string | undefined,
96
+ _workerJS: string | undefined;
97
+
98
+ const workerScriptPath = resolvePath(directory, "_worker.js");
99
+
100
+ try {
101
+ _headers = readFileSync(join(directory, "_headers"), "utf-8");
102
+ } catch {}
103
+
104
+ try {
105
+ _redirects = readFileSync(join(directory, "_redirects"), "utf-8");
106
+ } catch {}
107
+
108
+ try {
109
+ /**
110
+ * Developers can specify a custom _routes.json file, for projects with Pages
111
+ * Functions or projects in Advanced Mode
112
+ */
113
+ _routesCustom = readFileSync(join(directory, "_routes.json"), "utf-8");
114
+ } catch {}
115
+
116
+ try {
117
+ _workerJS = readFileSync(workerScriptPath, "utf-8");
118
+ } catch {}
119
+
120
+ // Grab the bindings from the API, we need these for shims and other such hacky inserts
121
+ const project = await fetchResult<Project>(
122
+ `/accounts/${accountId}/pages/projects/${projectName}`
123
+ );
124
+ let isProduction = true;
125
+ if (branch) {
126
+ isProduction = project.production_branch === branch;
127
+ }
128
+
129
+ /**
130
+ * Evaluate if this is an Advanced Mode or Pages Functions project. If Advanced Mode, we'll
131
+ * go ahead and upload `_worker.js` as is, but if Pages Functions, we need to attempt to build
132
+ * Functions first and exit if it failed
133
+ */
134
+ let builtFunctions: string | undefined = undefined;
135
+ const functionsDirectory =
136
+ customFunctionsDirectory || join(cwd(), "functions");
137
+ const routesOutputPath = !existsSync(join(directory, "_routes.json"))
138
+ ? join(tmpdir(), `_routes-${Math.random()}.json`)
139
+ : undefined;
140
+
141
+ // Routing configuration displayed in the Functions tab of a deployment in Dash
142
+ let filepathRoutingConfig: string | undefined;
143
+
144
+ if (!_workerJS && existsSync(functionsDirectory)) {
145
+ const outfile = join(tmpdir(), `./functionsWorker-${Math.random()}.js`);
146
+ const outputConfigPath = join(
147
+ tmpdir(),
148
+ `functions-filepath-routing-config-${Math.random()}.json`
149
+ );
150
+
151
+ try {
152
+ await buildFunctions({
153
+ outfile,
154
+ outputConfigPath,
155
+ functionsDirectory,
156
+ onEnd: () => {},
157
+ buildOutputDirectory: dirname(outfile),
158
+ routesOutputPath,
159
+ local: false,
160
+ d1Databases: Object.keys(
161
+ project.deployment_configs[isProduction ? "production" : "preview"]
162
+ .d1_databases ?? {}
163
+ ),
164
+ });
165
+
166
+ builtFunctions = readFileSync(outfile, "utf-8");
167
+ filepathRoutingConfig = readFileSync(outputConfigPath, "utf-8");
168
+ } catch (e) {
169
+ if (e instanceof FunctionsNoRoutesError) {
170
+ logger.warn(
171
+ getFunctionsNoRoutesWarning(functionsDirectory, "skipping")
172
+ );
173
+ } else {
174
+ throw e;
175
+ }
176
+ }
177
+ }
178
+
179
+ const manifest = await upload({
180
+ directory,
181
+ accountId,
182
+ projectName,
183
+ skipCaching: skipCaching ?? false,
184
+ });
185
+
186
+ const formData = new FormData();
187
+
188
+ formData.append("manifest", JSON.stringify(manifest));
189
+
190
+ if (branch) {
191
+ formData.append("branch", branch);
192
+ }
193
+
194
+ if (commitMessage) {
195
+ formData.append("commit_message", commitMessage);
196
+ }
197
+
198
+ if (commitHash) {
199
+ formData.append("commit_hash", commitHash);
200
+ }
201
+
202
+ if (commitDirty !== undefined) {
203
+ formData.append("commit_dirty", commitDirty);
204
+ }
205
+
206
+ if (_headers) {
207
+ formData.append("_headers", new File([_headers], "_headers"));
208
+ logger.log(`✨ Uploading _headers`);
209
+ }
210
+
211
+ if (_redirects) {
212
+ formData.append("_redirects", new File([_redirects], "_redirects"));
213
+ logger.log(`✨ Uploading _redirects`);
214
+ }
215
+
216
+ if (filepathRoutingConfig) {
217
+ formData.append(
218
+ "functions-filepath-routing-config.json",
219
+ new File(
220
+ [filepathRoutingConfig],
221
+ "functions-filepath-routing-config.json"
222
+ )
223
+ );
224
+ }
225
+
226
+ /**
227
+ * Advanced Mode
228
+ * https://developers.cloudflare.com/pages/platform/functions/#advanced-mode
229
+ *
230
+ * When using a _worker.js file, the entire /functions directory is ignored
231
+ * – this includes its routing and middleware characteristics.
232
+ */
233
+ if (_workerJS) {
234
+ let workerFileContents = _workerJS;
235
+ if (bundle) {
236
+ const outfile = join(tmpdir(), `./bundledWorker-${Math.random()}.mjs`);
237
+ await buildRawWorker({
238
+ workerScriptPath,
239
+ outfile,
240
+ directory: directory ?? ".",
241
+ local: false,
242
+ sourcemap: true,
243
+ watch: false,
244
+ onEnd: () => {},
245
+ });
246
+ workerFileContents = readFileSync(outfile, "utf8");
247
+ } else {
248
+ await checkRawWorker(workerScriptPath, () => {});
249
+ }
250
+
251
+ formData.append("_worker.js", new File([workerFileContents], "_worker.js"));
252
+ logger.log(`✨ Uploading _worker.js`);
253
+
254
+ if (_routesCustom) {
255
+ // user provided a custom _routes.json file
256
+ try {
257
+ const routesCustomJSON = JSON.parse(_routesCustom);
258
+ validateRoutes(routesCustomJSON, join(directory, "_routes.json"));
259
+
260
+ formData.append(
261
+ "_routes.json",
262
+ new File([_routesCustom], "_routes.json")
263
+ );
264
+ logger.log(`✨ Uploading _routes.json`);
265
+ } catch (err) {
266
+ if (err instanceof FatalError) {
267
+ throw err;
268
+ }
269
+ }
270
+ }
271
+ }
272
+
273
+ /**
274
+ * Pages Functions
275
+ * https://developers.cloudflare.com/pages/platform/functions/
276
+ */
277
+ if (builtFunctions && !_workerJS) {
278
+ // if Functions were build successfully, proceed to uploading the build file
279
+ formData.append("_worker.js", new File([builtFunctions], "_worker.js"));
280
+ logger.log(`✨ Uploading Functions`);
281
+
282
+ if (_routesCustom) {
283
+ // user provided a custom _routes.json file
284
+ try {
285
+ const routesCustomJSON = JSON.parse(_routesCustom);
286
+ validateRoutes(routesCustomJSON, join(directory, "_routes.json"));
287
+
288
+ formData.append(
289
+ "_routes.json",
290
+ new File([_routesCustom], "_routes.json")
291
+ );
292
+ logger.log(`✨ Uploading _routes.json`);
293
+ } catch (err) {
294
+ if (err instanceof FatalError) {
295
+ throw err;
296
+ }
297
+ }
298
+ } else if (routesOutputPath) {
299
+ // no custom _routes.json file found, so fallback to the generated one
300
+ try {
301
+ _routesGenerated = readFileSync(routesOutputPath, "utf-8");
302
+
303
+ if (_routesGenerated) {
304
+ formData.append(
305
+ "_routes.json",
306
+ new File([_routesGenerated], "_routes.json")
307
+ );
308
+ }
309
+ } catch {}
310
+ }
311
+ }
312
+
313
+ const deploymentResponse = await fetchResult<Deployment>(
314
+ `/accounts/${accountId}/pages/projects/${projectName}/deployments`,
315
+ {
316
+ method: "POST",
317
+ body: formData,
318
+ }
319
+ );
320
+ return deploymentResponse;
321
+ }
@@ -0,0 +1,68 @@
1
+ import { Blob } from "node:buffer";
2
+ import { gzipSync } from "node:zlib";
3
+ import { logger } from "./logger";
4
+ import type { CfModule } from "./worker";
5
+ import type { Metafile } from "esbuild";
6
+
7
+ const ONE_KIB_BYTES = 1024;
8
+ const ONE_MIB_BYTES = ONE_KIB_BYTES * 1024;
9
+
10
+ async function getSize(modules: CfModule[]) {
11
+ const gzipSize = gzipSync(
12
+ await new Blob(modules.map((file) => file.content)).arrayBuffer()
13
+ ).byteLength;
14
+ const aggregateSize = new Blob(modules.map((file) => file.content)).size;
15
+
16
+ return { size: aggregateSize, gzipSize };
17
+ }
18
+
19
+ export async function printBundleSize(
20
+ main: {
21
+ name: string;
22
+ content: string;
23
+ },
24
+ modules: CfModule[]
25
+ ) {
26
+ const { size, gzipSize } = await getSize([...modules, main]);
27
+
28
+ const bundleReport = `${(size / ONE_KIB_BYTES).toFixed(2)} KiB / gzip: ${(
29
+ gzipSize / ONE_KIB_BYTES
30
+ ).toFixed(2)} KiB`;
31
+
32
+ logger.log(`Total Upload: ${bundleReport}`);
33
+
34
+ if (gzipSize > ONE_MIB_BYTES && !process.env.NO_SCRIPT_SIZE_WARNING) {
35
+ logger.warn(
36
+ "We recommend keeping your script less than 1MiB (1024 KiB) after gzip. Exceeding past this can affect cold start time"
37
+ );
38
+ }
39
+ }
40
+
41
+ export function printOffendingDependencies(
42
+ dependencies: Metafile["outputs"][string]["inputs"]
43
+ ) {
44
+ const warning: string[] = [];
45
+
46
+ const dependenciesSorted = Object.entries(dependencies);
47
+ dependenciesSorted.sort(
48
+ ([_adep, aData], [_bdep, bData]) =>
49
+ bData.bytesInOutput - aData.bytesInOutput
50
+ );
51
+ const topLargest = dependenciesSorted.slice(0, 5);
52
+
53
+ if (topLargest.length > 0) {
54
+ warning.push(
55
+ `Here are the ${topLargest.length} largest dependencies included in your script:`
56
+ );
57
+
58
+ for (const [dep, data] of topLargest) {
59
+ warning.push(
60
+ `- ${dep} - ${(data.bytesInOutput / ONE_KIB_BYTES).toFixed(2)} KiB`
61
+ );
62
+ }
63
+
64
+ warning.push("If these are unnecessary, consider removing them");
65
+
66
+ logger.warn(warning.join("\n"));
67
+ }
68
+ }