wrangler 0.0.0-e2f9bb2 → 0.0.0-e305903a

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