wrangler 0.0.0-e64812e → 0.0.0-e7a0cd5b

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 (291) hide show
  1. package/README.md +23 -3
  2. package/bin/wrangler.js +150 -62
  3. package/kv-asset-handler.js +1 -0
  4. package/miniflare-dist/index.mjs +1451 -21
  5. package/package.json +190 -152
  6. package/src/__tests__/access.test.ts +25 -0
  7. package/src/__tests__/api-dev.test.ts +209 -0
  8. package/src/__tests__/api-devregistry.test.js +57 -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 +4017 -3363
  13. package/src/__tests__/d1.test.ts +72 -0
  14. package/src/__tests__/delete.test.ts +230 -0
  15. package/src/__tests__/deployments.test.ts +95 -0
  16. package/src/__tests__/dev.test.tsx +1480 -951
  17. package/src/__tests__/dialogs.test.tsx +40 -0
  18. package/src/__tests__/generate.test.ts +235 -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-bin.ts +20 -20
  24. package/src/__tests__/helpers/mock-cfetch.ts +216 -94
  25. package/src/__tests__/helpers/mock-console.ts +58 -39
  26. package/src/__tests__/helpers/mock-dialogs.ts +94 -71
  27. package/src/__tests__/helpers/mock-get-zone-from-host.ts +8 -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 +7 -0
  31. package/src/__tests__/helpers/mock-kv.ts +27 -27
  32. package/src/__tests__/helpers/mock-oauth-flow.ts +225 -228
  33. package/src/__tests__/helpers/mock-process.ts +39 -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/handlers/access.ts +13 -0
  37. package/src/__tests__/helpers/msw/handlers/deployments.ts +59 -0
  38. package/src/__tests__/helpers/msw/handlers/namespaces.ts +104 -0
  39. package/src/__tests__/helpers/msw/handlers/oauth.ts +36 -0
  40. package/src/__tests__/helpers/msw/handlers/r2.ts +80 -0
  41. package/src/__tests__/helpers/msw/handlers/script.ts +75 -0
  42. package/src/__tests__/helpers/msw/handlers/user.ts +63 -0
  43. package/src/__tests__/helpers/msw/handlers/zones.ts +22 -0
  44. package/src/__tests__/helpers/msw/index.ts +21 -0
  45. package/src/__tests__/helpers/run-in-tmp.ts +27 -28
  46. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  47. package/src/__tests__/helpers/worker-scripts/child-wrangler.toml +1 -0
  48. package/src/__tests__/helpers/worker-scripts/hello-world-worker.js +5 -0
  49. package/src/__tests__/helpers/worker-scripts/hello-world-wrangler.toml +1 -0
  50. package/src/__tests__/helpers/worker-scripts/parent-worker.js +8 -0
  51. package/src/__tests__/helpers/worker-scripts/parent-wrangler.toml +5 -0
  52. package/src/__tests__/helpers/write-worker-source.ts +16 -16
  53. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  54. package/src/__tests__/https-options.test.ts +142 -109
  55. package/src/__tests__/index.test.ts +239 -233
  56. package/src/__tests__/init.test.ts +2869 -1603
  57. package/src/__tests__/jest.setup.ts +159 -34
  58. package/src/__tests__/kv.test.ts +1660 -1466
  59. package/src/__tests__/logger.test.ts +100 -74
  60. package/src/__tests__/metrics.test.ts +450 -0
  61. package/src/__tests__/middleware.scheduled.test.ts +135 -0
  62. package/src/__tests__/middleware.test.ts +726 -0
  63. package/src/__tests__/package-manager.test.ts +303 -303
  64. package/src/__tests__/pages.test.ts +2204 -735
  65. package/src/__tests__/parse.test.ts +252 -252
  66. package/src/__tests__/paths.test.ts +39 -0
  67. package/src/__tests__/publish.test.ts +7543 -5351
  68. package/src/__tests__/pubsub.test.ts +370 -0
  69. package/src/__tests__/queues.test.ts +371 -0
  70. package/src/__tests__/r2.test.ts +371 -228
  71. package/src/__tests__/route.test.ts +18 -18
  72. package/src/__tests__/secret.test.ts +622 -459
  73. package/src/__tests__/tail.test.ts +677 -567
  74. package/src/__tests__/test-old-node-version.js +31 -0
  75. package/src/__tests__/type-generation.test.ts +217 -0
  76. package/src/__tests__/user.test.ts +140 -116
  77. package/src/__tests__/utils-collectKeyValues.test.ts +47 -0
  78. package/src/__tests__/validate-dev-props.test.ts +56 -0
  79. package/src/__tests__/version.test.ts +35 -0
  80. package/src/__tests__/whoami.test.tsx +264 -91
  81. package/src/__tests__/worker-namespace.test.ts +326 -0
  82. package/src/abort.d.ts +1 -1
  83. package/src/api/dev.ts +208 -0
  84. package/src/api/index.ts +2 -0
  85. package/src/bundle-reporter.tsx +68 -0
  86. package/src/bundle.ts +746 -161
  87. package/src/cfetch/index.ts +120 -81
  88. package/src/cfetch/internal.ts +209 -91
  89. package/src/cli.ts +23 -8
  90. package/src/config/config.ts +236 -195
  91. package/src/config/diagnostics.ts +61 -61
  92. package/src/config/environment.ts +500 -357
  93. package/src/config/index.ts +310 -193
  94. package/src/config/validation-helpers.ts +379 -357
  95. package/src/config/validation.ts +1941 -1367
  96. package/src/config-cache.ts +81 -41
  97. package/src/create-worker-preview.ts +239 -142
  98. package/src/create-worker-upload-form.ts +305 -238
  99. package/src/d1/backups.tsx +218 -0
  100. package/src/d1/create.tsx +54 -0
  101. package/src/d1/delete.tsx +56 -0
  102. package/src/d1/execute.tsx +299 -0
  103. package/src/d1/formatTimeAgo.ts +14 -0
  104. package/src/d1/index.ts +76 -0
  105. package/src/d1/list.tsx +48 -0
  106. package/src/d1/options.ts +12 -0
  107. package/src/d1/types.tsx +14 -0
  108. package/src/d1/utils.ts +39 -0
  109. package/src/delete.ts +108 -0
  110. package/src/deployments.ts +74 -0
  111. package/src/deprecated/index.ts +438 -0
  112. package/src/dev/dev-vars.ts +20 -17
  113. package/src/dev/dev.tsx +520 -352
  114. package/src/dev/get-local-persistence-path.tsx +31 -0
  115. package/src/dev/local.tsx +697 -298
  116. package/src/dev/remote.tsx +591 -215
  117. package/src/dev/start-server.ts +513 -0
  118. package/src/dev/use-esbuild.ts +183 -97
  119. package/src/dev/validate-dev-props.ts +31 -0
  120. package/src/dev-registry.tsx +201 -0
  121. package/src/dev.tsx +869 -0
  122. package/src/dialogs.tsx +126 -98
  123. package/src/dispatch-namespace.ts +207 -0
  124. package/src/durable.ts +87 -87
  125. package/src/entry.ts +235 -228
  126. package/src/environment-variables.ts +38 -23
  127. package/src/errors.ts +6 -6
  128. package/src/git-client.ts +124 -0
  129. package/src/global-wrangler-config-path.ts +26 -0
  130. package/src/https-options.ts +84 -80
  131. package/src/index.tsx +627 -2807
  132. package/src/init.ts +970 -0
  133. package/src/inspect.ts +698 -593
  134. package/src/intl-polyfill.d.ts +123 -123
  135. package/src/is-ci.ts +14 -0
  136. package/src/is-interactive.ts +16 -0
  137. package/src/kv/helpers.ts +430 -0
  138. package/src/kv/index.ts +596 -0
  139. package/src/logger.ts +67 -41
  140. package/src/metrics/index.ts +5 -0
  141. package/src/metrics/metrics-config.ts +239 -0
  142. package/src/metrics/metrics-dispatcher.ts +96 -0
  143. package/src/metrics/metrics-usage-headers.ts +24 -0
  144. package/src/metrics/send-event.ts +94 -0
  145. package/src/miniflare-cli/assets.ts +215 -0
  146. package/src/miniflare-cli/index.ts +205 -33
  147. package/src/miniflare-cli/request-context.ts +18 -18
  148. package/src/module-collection.ts +221 -212
  149. package/src/open-in-browser.ts +4 -6
  150. package/src/package-manager.ts +173 -128
  151. package/src/pages/build.tsx +238 -0
  152. package/src/pages/constants.ts +18 -0
  153. package/src/pages/deployments.tsx +106 -0
  154. package/src/pages/dev.tsx +693 -0
  155. package/src/pages/errors.ts +66 -0
  156. package/src/pages/functions/buildPlugin.ts +110 -0
  157. package/src/pages/functions/buildWorker.ts +156 -0
  158. package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
  159. package/src/pages/functions/filepath-routing.ts +189 -0
  160. package/src/pages/functions/identifiers.ts +78 -0
  161. package/src/pages/functions/routes-consolidation.test.ts +250 -0
  162. package/src/pages/functions/routes-consolidation.ts +73 -0
  163. package/src/pages/functions/routes-transformation.test.ts +282 -0
  164. package/src/pages/functions/routes-transformation.ts +115 -0
  165. package/src/pages/functions/routes-validation.test.ts +403 -0
  166. package/src/pages/functions/routes-validation.ts +202 -0
  167. package/src/pages/functions/routes.ts +151 -0
  168. package/src/pages/functions.tsx +82 -0
  169. package/src/pages/hash.tsx +13 -0
  170. package/src/pages/index.tsx +94 -0
  171. package/src/pages/projects.tsx +169 -0
  172. package/src/pages/publish.tsx +436 -0
  173. package/src/pages/types.ts +49 -0
  174. package/src/pages/upload.tsx +425 -0
  175. package/src/pages/utils.ts +12 -0
  176. package/src/parse.ts +209 -125
  177. package/src/paths.ts +53 -8
  178. package/src/proxy.ts +618 -394
  179. package/src/publish/index.ts +270 -0
  180. package/src/publish/publish.ts +1035 -0
  181. package/src/pubsub/index.ts +286 -0
  182. package/src/pubsub/pubsub-commands.tsx +624 -0
  183. package/src/queues/cli/commands/consumer/add.ts +71 -0
  184. package/src/queues/cli/commands/consumer/index.ts +22 -0
  185. package/src/queues/cli/commands/consumer/remove.ts +38 -0
  186. package/src/queues/cli/commands/create.ts +25 -0
  187. package/src/queues/cli/commands/delete.ts +26 -0
  188. package/src/queues/cli/commands/index.ts +33 -0
  189. package/src/queues/cli/commands/list.ts +25 -0
  190. package/src/queues/client.ts +135 -0
  191. package/src/r2/helpers.ts +131 -0
  192. package/src/r2/index.ts +277 -0
  193. package/src/routes.ts +140 -0
  194. package/src/secret/index.ts +379 -0
  195. package/src/selfsigned.d.ts +23 -23
  196. package/src/sites.tsx +280 -203
  197. package/src/tail/createTail.ts +315 -0
  198. package/src/tail/filters.ts +108 -110
  199. package/src/tail/index.ts +211 -296
  200. package/src/tail/printing.ts +86 -46
  201. package/src/type-generation.ts +159 -0
  202. package/src/update-check.ts +11 -11
  203. package/src/user/access.ts +69 -0
  204. package/src/user/choose-account.tsx +69 -0
  205. package/src/user/env-vars.ts +46 -0
  206. package/src/user/generate-auth-url.ts +33 -0
  207. package/src/user/generate-random-state.ts +16 -0
  208. package/src/user/index.ts +3 -0
  209. package/src/user/user.tsx +1192 -0
  210. package/src/utils/collectKeyValues.ts +14 -0
  211. package/src/whoami.tsx +141 -42
  212. package/src/worker.ts +168 -106
  213. package/src/yargs-types.ts +20 -0
  214. package/src/zones.ts +191 -0
  215. package/templates/__tests__/pages-dev-util.test.ts +128 -0
  216. package/templates/checked-fetch.js +17 -0
  217. package/templates/d1-beta-facade.js +174 -0
  218. package/templates/experimental-local-cache-stubs.js +27 -0
  219. package/templates/first-party-worker-module-facade.ts +18 -0
  220. package/templates/format-dev-errors.ts +32 -0
  221. package/templates/init-tests/test-jest-new-worker.js +25 -0
  222. package/templates/init-tests/test-vitest-new-worker.js +26 -0
  223. package/templates/middleware/common.ts +62 -0
  224. package/templates/middleware/loader-modules.ts +84 -0
  225. package/templates/middleware/loader-sw.ts +213 -0
  226. package/templates/middleware/middleware-pretty-error.ts +40 -0
  227. package/templates/middleware/middleware-scheduled.ts +15 -0
  228. package/templates/new-worker-scheduled.js +3 -3
  229. package/templates/new-worker-scheduled.ts +15 -15
  230. package/templates/new-worker.js +3 -3
  231. package/templates/new-worker.ts +15 -15
  232. package/templates/no-op-worker.js +10 -0
  233. package/templates/pages-dev-pipeline.ts +28 -0
  234. package/templates/pages-dev-util.ts +52 -0
  235. package/templates/pages-shim.ts +9 -0
  236. package/templates/pages-template-plugin.ts +171 -0
  237. package/templates/pages-template-worker.ts +189 -0
  238. package/templates/serve-static-assets.ts +63 -0
  239. package/templates/service-bindings-module-facade.js +54 -0
  240. package/templates/service-bindings-sw-facade.js +42 -0
  241. package/templates/tsconfig.json +96 -95
  242. package/wrangler-dist/cli.d.ts +892 -0
  243. package/wrangler-dist/cli.js +145674 -108957
  244. package/pages/functions/buildPlugin.ts +0 -105
  245. package/pages/functions/buildWorker.ts +0 -151
  246. package/pages/functions/filepath-routing.ts +0 -189
  247. package/pages/functions/identifiers.ts +0 -78
  248. package/pages/functions/routes.ts +0 -156
  249. package/pages/functions/template-plugin.ts +0 -147
  250. package/pages/functions/template-worker.ts +0 -143
  251. package/src/__tests__/helpers/faye-websocket.d.ts +0 -6
  252. package/src/kv.ts +0 -408
  253. package/src/miniflare-cli/enum-keys.ts +0 -17
  254. package/src/pages.tsx +0 -2038
  255. package/src/publish.ts +0 -583
  256. package/src/r2.ts +0 -50
  257. package/src/user.tsx +0 -1203
  258. package/templates/static-asset-facade.js +0 -47
  259. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  260. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  261. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  262. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  263. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  264. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  265. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  266. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  267. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  268. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  269. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  270. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  271. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  272. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  273. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  274. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  275. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  276. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  277. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  278. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  279. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  280. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  281. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  282. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  283. package/vendor/wrangler-mime/LICENSE +0 -21
  284. package/vendor/wrangler-mime/Mime.js +0 -97
  285. package/vendor/wrangler-mime/README.md +0 -187
  286. package/vendor/wrangler-mime/cli.js +0 -46
  287. package/vendor/wrangler-mime/index.js +0 -4
  288. package/vendor/wrangler-mime/lite.js +0 -4
  289. package/vendor/wrangler-mime/package.json +0 -52
  290. package/vendor/wrangler-mime/types/other.js +0 -1
  291. package/vendor/wrangler-mime/types/standard.js +0 -1
