wrangler 0.0.0-e978986 → 0.0.0-ea7ee45

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 (181) hide show
  1. package/README.md +7 -1
  2. package/bin/wrangler.js +111 -57
  3. package/kv-asset-handler.js +1 -0
  4. package/miniflare-dist/index.mjs +9 -2
  5. package/package.json +156 -152
  6. package/src/__tests__/config-cache.test.ts +24 -24
  7. package/src/__tests__/configuration.test.ts +3818 -3363
  8. package/src/__tests__/dev.test.tsx +1128 -949
  9. package/src/__tests__/guess-worker-format.test.ts +68 -68
  10. package/src/__tests__/helpers/cmd-shim.d.ts +6 -6
  11. package/src/__tests__/helpers/faye-websocket.d.ts +4 -4
  12. package/src/__tests__/helpers/mock-account-id.ts +24 -24
  13. package/src/__tests__/helpers/mock-bin.ts +20 -20
  14. package/src/__tests__/helpers/mock-cfetch.ts +92 -92
  15. package/src/__tests__/helpers/mock-console.ts +49 -39
  16. package/src/__tests__/helpers/mock-dialogs.ts +94 -71
  17. package/src/__tests__/helpers/mock-http-server.ts +30 -30
  18. package/src/__tests__/helpers/mock-istty.ts +65 -18
  19. package/src/__tests__/helpers/mock-kv.ts +26 -26
  20. package/src/__tests__/helpers/mock-oauth-flow.ts +223 -228
  21. package/src/__tests__/helpers/mock-process.ts +39 -0
  22. package/src/__tests__/helpers/mock-stdin.ts +82 -77
  23. package/src/__tests__/helpers/mock-web-socket.ts +21 -21
  24. package/src/__tests__/helpers/run-in-tmp.ts +27 -27
  25. package/src/__tests__/helpers/run-wrangler.ts +8 -8
  26. package/src/__tests__/helpers/write-worker-source.ts +16 -16
  27. package/src/__tests__/helpers/write-wrangler-toml.ts +9 -9
  28. package/src/__tests__/https-options.test.ts +104 -104
  29. package/src/__tests__/index.test.ts +239 -233
  30. package/src/__tests__/init.test.ts +1605 -1180
  31. package/src/__tests__/jest.setup.ts +63 -33
  32. package/src/__tests__/kv.test.ts +1128 -990
  33. package/src/__tests__/logger.test.ts +100 -74
  34. package/src/__tests__/package-manager.test.ts +303 -303
  35. package/src/__tests__/pages.test.ts +1160 -563
  36. package/src/__tests__/parse.test.ts +252 -252
  37. package/src/__tests__/publish.test.ts +6344 -5299
  38. package/src/__tests__/pubsub.test.ts +276 -0
  39. package/src/__tests__/r2.test.ts +133 -133
  40. package/src/__tests__/route.test.ts +18 -18
  41. package/src/__tests__/secret.test.ts +382 -377
  42. package/src/__tests__/tail.test.ts +530 -530
  43. package/src/__tests__/user.test.ts +123 -111
  44. package/src/__tests__/whoami.test.tsx +198 -83
  45. package/src/__tests__/worker-namespace.test.ts +327 -0
  46. package/src/abort.d.ts +1 -1
  47. package/src/api/dev.ts +39 -0
  48. package/src/api/index.ts +1 -0
  49. package/src/bundle-reporter.tsx +29 -0
  50. package/src/bundle.ts +158 -146
  51. package/src/cfetch/index.ts +80 -80
  52. package/src/cfetch/internal.ts +92 -88
  53. package/src/cli.ts +21 -7
  54. package/src/config/config.ts +204 -195
  55. package/src/config/diagnostics.ts +61 -61
  56. package/src/config/environment.ts +367 -357
  57. package/src/config/index.ts +193 -193
  58. package/src/config/validation-helpers.ts +366 -357
  59. package/src/config/validation.ts +1521 -1367
  60. package/src/config-cache.ts +24 -25
  61. package/src/create-worker-preview.ts +206 -136
  62. package/src/create-worker-upload-form.ts +238 -238
  63. package/src/dev/dev-vars.ts +13 -13
  64. package/src/dev/dev.tsx +334 -336
  65. package/src/dev/local.tsx +304 -272
  66. package/src/dev/remote.tsx +351 -211
  67. package/src/dev/use-esbuild.ts +126 -94
  68. package/src/dev.tsx +526 -0
  69. package/src/dialogs.tsx +97 -97
  70. package/src/durable.ts +87 -87
  71. package/src/entry.ts +234 -228
  72. package/src/environment-variables.ts +23 -23
  73. package/src/errors.ts +6 -6
  74. package/src/generate.ts +33 -0
  75. package/src/git-client.ts +42 -0
  76. package/src/https-options.ts +79 -79
  77. package/src/index.tsx +1775 -2752
  78. package/src/init.ts +549 -0
  79. package/src/inspect.ts +593 -593
  80. package/src/intl-polyfill.d.ts +123 -123
  81. package/src/kv.ts +277 -277
  82. package/src/logger.ts +46 -39
  83. package/src/miniflare-cli/enum-keys.ts +8 -8
  84. package/src/miniflare-cli/index.ts +42 -31
  85. package/src/miniflare-cli/request-context.ts +18 -18
  86. package/src/module-collection.ts +212 -212
  87. package/src/open-in-browser.ts +4 -6
  88. package/src/package-manager.ts +123 -123
  89. package/src/pages/build.tsx +202 -0
  90. package/src/pages/constants.ts +7 -0
  91. package/src/pages/deployments.tsx +101 -0
  92. package/src/pages/dev.tsx +964 -0
  93. package/src/pages/functions/buildPlugin.ts +105 -0
  94. package/src/pages/functions/buildWorker.ts +151 -0
  95. package/{pages → src/pages}/functions/filepath-routing.test.ts +113 -113
  96. package/src/pages/functions/filepath-routing.ts +189 -0
  97. package/src/pages/functions/identifiers.ts +78 -0
  98. package/src/pages/functions/routes.ts +151 -0
  99. package/src/pages/index.tsx +84 -0
  100. package/src/pages/projects.tsx +157 -0
  101. package/src/pages/publish.tsx +335 -0
  102. package/src/pages/types.ts +40 -0
  103. package/src/pages/upload.tsx +384 -0
  104. package/src/pages/utils.ts +12 -0
  105. package/src/parse.ts +209 -125
  106. package/src/paths.ts +6 -6
  107. package/src/preview.ts +31 -0
  108. package/src/proxy.ts +400 -389
  109. package/src/publish.ts +688 -505
  110. package/src/pubsub/index.ts +286 -0
  111. package/src/pubsub/pubsub-commands.tsx +594 -0
  112. package/src/r2.ts +19 -19
  113. package/src/selfsigned.d.ts +23 -23
  114. package/src/sites.tsx +278 -201
  115. package/src/tail/filters.ts +108 -108
  116. package/src/tail/index.ts +217 -217
  117. package/src/tail/printing.ts +45 -45
  118. package/src/update-check.ts +11 -11
  119. package/src/user/choose-account.tsx +60 -0
  120. package/src/user/env-vars.ts +46 -0
  121. package/src/user/generate-auth-url.ts +33 -0
  122. package/src/user/generate-random-state.ts +16 -0
  123. package/src/user/index.ts +3 -0
  124. package/src/user/user.tsx +1130 -0
  125. package/src/whoami.tsx +61 -41
  126. package/src/worker-namespace.ts +190 -0
  127. package/src/worker.ts +104 -99
  128. package/src/zones.ts +76 -0
  129. package/templates/checked-fetch.js +17 -0
  130. package/templates/new-worker-scheduled.js +4 -4
  131. package/templates/new-worker-scheduled.ts +16 -16
  132. package/templates/new-worker.js +3 -3
  133. package/templates/new-worker.ts +15 -15
  134. package/templates/no-op-worker.js +10 -0
  135. package/templates/pages-template-plugin.ts +155 -0
  136. package/templates/pages-template-worker.ts +161 -0
  137. package/templates/static-asset-facade.js +32 -36
  138. package/templates/tsconfig.json +95 -95
  139. package/wrangler-dist/cli.js +40620 -39223
  140. package/pages/functions/buildPlugin.ts +0 -105
  141. package/pages/functions/buildWorker.ts +0 -151
  142. package/pages/functions/filepath-routing.ts +0 -189
  143. package/pages/functions/identifiers.ts +0 -78
  144. package/pages/functions/routes.ts +0 -156
  145. package/pages/functions/template-plugin.ts +0 -147
  146. package/pages/functions/template-worker.ts +0 -143
  147. package/src/pages.tsx +0 -2027
  148. package/src/user.tsx +0 -1203
  149. package/vendor/@cloudflare/kv-asset-handler/CHANGELOG.md +0 -332
  150. package/vendor/@cloudflare/kv-asset-handler/LICENSE_APACHE +0 -176
  151. package/vendor/@cloudflare/kv-asset-handler/LICENSE_MIT +0 -25
  152. package/vendor/@cloudflare/kv-asset-handler/README.md +0 -245
  153. package/vendor/@cloudflare/kv-asset-handler/dist/index.d.ts +0 -32
  154. package/vendor/@cloudflare/kv-asset-handler/dist/index.js +0 -354
  155. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.d.ts +0 -13
  156. package/vendor/@cloudflare/kv-asset-handler/dist/mocks.js +0 -148
  157. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.d.ts +0 -1
  158. package/vendor/@cloudflare/kv-asset-handler/dist/test/getAssetFromKV.js +0 -436
  159. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.d.ts +0 -1
  160. package/vendor/@cloudflare/kv-asset-handler/dist/test/mapRequestToAsset.js +0 -40
  161. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.d.ts +0 -1
  162. package/vendor/@cloudflare/kv-asset-handler/dist/test/serveSinglePageApp.js +0 -42
  163. package/vendor/@cloudflare/kv-asset-handler/dist/types.d.ts +0 -26
  164. package/vendor/@cloudflare/kv-asset-handler/dist/types.js +0 -31
  165. package/vendor/@cloudflare/kv-asset-handler/package.json +0 -52
  166. package/vendor/@cloudflare/kv-asset-handler/src/index.ts +0 -296
  167. package/vendor/@cloudflare/kv-asset-handler/src/mocks.ts +0 -136
  168. package/vendor/@cloudflare/kv-asset-handler/src/test/getAssetFromKV.ts +0 -464
  169. package/vendor/@cloudflare/kv-asset-handler/src/test/mapRequestToAsset.ts +0 -33
  170. package/vendor/@cloudflare/kv-asset-handler/src/test/serveSinglePageApp.ts +0 -42
  171. package/vendor/@cloudflare/kv-asset-handler/src/types.ts +0 -39
  172. package/vendor/wrangler-mime/CHANGELOG.md +0 -289
  173. package/vendor/wrangler-mime/LICENSE +0 -21
  174. package/vendor/wrangler-mime/Mime.js +0 -97
  175. package/vendor/wrangler-mime/README.md +0 -187
  176. package/vendor/wrangler-mime/cli.js +0 -46
  177. package/vendor/wrangler-mime/index.js +0 -4
  178. package/vendor/wrangler-mime/lite.js +0 -4
  179. package/vendor/wrangler-mime/package.json +0 -52
  180. package/vendor/wrangler-mime/types/other.js +0 -1
  181. package/vendor/wrangler-mime/types/standard.js +0 -1
package/src/dev/local.tsx CHANGED
@@ -15,304 +15,336 @@ import type { EsbuildBundle } from "./use-esbuild";
15
15
  import type { MiniflareOptions } from "miniflare";
16
16
 
17
17
  interface LocalProps {
18
- name: string | undefined;
19
- bundle: EsbuildBundle | undefined;
20
- format: CfScriptFormat | undefined;
21
- compatibilityDate: string;
22
- compatibilityFlags: string[] | undefined;
23
- bindings: CfWorkerInit["bindings"];
24
- assetPaths: AssetPaths | undefined;
25
- public: string | undefined;
26
- port: number;
27
- ip: string;
28
- rules: Config["rules"];
29
- inspectorPort: number;
30
- enableLocalPersistence: boolean;
31
- crons: Config["triggers"]["crons"];
18
+ name: string | undefined;
19
+ bundle: EsbuildBundle | undefined;
20
+ format: CfScriptFormat | undefined;
21
+ compatibilityDate: string;
22
+ compatibilityFlags: string[] | undefined;
23
+ bindings: CfWorkerInit["bindings"];
24
+ assetPaths: AssetPaths | undefined;
25
+ isWorkersSite: boolean;
26
+ port: number;
27
+ ip: string;
28
+ rules: Config["rules"];
29
+ inspectorPort: number;
30
+ enableLocalPersistence: boolean;
31
+ crons: Config["triggers"]["crons"];
32
+ localProtocol: "http" | "https";
33
+ localUpstream: string | undefined;
34
+ inspect: boolean | undefined;
35
+ onReady: (() => void) | undefined;
36
+ logLevel: "none" | "error" | "log" | "warn" | "debug" | undefined;
32
37
  }