@@ -0,0 +1,513 @@
1
+ import { fork } from "node:child_process";
2
+ import { realpathSync } from "node:fs";
3
+ import { writeFile } from "node:fs/promises";
4
+ import * as path from "node:path";
5
+ import * as util from "node:util";
6
+ import onExit from "signal-exit";
7
+ import tmp from "tmp-promise";
8
+ import { bundleWorker } from "../bundle";
9
+ import {
10
+ getBoundRegisteredWorkers,
11
+ registerWorker,
12
+ startWorkerRegistry,
13
+ stopWorkerRegistry,
14
+ } from "../dev-registry";
15
+ import { runCustomBuild } from "../entry";
16
+ import { logger } from "../logger";
17
+ import { waitForPortToBeAvailable } from "../proxy";
18
+ import {
19
+ setupBindings,
20
+ setupExperimentalLocal,
21
+ setupMiniflareOptions,
22
+ setupNodeOptions,
23
+ } from "./local";
24
+ import { startRemoteServer } from "./remote";
25
+ import { validateDevProps } from "./validate-dev-props";
26
+
27
+ import type { Config } from "../config";
28
+ import type { WorkerRegistry } from "../dev-registry";
29
+ import type { Entry } from "../entry";
30
+ import type { DevProps, DirectorySyncResult } from "./dev";
31
+ import type { LocalProps } from "./local";
32
+ import type { EsbuildBundle } from "./use-esbuild";
33
+ import type { Miniflare as Miniflare3Type } from "@miniflare/tre";
34
+ import type { MiniflareOptions } from "miniflare";
35
+
36
+ import type { ChildProcess } from "node:child_process";
37
+
38
+ export async function startDevServer(
39
+ props: DevProps & {
40
+ local: boolean;
41
+ }
42
+ ) {
43
+ try {
44
+ let workerDefinitions: WorkerRegistry = {};
45
+ validateDevProps(props);
46
+
47
+ if (props.build.command) {
48
+ const relativeFile =
49
+ path.relative(props.entry.directory, props.entry.file) || ".";
50
+ await runCustomBuild(props.entry.file, relativeFile, props.build).catch(
51
+ (err) => {
52
+ logger.error("Custom build failed:", err);
53
+ }
54
+ );
55
+ }
56
+
57
+ //implement a react-free version of useTmpDir
58
+ const directory = setupTempDir();
59
+ if (!directory) {
60
+ throw new Error("Failed to create temporary directory.");
61
+ }
62
+
63
+ //start the worker registry
64
+ startWorkerRegistry().catch((err) => {
65
+ logger.error("failed to start worker registry", err);
66
+ });
67
+ if (props.local) {
68
+ const boundRegisteredWorkers = await getBoundRegisteredWorkers({
69
+ services: props.bindings.services,
70
+ durableObjects: props.bindings.durable_objects,
71
+ });
72
+
73
+ if (!util.isDeepStrictEqual(boundRegisteredWorkers, workerDefinitions)) {
74
+ workerDefinitions = boundRegisteredWorkers || {};
75
+ }
76
+ }
77
+
78
+ //implement a react-free version of useEsbuild
79
+ const bundle = await runEsbuild({
80
+ entry: props.entry,
81
+ destination: directory.name,
82
+ jsxFactory: props.jsxFactory,
83
+ rules: props.rules,
84
+ jsxFragment: props.jsxFragment,
85
+ serveAssetsFromWorker: Boolean(
86
+ props.assetPaths && !props.isWorkersSite && props.local
87
+ ),
88
+ tsconfig: props.tsconfig,
89
+ minify: props.minify,
90
+ nodeCompat: props.nodeCompat,
91
+ define: props.define,
92
+ noBundle: props.noBundle,
93
+ assets: props.assetsConfig,
94
+ workerDefinitions,
95
+ services: props.bindings.services,
96
+ firstPartyWorkerDevFacade: props.firstPartyWorker,
97
+ testScheduled: props.testScheduled,
98
+ experimentalLocalStubCache: props.experimentalLocal,
99
+ });
100
+
101
+ if (props.local) {
102
+ const { stop, inspectorUrl } = await startLocalServer({
103
+ name: props.name,
104
+ bundle: bundle,
105
+ format: props.entry.format,
106
+ compatibilityDate: props.compatibilityDate,
107
+ compatibilityFlags: props.compatibilityFlags,
108
+ bindings: props.bindings,
109
+ assetPaths: props.assetPaths,
110
+ port: props.port,
111
+ ip: props.ip,
112
+ rules: props.rules,
113
+ inspectorPort: props.inspectorPort,
114
+ localPersistencePath: props.localPersistencePath,
115
+ liveReload: props.liveReload,
116
+ crons: props.crons,
117
+ queueConsumers: props.queueConsumers,
118
+ localProtocol: props.localProtocol,
119
+ localUpstream: props.localUpstream,
120
+ logPrefix: props.logPrefix,
121
+ inspect: props.inspect,
122
+ onReady: props.onReady,
123
+ enablePagesAssetsServiceBinding: props.enablePagesAssetsServiceBinding,
124
+ usageModel: props.usageModel,
125
+ workerDefinitions,
126
+ experimentalLocal: props.experimentalLocal,
127
+ });
128
+
129
+ return {
130
+ stop: async () => {
131
+ stop();
132
+ await stopWorkerRegistry();
133
+ },
134
+ inspectorUrl,
135
+ };
136
+ } else {
137
+ const { stop } = await startRemoteServer({
138
+ name: props.name,
139
+ bundle: bundle,
140
+ format: props.entry.format,
141
+ accountId: props.accountId,
142
+ bindings: props.bindings,
143
+ assetPaths: props.assetPaths,
144
+ isWorkersSite: props.isWorkersSite,
145
+ port: props.port,
146
+ ip: props.ip,
147
+ localProtocol: props.localProtocol,
148
+ inspectorPort: props.inspectorPort,
149
+ inspect: props.inspect,
150
+ compatibilityDate: props.compatibilityDate,
151
+ compatibilityFlags: props.compatibilityFlags,
152
+ usageModel: props.usageModel,
153
+ env: props.env,
154
+ legacyEnv: props.legacyEnv,
155
+ zone: props.zone,
156
+ host: props.host,
157
+ routes: props.routes,
158
+ onReady: props.onReady,
159
+ sourceMapPath: bundle?.sourceMapPath,
160
+ sendMetrics: props.sendMetrics,
161
+ });
162
+ return {
163
+ stop: async () => {
164
+ stop();
165
+ await stopWorkerRegistry();
166
+ },
167
+ // TODO: inspectorUrl,
168
+ };
169
+ }
170
+ } catch (err) {
171
+ logger.error(err);
172
+ }
173
+ }
174
+
175
+ function setupTempDir(): DirectorySyncResult | undefined {
176
+ let dir: DirectorySyncResult | undefined;
177
+ try {
178
+ dir = tmp.dirSync({ unsafeCleanup: true });
179
+
180
+ return dir;
181
+ } catch (err) {
182
+ logger.error("Failed to create temporary directory to store built files.");
183
+ }
184
+ }
185
+
186
+ async function runEsbuild({
187
+ entry,
188
+ destination,
189
+ jsxFactory,
190
+ jsxFragment,
191
+ rules,
192
+ assets,
193
+ serveAssetsFromWorker,
194
+ tsconfig,
195
+ minify,
196
+ nodeCompat,
197
+ define,
198
+ noBundle,
199
+ workerDefinitions,
200
+ services,
201
+ firstPartyWorkerDevFacade,
202
+ testScheduled,
203
+ experimentalLocalStubCache,
204
+ }: {
205
+ entry: Entry;
206
+ destination: string | undefined;
207
+ jsxFactory: string | undefined;
208
+ jsxFragment: string | undefined;
209
+ rules: Config["rules"];
210
+ assets: Config["assets"];
211
+ define: Config["define"];
212
+ services: Config["services"];
213
+ serveAssetsFromWorker: boolean;
214
+ tsconfig: string | undefined;
215
+ minify: boolean | undefined;
216
+ nodeCompat: boolean | undefined;
217
+ noBundle: boolean;
218
+ workerDefinitions: WorkerRegistry;
219
+ firstPartyWorkerDevFacade: boolean | undefined;
220
+ testScheduled?: boolean;
221
+ experimentalLocalStubCache: boolean | undefined;
222
+ }): Promise<EsbuildBundle | undefined> {
223
+ if (!destination) return;
224
+
225
+ const {
226
+ resolvedEntryPointPath,
227
+ bundleType,
228
+ modules,
229
+ dependencies,
230
+ sourceMapPath,
231
+ }: Awaited<ReturnType<typeof bundleWorker>> = noBundle
232
+ ? {
233
+ modules: [],
234
+ dependencies: {},
235
+ resolvedEntryPointPath: entry.file,
236
+ bundleType: entry.format === "modules" ? "esm" : "commonjs",
237
+ stop: undefined,
238
+ sourceMapPath: undefined,
239
+ }
240
+ : await bundleWorker(entry, destination, {
241
+ serveAssetsFromWorker,
242
+ jsxFactory,
243
+ jsxFragment,
244
+ rules,
245
+ tsconfig,
246
+ minify,
247
+ nodeCompat,
248
+ define,
249
+ checkFetch: true,
250
+ assets: assets && {
251
+ ...assets,
252
+ // disable the cache in dev
253
+ bypassCache: true,
254
+ },
255
+ workerDefinitions,
256
+ services,
257
+ firstPartyWorkerDevFacade,
258
+ targetConsumer: "dev", // We are starting a dev server
259
+ local: false,
260
+ testScheduled,
261
+ experimentalLocalStubCache,
262
+ });
263
+
264
+ return {
265
+ id: 0,
266
+ entry,
267
+ path: resolvedEntryPointPath,
268
+ type: bundleType,
269
+ modules,
270
+ dependencies,
271
+ sourceMapPath,
272
+ };
273
+ }
274
+
275
+ export async function startLocalServer({
276
+ name: workerName,
277
+ bundle,
278
+ format,
279
+ compatibilityDate,
280
+ compatibilityFlags,
281
+ usageModel,
282
+ bindings,
283
+ workerDefinitions,
284
+ assetPaths,
285
+ port,
286
+ inspectorPort,
287
+ rules,
288
+ localPersistencePath,
289
+ liveReload,
290
+ ip,
291
+ crons,
292
+ queueConsumers,
293
+ localProtocol,
294
+ localUpstream,
295
+ inspect,
296
+ onReady,
297
+ logPrefix,
298
+ enablePagesAssetsServiceBinding,
299
+ experimentalLocal,
300
+ }: LocalProps) {
301
+ let local: ChildProcess | undefined;
302
+ let experimentalLocalRef: Miniflare3Type | undefined;
303
+ let removeSignalExitListener: (() => void) | undefined;
304
+ let inspectorUrl: string | undefined;
305
+ const setInspectorUrl = (url: string) => {
306
+ inspectorUrl = url;
307
+ };
308
+
309
+ const abortController = new AbortController();
310
+ async function startLocalWorker() {
311
+ if (!bundle || !format) return;
312
+
313
+ // port for the worker
314
+
315
+ if (port !== 0) {
316
+ await waitForPortToBeAvailable(port, {
317
+ retryPeriod: 200,
318
+ timeout: 2000,
319
+ abortSignal: abortController.signal,
320
+ });
321
+ }
322
+
323
+ if (bindings.services && bindings.services.length > 0) {
324
+ logger.warn(
325
+ "⎔ Support for service bindings in local mode is experimental and may change."
326
+ );
327
+ }
328
+
329
+ // In local mode, we want to copy all referenced modules into
330
+ // the output bundle directory before starting up
331
+ for (const module of bundle.modules) {
332
+ await writeFile(
333
+ path.join(path.dirname(bundle.path), module.name),
334
+ module.content
335
+ );
336
+ }
337
+
338
+ const scriptPath = realpathSync(bundle.path);
339
+
340
+ const upstream =
341
+ typeof localUpstream === "string"
342
+ ? `${localProtocol}://${localUpstream}`
343
+ : undefined;
344
+
345
+ const {
346
+ externalDurableObjects,
347
+ internalDurableObjects,
348
+ wasmBindings,
349
+ textBlobBindings,
350
+ dataBlobBindings,
351
+ } = setupBindings({
352
+ wasm_modules: bindings.wasm_modules,
353
+ text_blobs: bindings.text_blobs,
354
+ data_blobs: bindings.data_blobs,
355
+ durable_objects: bindings.durable_objects,
356
+ format,
357
+ bundle,
358
+ });
359
+
360
+ const { forkOptions, miniflareCLIPath } = setupMiniflareOptions({
361
+ workerName,
362
+ port,
363
+ scriptPath,
364
+ localProtocol,
365
+ ip,
366
+ format,
367
+ rules,
368
+ compatibilityDate,
369
+ compatibilityFlags,
370
+ usageModel,
371
+ kv_namespaces: bindings?.kv_namespaces,
372
+ queueBindings: bindings?.queues,
373
+ queueConsumers,
374
+ r2_buckets: bindings?.r2_buckets,
375
+ d1_databases: bindings?.d1_databases,
376
+ internalDurableObjects,
377
+ externalDurableObjects,
378
+ localPersistencePath,
379
+ liveReload,
380
+ assetPaths,
381
+ vars: bindings?.vars,
382
+ wasmBindings,
383
+ textBlobBindings,
384
+ dataBlobBindings,
385
+ crons,
386
+ upstream,
387
+ logPrefix,
388
+ workerDefinitions,
389
+ enablePagesAssetsServiceBinding,
390
+ });
391
+
392
+ if (experimentalLocal) {
393
+ // TODO: refactor setupMiniflareOptions so we don't need to parse here
394
+ const mf2Options: MiniflareOptions = JSON.parse(forkOptions[0]);
395
+ const mf = await setupExperimentalLocal(mf2Options, format, bundle);
396
+ const runtimeURL = await mf.ready;
397
+ experimentalLocalRef = mf;
398
+ removeSignalExitListener = onExit((_code, _signal) => {
399
+ logger.log("⎔ Shutting down experimental local server.");
400
+ mf.dispose();
401
+ experimentalLocalRef = undefined;
402
+ });
403
+ onReady?.(runtimeURL.hostname, parseInt(runtimeURL.port ?? 8787));
404
+ return;
405
+ }
406
+
407
+ const nodeOptions = setupNodeOptions({ inspect, ip, inspectorPort });
408
+ logger.log("⎔ Starting a local server...");
409
+
410
+ const child = (local = fork(miniflareCLIPath, forkOptions, {
411
+ cwd: path.dirname(scriptPath),
412
+ execArgv: nodeOptions,
413
+ stdio: "pipe",
414
+ }));
415
+
416
+ child.on("message", async (messageString) => {
417
+ const message = JSON.parse(messageString as string);
418
+ if (message.ready) {
419
+ // Let's register our presence in the dev registry
420
+ if (workerName) {
421
+ await registerWorker(workerName, {
422
+ protocol: localProtocol,
423
+ mode: "local",
424
+ port: message.mfPort,
425
+ host: ip,
426
+ durableObjects: internalDurableObjects.map((binding) => ({
427
+ name: binding.name,
428
+ className: binding.class_name,
429
+ })),
430
+ ...(message.durableObjectsPort
431
+ ? {
432
+ durableObjectsHost: ip,
433
+ durableObjectsPort: message.durableObjectsPort,
434
+ }
435
+ : {}),
436
+ });
437
+ }
438
+ onReady?.(ip, message.mfPort);
439
+ }
440
+ });
441
+
442
+ child.on("close", (code) => {
443
+ if (code) {
444
+ logger.log(`Miniflare process exited with code ${code}`);
445
+ }
446
+ });
447
+
448
+ child.stdout?.on("data", (data: Buffer) => {
449
+ process.stdout.write(data);
450
+ });
451
+
452
+ // parse the node inspector url (which may be received in chunks) from stderr
453
+ let stderrData = "";
454
+ let inspectorUrlFound = false;
455
+ child.stderr?.on("data", (data: Buffer) => {
456
+ if (!inspectorUrlFound) {
457
+ stderrData += data.toString();
458
+ const matches =
459
+ /Debugger listening on (ws:\/\/127\.0\.0\.1:\d+\/[A-Za-z0-9-]+)[\r|\n]/.exec(
460
+ stderrData
461
+ );
462
+ if (matches) {
463
+ inspectorUrlFound = true;
464
+ setInspectorUrl(matches[1]);
465
+ }
466
+ }
467
+
468
+ process.stderr.write(data);
469
+ });
470
+
471
+ child.on("exit", (code) => {
472
+ if (code) {
473
+ logger.error(`Miniflare process exited with code ${code}`);
474
+ }
475
+ });
476
+
477
+ child.on("error", (error: Error) => {
478
+ logger.error(`Miniflare process failed to spawn`);
479
+ logger.error(error);
480
+ });
481
+
482
+ removeSignalExitListener = onExit((_code, _signal) => {
483
+ logger.log("⎔ Shutting down local server.");
484
+ child.kill();
485
+ local = undefined;
486
+ });
487
+ }
488
+
489
+ startLocalWorker().catch((err) => {
490
+ logger.error("local worker:", err);
491
+ });
492
+
493
+ return {
494
+ inspectorUrl,
495
+ stop: () => {
496
+ abortController.abort();
497
+ if (local) {
498
+ logger.log("⎔ Shutting down local server.");
499
+ local.kill();
500
+ local = undefined;
501
+ }
502
+ if (experimentalLocalRef) {
503
+ logger.log("⎔ Shutting down experimental local server.");
504
+ // Initialisation errors are also thrown asynchronously by dispose().
505
+ // The catch() above should've caught them though.
506
+ experimentalLocalRef?.dispose().catch(() => {});
507
+ experimentalLocalRef = undefined;
508
+ }
509
+ removeSignalExitListener?.();
510
+ removeSignalExitListener = undefined;
511
+ },
512
+ };
513
+ }