33
38
 
34
39
  export function Local(props: LocalProps) {
35
- const { inspectorUrl } = useLocalWorker(props);
36
- useInspector({
37
- inspectorUrl,
38
- port: props.inspectorPort,
39
- logToTerminal: false,
40
- });
41
- return null;
40
+ const { inspectorUrl } = useLocalWorker(props);
41
+ useInspector({
42
+ inspectorUrl,
43
+ port: props.inspectorPort,
44
+ logToTerminal: false,
45
+ });
46
+ return null;
42
47
  }
43
48
 
44
49
  function useLocalWorker({
45
- name: workerName,
46
- bundle,
47
- format,
48
- compatibilityDate,
49
- compatibilityFlags,
50
- bindings,
51
- assetPaths,
52
- public: publicDirectory,
53
- port,
54
- rules,
55
- enableLocalPersistence,
56
- ip,
57
- crons,
50
+ name: workerName,
51
+ bundle,
52
+ format,
53
+ compatibilityDate,
54
+ compatibilityFlags,
55
+ bindings,
56
+ assetPaths,
57
+ isWorkersSite,
58
+ port,
59
+ rules,
60
+ enableLocalPersistence,
61
+ ip,
62
+ crons,
63
+ localProtocol,
64
+ localUpstream,
65
+ inspect,
66
+ onReady,
67
+ logLevel,
58
68
  }: LocalProps) {
59
- // TODO: pass vars via command line
60
- const local = useRef<ReturnType<typeof spawn>>();
61
- const removeSignalExitListener = useRef<() => void>();
62
- const [inspectorUrl, setInspectorUrl] = useState<string | undefined>();
63
- // if we're using local persistence for data, we should use the cwd
64
- // as an explicit path, or else it'll use the temp dir
65
- // which disappears when dev ends
66
- const localPersistencePath = enableLocalPersistence
67
- ? // Maybe we could make the path configurable as well?
68
- path.join(process.cwd(), "wrangler-local-state")
69
- : // We otherwise choose null, but choose true later
70
- // so that it's persisted in the temp dir across a dev session
71
- // even when we change source and reload
72
- null;
73
- useEffect(() => {
74
- const abortController = new AbortController();
75
- async function startLocalWorker() {
76
- if (!bundle || !format) return;
69
+ // TODO: pass vars via command line
70
+ const local = useRef<ReturnType<typeof spawn>>();
71
+ const removeSignalExitListener = useRef<() => void>();
72
+ const [inspectorUrl, setInspectorUrl] = useState<string | undefined>();
73
+ // if we're using local persistence for data, we should use the cwd
74
+ // as an explicit path, or else it'll use the temp dir
75
+ // which disappears when dev ends
76
+ const localPersistencePath = enableLocalPersistence
77
+ ? // Maybe we could make the path configurable as well?
78
+ path.join(process.cwd(), "wrangler-local-state")
79
+ : // We otherwise choose null, but choose true later
80
+ // so that it's persisted in the temp dir across a dev session
81
+ // even when we change source and reload
82
+ null;
83
+ useEffect(() => {
84
+ const abortController = new AbortController();
85
+ async function startLocalWorker() {
86
+ if (!bundle || !format) return;
77
87
 
78
- // port for the worker
79
- await waitForPortToBeAvailable(port, {
80
- retryPeriod: 200,
81
- timeout: 2000,
82
- abortSignal: abortController.signal,
83
- });
88
+ // port for the worker
89
+ await waitForPortToBeAvailable(port, {
90
+ retryPeriod: 200,
91
+ timeout: 2000,
92
+ abortSignal: abortController.signal,
93
+ });
84
94
 
85
- if (publicDirectory) {
86
- throw new Error(
87
- '⎔ A "public" folder is not yet supported in local mode.'
88
- );
89
- }
90
- if (bindings.services && bindings.services.length > 0) {
91
- throw new Error(
92
- "⎔ Service bindings are not yet supported in local mode."
93
- );
94
- }
95
+ if (bindings.services && bindings.services.length > 0) {
96
+ throw new Error(
97
+ "⎔ Service bindings are not yet supported in local mode."
98
+ );
99
+ }
95
100
 
96
- // In local mode, we want to copy all referenced modules into
97
- // the output bundle directory before starting up
98
- for (const module of bundle.modules) {
99
- await writeFile(
100
- path.join(path.dirname(bundle.path), module.name),
101
- module.content
102
- );
103
- }
101
+ // In local mode, we want to copy all referenced modules into
102
+ // the output bundle directory before starting up
103
+ for (const module of bundle.modules) {
104
+ await writeFile(
105
+ path.join(path.dirname(bundle.path), module.name),
106
+ module.content
107
+ );
108
+ }
104
109
 
105
- const scriptPath = realpathSync(bundle.path);
110
+ const scriptPath = realpathSync(bundle.path);
106
111
 
107
- // the wasm_modules/text_blobs/data_blobs bindings are
108
- // relative to process.cwd(), but the actual worker bundle
109
- // is in the temp output directory; so we rewrite the paths to be absolute,
110
- // letting miniflare resolve them correctly
112
+ // the wasm_modules/text_blobs/data_blobs bindings are
113
+ // relative to process.cwd(), but the actual worker bundle
114
+ // is in the temp output directory; so we rewrite the paths to be absolute,
115
+ // letting miniflare resolve them correctly
111
116
 
112
- // wasm
113
- const wasmBindings: Record<string, string> = {};
114
- for (const [name, filePath] of Object.entries(
115
- bindings.wasm_modules || {}
116
- )) {
117
- wasmBindings[name] = path.join(process.cwd(), filePath);
118
- }
117
+ // wasm
118
+ const wasmBindings: Record<string, string> = {};
119
+ for (const [name, filePath] of Object.entries(
120
+ bindings.wasm_modules || {}
121
+ )) {
122
+ wasmBindings[name] = path.join(process.cwd(), filePath);
123
+ }
119
124
 
120
- // text
121
- const textBlobBindings: Record<string, string> = {};
122
- for (const [name, filePath] of Object.entries(
123
- bindings.text_blobs || {}
124
- )) {
125
- textBlobBindings[name] = path.join(process.cwd(), filePath);
126
- }
125
+ // text
126
+ const textBlobBindings: Record<string, string> = {};
127
+ for (const [name, filePath] of Object.entries(
128
+ bindings.text_blobs || {}
129
+ )) {
130
+ textBlobBindings[name] = path.join(process.cwd(), filePath);
131
+ }
127
132
 
128
- // data
129
- const dataBlobBindings: Record<string, string> = {};
130
- for (const [name, filePath] of Object.entries(
131
- bindings.data_blobs || {}
132
- )) {
133
- dataBlobBindings[name] = path.join(process.cwd(), filePath);
134
- }
133
+ // data
134
+ const dataBlobBindings: Record<string, string> = {};
135
+ for (const [name, filePath] of Object.entries(
136
+ bindings.data_blobs || {}
137
+ )) {
138
+ dataBlobBindings[name] = path.join(process.cwd(), filePath);
139
+ }
135
140
 
136
- if (format === "service-worker") {
137
- for (const { type, name } of bundle.modules) {
138
- if (type === "compiled-wasm") {
139
- // In service-worker format, .wasm modules are referenced by global identifiers,
140
- // so we convert it here.
141
- // This identifier has to be a valid JS identifier, so we replace all non alphanumeric
142
- // characters with an underscore.
143
- const identifier = name.replace(/[^a-zA-Z0-9_$]/g, "_");
144
- wasmBindings[identifier] = name;
145
- } else if (type === "text") {
146
- // In service-worker format, text modules are referenced by global identifiers,
147
- // so we convert it here.
148
- // This identifier has to be a valid JS identifier, so we replace all non alphanumeric
149
- // characters with an underscore.
150
- const identifier = name.replace(/[^a-zA-Z0-9_$]/g, "_");
151
- textBlobBindings[identifier] = name;
152
- } else if (type === "buffer") {
153
- // In service-worker format, data blobs are referenced by global identifiers,
154
- // so we convert it here.
155
- // This identifier has to be a valid JS identifier, so we replace all non alphanumeric
156
- // characters with an underscore.
157
- const identifier = name.replace(/[^a-zA-Z0-9_$]/g, "_");
158
- dataBlobBindings[identifier] = name;
159
- }
160
- }
161
- }
141
+ if (format === "service-worker") {
142
+ for (const { type, name } of bundle.modules) {
143
+ if (type === "compiled-wasm") {
144
+ // In service-worker format, .wasm modules are referenced by global identifiers,
145
+ // so we convert it here.
146
+ // This identifier has to be a valid JS identifier, so we replace all non alphanumeric
147
+ // characters with an underscore.
148
+ const identifier = name.replace(/[^a-zA-Z0-9_$]/g, "_");
149
+ wasmBindings[identifier] = name;
150
+ } else if (type === "text") {
151
+ // In service-worker format, text modules are referenced by global identifiers,
152
+ // so we convert it here.
153
+ // This identifier has to be a valid JS identifier, so we replace all non alphanumeric
154
+ // characters with an underscore.
155
+ const identifier = name.replace(/[^a-zA-Z0-9_$]/g, "_");
156
+ textBlobBindings[identifier] = name;
157
+ } else if (type === "buffer") {
158
+ // In service-worker format, data blobs are referenced by global identifiers,
159
+ // so we convert it here.
160
+ // This identifier has to be a valid JS identifier, so we replace all non alphanumeric
161
+ // characters with an underscore.
162
+ const identifier = name.replace(/[^a-zA-Z0-9_$]/g, "_");
163
+ dataBlobBindings[identifier] = name;
164
+ }
165
+ }
166
+ }
162
167
 
163
- const options: MiniflareOptions = {
164
- name: workerName,
165
- port,
166
- scriptPath,
167
- host: ip,
168
- modules: format === "modules",
169
- modulesRules: (rules || [])
170
- .concat(DEFAULT_MODULE_RULES)
171
- .map(({ type, globs: include, fallthrough }) => ({
172
- type,
173
- include,
174
- fallthrough,
175
- })),
176
- compatibilityDate,
177
- compatibilityFlags,
178
- kvNamespaces: bindings.kv_namespaces?.map((kv) => kv.binding),
179
- durableObjects: Object.fromEntries(
180
- (bindings.durable_objects?.bindings ?? []).map<[string, string]>(
181
- (value) => [value.name, value.class_name]
182
- )
183
- ),
184
- ...(localPersistencePath
185
- ? {
186
- kvPersist: path.join(localPersistencePath, "kv"),
187
- durableObjectsPersist: path.join(localPersistencePath, "do"),
188
- cachePersist: path.join(localPersistencePath, "cache"),
189
- }
190
- : {
191
- // We mark these as true, so that they'll
192
- // persist in the temp directory.
193
- // This means they'll persist across a dev session,
194
- // even if we change source and reload,
195
- // and be deleted when the dev session ends
196
- durableObjectsPersist: true,
197
- cachePersist: true,
198
- kvPersist: true,
199
- }),
168
+ const upstream =
169
+ typeof localUpstream === "string"
170
+ ? `${localProtocol}://${localUpstream}`
171
+ : undefined;
200
172
 
201
- sitePath: assetPaths?.assetDirectory
202
- ? path.join(assetPaths.baseDirectory, assetPaths.assetDirectory)
203
- : undefined,
204
- siteInclude: assetPaths?.includePatterns.length
205
- ? assetPaths?.includePatterns
206
- : undefined,
207
- siteExclude: assetPaths?.excludePatterns.length
208
- ? assetPaths.excludePatterns
209
- : undefined,
210
- bindings: bindings.vars,
211
- wasmBindings,
212
- textBlobBindings,
213
- dataBlobBindings,
214
- sourceMap: true,
215
- logUnhandledRejections: true,
216
- crons,
217
- };
173
+ const options: MiniflareOptions = {
174
+ name: workerName,
175
+ port,
176
+ scriptPath,
177
+ https: localProtocol === "https",
178
+ host: ip,
179
+ modules: format === "modules",
180
+ modulesRules: (rules || [])
181
+ .concat(DEFAULT_MODULE_RULES)
182
+ .map(({ type, globs: include, fallthrough }) => ({
183
+ type,
184
+ include,
185
+ fallthrough,
186
+ })),
187
+ compatibilityDate,
188
+ compatibilityFlags,
189
+ kvNamespaces: bindings.kv_namespaces?.map((kv) => kv.binding),
190
+ durableObjects: Object.fromEntries(
191
+ (bindings.durable_objects?.bindings ?? []).map<[string, string]>(
192
+ (value) => [value.name, value.class_name]
193
+ )
194
+ ),
195
+ ...(localPersistencePath
196
+ ? {
197
+ kvPersist: path.join(localPersistencePath, "kv"),
198
+ durableObjectsPersist: path.join(localPersistencePath, "do"),
199
+ cachePersist: path.join(localPersistencePath, "cache"),
200
+ }
201
+ : {
202
+ // We mark these as true, so that they'll
203
+ // persist in the temp directory.
204
+ // This means they'll persist across a dev session,
205
+ // even if we change source and reload,
206
+ // and be deleted when the dev session ends
207
+ durableObjectsPersist: true,
208
+ cachePersist: true,
209
+ kvPersist: true,
210
+ }),
218
211
 
219
- // The path to the Miniflare CLI assumes that this file is being run from
220
- // `wrangler-dist` and that the CLI is found in `miniflare-dist`.
221
- // If either of those paths change this line needs updating.
222
- const miniflareCLIPath = path.resolve(
223
- __dirname,
224
- "../miniflare-dist/index.mjs"
225
- );
226
- const optionsArg = JSON.stringify(options, null);
212
+ sitePath: assetPaths?.assetDirectory
213
+ ? path.join(assetPaths.baseDirectory, assetPaths.assetDirectory)
214
+ : undefined,
215
+ siteInclude: assetPaths?.includePatterns.length
216
+ ? assetPaths?.includePatterns
217
+ : undefined,
218
+ siteExclude: assetPaths?.excludePatterns.length
219
+ ? assetPaths.excludePatterns
220
+ : undefined,
221
+ bindings: bindings.vars,
222
+ wasmBindings,
223
+ textBlobBindings,
224
+ dataBlobBindings,
225
+ sourceMap: true,
226
+ logUnhandledRejections: true,
227
+ crons,
228
+ upstream,
229
+ disableLogs: logLevel === "none",
230
+ };
227
231
 
228
- logger.log("⎔ Starting a local server...");
229
- local.current = spawn(
230
- "node",
231
- [
232
- "--experimental-vm-modules", // ensures that Miniflare can run ESM Workers
233
- "--no-warnings", // hide annoying Node warnings
234
- "--inspect", // start Miniflare listening for a debugger to attach
235
- miniflareCLIPath,
236
- optionsArg,
237
- // "--log=VERBOSE", // uncomment this to Miniflare to log "everything"!
238
- ],
239
- {
240
- cwd: path.dirname(scriptPath),
241
- }
242
- );
232
+ // The path to the Miniflare CLI assumes that this file is being run from
233
+ // `wrangler-dist` and that the CLI is found in `miniflare-dist`.
234
+ // If either of those paths change this line needs updating.
235
+ const miniflareCLIPath = path.resolve(
236
+ __dirname,
237
+ "../miniflare-dist/index.mjs"
238
+ );
239
+ const optionsArg = JSON.stringify(options, null);
243
240
 
244
- local.current.on("close", (code) => {
245
- if (code) {
246
- logger.log(`Miniflare process exited with code ${code}`);
247
- }
248
- });
241
+ logger.log("⎔ Starting a local server...");
242
+ const localServerOptions = [
243
+ "--experimental-vm-modules", // ensures that Miniflare can run ESM Workers
244
+ "--no-warnings", // hide annoying Node warnings
245
+ miniflareCLIPath,
246
+ optionsArg,
247
+ // "--log=VERBOSE", // uncomment this to Miniflare to log "everything"!
248
+ ];
249
+ if (inspect) {
250
+ localServerOptions.push("--inspect"); // start Miniflare listening for a debugger to attach
251
+ }
252
+ // spawn isn't technically synchronous here
253
+ local.current = spawn("node", localServerOptions, {
254
+ cwd: path.dirname(scriptPath),
255
+ });
256
+ //TODO: instead of being lucky with spawn's timing, have miniflare-cli notify wrangler that it's ready in packages/wrangler/src/miniflare-cli/index.ts, after the mf.startScheduler promise resolves
257
+ if (onReady) {
258
+ await new Promise((resolve) => setTimeout(resolve, 200));
259
+ onReady();
260
+ }
249
261
 
250
- local.current.stdout?.on("data", (data: Buffer) => {
251
- process.stdout.write(data);
252
- });
262
+ local.current.on("close", (code) => {
263
+ if (code) {
264
+ logger.log(`Miniflare process exited with code ${code}`);
265
+ }
266
+ });
253
267
 
254
- local.current.stderr?.on("data", (data: Buffer) => {
255
- const matches =
256
- /Debugger listening on (ws:\/\/127\.0\.0\.1:\d+\/[A-Za-z0-9-]+)/.exec(
257
- data.toString()
258
- );
259
- if (matches) {
260
- setInspectorUrl(matches[1]);
261
- }
262
- });
268
+ local.current.stdout?.on("data", (data: Buffer) => {
269
+ process.stdout.write(data);
270
+ });
263
271
 
264
- local.current.on("exit", (code) => {
265
- if (code) {
266
- logger.error(`Miniflare process exited with code ${code}`);
267
- }
268
- });
272
+ // parse the node inspector url (which may be received in chunks) from stderr
273
+ let stderrData = "";
274
+ let inspectorUrlFound = false;
275
+ local.current.stderr?.on("data", (data: Buffer) => {
276
+ if (!inspectorUrlFound) {
277
+ stderrData += data.toString();
278
+ const matches =
279
+ /Debugger listening on (ws:\/\/127\.0\.0\.1:\d+\/[A-Za-z0-9-]+)[\r|\n]/.exec(
280
+ stderrData
281
+ );
282
+ if (matches) {
283
+ inspectorUrlFound = true;
284
+ setInspectorUrl(matches[1]);
285
+ }
286
+ }
269
287
 
270
- local.current.on("error", (error: Error) => {
271
- logger.error(`Miniflare process failed to spawn`);
272
- logger.error(error);
273
- });
288
+ process.stderr.write(data);
289
+ });
274
290
 
275
- removeSignalExitListener.current = onExit((_code, _signal) => {
276
- logger.log("⎔ Shutting down local server.");
277
- local.current?.kill();
278
- local.current = undefined;
279
- });
280
- }
291
+ local.current.on("exit", (code) => {
292
+ if (code) {
293
+ logger.error(`Miniflare process exited with code ${code}`);
294
+ }
295
+ });
281
296
 
282
- startLocalWorker().catch((err) => {
283
- logger.error("local worker:", err);
284
- });
297
+ local.current.on("error", (error: Error) => {
298
+ logger.error(`Miniflare process failed to spawn`);
299
+ logger.error(error);
300
+ });
285
301
 
286
- return () => {
287
- abortController.abort();
288
- if (local.current) {
289
- logger.log("⎔ Shutting down local server.");
290
- local.current?.kill();
291
- local.current = undefined;
292
- removeSignalExitListener.current && removeSignalExitListener.current();
293
- removeSignalExitListener.current = undefined;
294
- }
295
- };
296
- }, [
297
- bundle,
298
- workerName,
299
- format,
300
- port,
301
- ip,
302
- bindings.durable_objects?.bindings,
303
- bindings.kv_namespaces,
304
- bindings.vars,
305
- bindings.services,
306
- compatibilityDate,
307
- compatibilityFlags,
308
- localPersistencePath,
309
- assetPaths,
310
- publicDirectory,
311
- rules,
312
- bindings.wasm_modules,
313
- bindings.text_blobs,
314
- bindings.data_blobs,
315
- crons,
316
- ]);
317
- return { inspectorUrl };
302
+ removeSignalExitListener.current = onExit((_code, _signal) => {
303
+ logger.log("⎔ Shutting down local server.");
304
+ local.current?.kill();
305
+ local.current = undefined;
306
+ });
307
+ }
308
+
309
+ startLocalWorker().catch((err) => {
310
+ logger.error("local worker:", err);
311
+ });
312
+
313
+ return () => {
314
+ abortController.abort();
315
+ if (local.current) {
316
+ logger.log("⎔ Shutting down local server.");
317
+ local.current?.kill();
318
+ local.current = undefined;
319
+ removeSignalExitListener.current && removeSignalExitListener.current();
320
+ removeSignalExitListener.current = undefined;
321
+ }
322
+ };
323
+ }, [
324
+ bundle,
325
+ workerName,
326
+ format,
327
+ port,
328
+ ip,
329
+ bindings.durable_objects?.bindings,
330
+ bindings.kv_namespaces,
331
+ bindings.vars,
332
+ bindings.services,
333
+ compatibilityDate,
334
+ compatibilityFlags,
335
+ localPersistencePath,
336
+ assetPaths,
337
+ isWorkersSite,
338
+ rules,
339
+ bindings.wasm_modules,
340
+ bindings.text_blobs,
341
+ bindings.data_blobs,
342
+ crons,
343
+ localProtocol,
344
+ localUpstream,
345
+ inspect,
346
+ logLevel,
347
+ onReady,
348
+ ]);
349
+ return { inspectorUrl };
318
350
  }