wrangler 2.1.6 → 2.1.8
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.
- package/miniflare-dist/index.mjs +5 -20
- package/package.json +14 -3
- package/src/__tests__/api-dev.test.ts +20 -0
- package/src/__tests__/configuration.test.ts +125 -22
- package/src/__tests__/dev.test.tsx +0 -2
- package/src/__tests__/helpers/mock-oauth-flow.ts +4 -2
- package/src/__tests__/index.test.ts +2 -0
- package/src/__tests__/paths.test.ts +23 -1
- package/src/__tests__/publish.test.ts +8 -10
- package/src/__tests__/user.test.ts +4 -4
- package/src/__tests__/whoami.test.tsx +0 -1
- package/src/__tests__/worker-namespace.test.ts +102 -112
- package/src/api/dev.ts +12 -12
- package/src/bundle.ts +59 -1
- package/src/cfetch/internal.ts +37 -21
- package/src/config/environment.ts +20 -0
- package/src/config/index.ts +32 -0
- package/src/config/validation.ts +59 -0
- package/src/config-cache.ts +1 -1
- package/src/create-worker-upload-form.ts +9 -0
- package/src/d1/backups.tsx +212 -0
- package/src/d1/create.tsx +54 -0
- package/src/d1/delete.tsx +56 -0
- package/src/d1/execute.tsx +294 -0
- package/src/d1/formatTimeAgo.ts +14 -0
- package/src/d1/index.ts +75 -0
- package/src/d1/list.tsx +48 -0
- package/src/d1/options.ts +12 -0
- package/src/d1/types.tsx +14 -0
- package/src/d1/utils.ts +39 -0
- package/src/dev/dev.tsx +30 -3
- package/src/dev/get-local-persistence-path.tsx +31 -0
- package/src/dev/local.tsx +73 -11
- package/src/dev/start-server.ts +6 -3
- package/src/dev/use-esbuild.ts +12 -1
- package/src/dev.tsx +48 -29
- package/src/dialogs.tsx +4 -0
- package/src/environment-variables.ts +17 -2
- package/src/index.tsx +18 -16
- package/src/logger.ts +11 -4
- package/src/miniflare-cli/index.ts +11 -16
- package/src/pages/dev.tsx +13 -9
- package/src/paths.ts +30 -4
- package/src/proxy.ts +21 -1
- package/src/publish.ts +7 -0
- package/src/user/user.tsx +1 -0
- package/src/worker.ts +30 -0
- package/templates/d1-beta-facade.js +174 -0
- package/templates/experimental-local-cache-stubs.js +27 -0
- package/wrangler-dist/cli.d.ts +438 -7
- package/wrangler-dist/cli.js +11679 -3911
- package/src/miniflare-cli/enum-keys.ts +0 -17
package/src/dev/local.tsx
CHANGED
|
@@ -2,6 +2,7 @@ import { fork } from "node:child_process";
|
|
|
2
2
|
import { realpathSync } from "node:fs";
|
|
3
3
|
import { writeFile } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
+
import { npxImport } from "npx-import";
|
|
5
6
|
import { useState, useEffect, useRef } from "react";
|
|
6
7
|
import onExit from "signal-exit";
|
|
7
8
|
import { registerWorker } from "../dev-registry";
|
|
@@ -24,10 +25,20 @@ import type {
|
|
|
24
25
|
CfKvNamespace,
|
|
25
26
|
CfR2Bucket,
|
|
26
27
|
CfVars,
|
|
28
|
+
CfD1Database,
|
|
27
29
|
} from "../worker";
|
|
28
30
|
import type { EsbuildBundle } from "./use-esbuild";
|
|
31
|
+
import type {
|
|
32
|
+
Miniflare as Miniflare3Type,
|
|
33
|
+
MiniflareOptions as Miniflare3Options,
|
|
34
|
+
} from "@miniflare/tre";
|
|
29
35
|
import type { MiniflareOptions } from "miniflare";
|
|
30
36
|
import type { ChildProcess } from "node:child_process";
|
|
37
|
+
|
|
38
|
+
// caching of the miniflare package
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
40
|
+
let Miniflare: typeof import("@miniflare/tre")["Miniflare"];
|
|
41
|
+
|
|
31
42
|
export interface LocalProps {
|
|
32
43
|
name: string | undefined;
|
|
33
44
|
bundle: EsbuildBundle | undefined;
|
|
@@ -49,10 +60,10 @@ export interface LocalProps {
|
|
|
49
60
|
localUpstream: string | undefined;
|
|
50
61
|
inspect: boolean;
|
|
51
62
|
onReady: ((ip: string, port: number) => void) | undefined;
|
|
52
|
-
logLevel: "none" | "error" | "log" | "warn" | "debug" | undefined;
|
|
53
63
|
logPrefix?: string;
|
|
54
64
|
enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
|
|
55
65
|
testScheduled?: boolean;
|
|
66
|
+
experimentalLocal?: boolean;
|
|
56
67
|
}
|
|
57
68
|
|
|
58
69
|
export function Local(props: LocalProps) {
|
|
@@ -65,6 +76,10 @@ export function Local(props: LocalProps) {
|
|
|
65
76
|
return null;
|
|
66
77
|
}
|
|
67
78
|
|
|
79
|
+
function arrayToObject(values: string[] = []): Record<string, string> {
|
|
80
|
+
return Object.fromEntries(values.map((value) => [value, value]));
|
|
81
|
+
}
|
|
82
|
+
|
|
68
83
|
function useLocalWorker({
|
|
69
84
|
name: workerName,
|
|
70
85
|
bundle,
|
|
@@ -86,12 +101,13 @@ function useLocalWorker({
|
|
|
86
101
|
localUpstream,
|
|
87
102
|
inspect,
|
|
88
103
|
onReady,
|
|
89
|
-
logLevel,
|
|
90
104
|
logPrefix,
|
|
91
105
|
enablePagesAssetsServiceBinding,
|
|
106
|
+
experimentalLocal,
|
|
92
107
|
}: LocalProps) {
|
|
93
108
|
// TODO: pass vars via command line
|
|
94
109
|
const local = useRef<ChildProcess>();
|
|
110
|
+
const experimentalLocalRef = useRef<Miniflare3Type>();
|
|
95
111
|
const removeSignalExitListener = useRef<() => void>();
|
|
96
112
|
const [inspectorUrl, setInspectorUrl] = useState<string | undefined>();
|
|
97
113
|
|
|
@@ -171,6 +187,7 @@ function useLocalWorker({
|
|
|
171
187
|
usageModel,
|
|
172
188
|
kv_namespaces: bindings?.kv_namespaces,
|
|
173
189
|
r2_buckets: bindings?.r2_buckets,
|
|
190
|
+
d1_databases: bindings?.d1_databases,
|
|
174
191
|
internalDurableObjects,
|
|
175
192
|
externalDurableObjects,
|
|
176
193
|
localPersistencePath,
|
|
@@ -182,12 +199,45 @@ function useLocalWorker({
|
|
|
182
199
|
dataBlobBindings,
|
|
183
200
|
crons,
|
|
184
201
|
upstream,
|
|
185
|
-
logLevel,
|
|
186
202
|
logPrefix,
|
|
187
203
|
workerDefinitions,
|
|
188
204
|
enablePagesAssetsServiceBinding,
|
|
189
205
|
});
|
|
190
206
|
|
|
207
|
+
if (experimentalLocal) {
|
|
208
|
+
// TODO: refactor setupMiniflareOptions so we don't need to parse here
|
|
209
|
+
const miniflare2Options: MiniflareOptions = JSON.parse(forkOptions[0]);
|
|
210
|
+
const options: Miniflare3Options = {
|
|
211
|
+
...miniflare2Options,
|
|
212
|
+
// Miniflare 3 distinguishes between binding name and namespace/bucket
|
|
213
|
+
// IDs. For now, just use the same value as we did in Miniflare 2.
|
|
214
|
+
// TODO: use defined KV preview ID if any
|
|
215
|
+
kvNamespaces: arrayToObject(miniflare2Options.kvNamespaces),
|
|
216
|
+
r2Buckets: arrayToObject(miniflare2Options.r2Buckets),
|
|
217
|
+
// TODO: pass-through collected modules instead of getting Miniflare
|
|
218
|
+
// to collect them again
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
logger.log("⎔ Starting an experimental local server...");
|
|
222
|
+
|
|
223
|
+
if (Miniflare === undefined) {
|
|
224
|
+
({ Miniflare } = await npxImport<
|
|
225
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
226
|
+
typeof import("@miniflare/tre")
|
|
227
|
+
>("@miniflare/tre"));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const mf = new Miniflare(options);
|
|
231
|
+
experimentalLocalRef.current = mf;
|
|
232
|
+
removeSignalExitListener.current = onExit((_code, _signal) => {
|
|
233
|
+
logger.log("⎔ Shutting down experimental local server.");
|
|
234
|
+
mf.dispose();
|
|
235
|
+
experimentalLocalRef.current = undefined;
|
|
236
|
+
});
|
|
237
|
+
await mf.ready;
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
|
|
191
241
|
const nodeOptions = setupNodeOptions({ inspect, ip, inspectorPort });
|
|
192
242
|
logger.log("⎔ Starting a local server...");
|
|
193
243
|
|
|
@@ -280,9 +330,16 @@ function useLocalWorker({
|
|
|
280
330
|
logger.log("⎔ Shutting down local server.");
|
|
281
331
|
local.current?.kill();
|
|
282
332
|
local.current = undefined;
|
|
283
|
-
removeSignalExitListener.current && removeSignalExitListener.current();
|
|
284
|
-
removeSignalExitListener.current = undefined;
|
|
285
333
|
}
|
|
334
|
+
if (experimentalLocalRef.current) {
|
|
335
|
+
logger.log("⎔ Shutting down experimental local server.");
|
|
336
|
+
// Initialisation errors are also thrown asynchronously by dispose().
|
|
337
|
+
// The catch() above should've caught them though.
|
|
338
|
+
experimentalLocalRef.current?.dispose().catch(() => {});
|
|
339
|
+
experimentalLocalRef.current = undefined;
|
|
340
|
+
}
|
|
341
|
+
removeSignalExitListener.current?.();
|
|
342
|
+
removeSignalExitListener.current = undefined;
|
|
286
343
|
};
|
|
287
344
|
}, [
|
|
288
345
|
bundle,
|
|
@@ -294,6 +351,7 @@ function useLocalWorker({
|
|
|
294
351
|
bindings.durable_objects,
|
|
295
352
|
bindings.kv_namespaces,
|
|
296
353
|
bindings.r2_buckets,
|
|
354
|
+
bindings.d1_databases,
|
|
297
355
|
bindings.vars,
|
|
298
356
|
bindings.services,
|
|
299
357
|
workerDefinitions,
|
|
@@ -311,10 +369,10 @@ function useLocalWorker({
|
|
|
311
369
|
localProtocol,
|
|
312
370
|
localUpstream,
|
|
313
371
|
inspect,
|
|
314
|
-
logLevel,
|
|
315
372
|
logPrefix,
|
|
316
373
|
onReady,
|
|
317
374
|
enablePagesAssetsServiceBinding,
|
|
375
|
+
experimentalLocal,
|
|
318
376
|
]);
|
|
319
377
|
return { inspectorUrl };
|
|
320
378
|
}
|
|
@@ -414,6 +472,7 @@ interface SetupMiniflareOptionsProps {
|
|
|
414
472
|
usageModel: "bundled" | "unbound" | undefined;
|
|
415
473
|
kv_namespaces: CfKvNamespace[] | undefined;
|
|
416
474
|
r2_buckets: CfR2Bucket[] | undefined;
|
|
475
|
+
d1_databases: CfD1Database[] | undefined;
|
|
417
476
|
internalDurableObjects: CfDurableObject[];
|
|
418
477
|
externalDurableObjects: CfDurableObject[];
|
|
419
478
|
localPersistencePath: string | null;
|
|
@@ -425,7 +484,6 @@ interface SetupMiniflareOptionsProps {
|
|
|
425
484
|
dataBlobBindings: Record<string, string>;
|
|
426
485
|
crons: Config["triggers"]["crons"];
|
|
427
486
|
upstream: string | undefined;
|
|
428
|
-
logLevel: "none" | "error" | "log" | "warn" | "debug" | undefined;
|
|
429
487
|
logPrefix: string | undefined;
|
|
430
488
|
workerDefinitions: WorkerRegistry | undefined;
|
|
431
489
|
enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
|
|
@@ -444,6 +502,7 @@ export function setupMiniflareOptions({
|
|
|
444
502
|
usageModel,
|
|
445
503
|
kv_namespaces,
|
|
446
504
|
r2_buckets,
|
|
505
|
+
d1_databases,
|
|
447
506
|
internalDurableObjects,
|
|
448
507
|
externalDurableObjects,
|
|
449
508
|
localPersistencePath,
|
|
@@ -455,12 +514,13 @@ export function setupMiniflareOptions({
|
|
|
455
514
|
dataBlobBindings,
|
|
456
515
|
crons,
|
|
457
516
|
upstream,
|
|
458
|
-
logLevel,
|
|
459
517
|
logPrefix,
|
|
460
518
|
workerDefinitions,
|
|
461
519
|
enablePagesAssetsServiceBinding,
|
|
462
|
-
}: SetupMiniflareOptionsProps):
|
|
463
|
-
|
|
520
|
+
}: SetupMiniflareOptionsProps): {
|
|
521
|
+
miniflareCLIPath: string;
|
|
522
|
+
forkOptions: string[];
|
|
523
|
+
} {
|
|
464
524
|
// It's now getting _really_ messy now with Pages ASSETS binding outside and the external Durable Objects inside.
|
|
465
525
|
const options = {
|
|
466
526
|
name: workerName,
|
|
@@ -511,12 +571,14 @@ export function setupMiniflareOptions({
|
|
|
511
571
|
})
|
|
512
572
|
.filter(([_, details]) => !!details)
|
|
513
573
|
),
|
|
574
|
+
d1Databases: d1_databases?.map((db) => db.binding),
|
|
514
575
|
...(localPersistencePath
|
|
515
576
|
? {
|
|
516
577
|
cachePersist: path.join(localPersistencePath, "cache"),
|
|
517
578
|
durableObjectsPersist: path.join(localPersistencePath, "do"),
|
|
518
579
|
kvPersist: path.join(localPersistencePath, "kv"),
|
|
519
580
|
r2Persist: path.join(localPersistencePath, "r2"),
|
|
581
|
+
d1Persist: path.join(localPersistencePath, "d1"),
|
|
520
582
|
}
|
|
521
583
|
: {
|
|
522
584
|
// We mark these as true, so that they'll
|
|
@@ -548,7 +610,7 @@ export function setupMiniflareOptions({
|
|
|
548
610
|
logUnhandledRejections: true,
|
|
549
611
|
crons,
|
|
550
612
|
upstream,
|
|
551
|
-
|
|
613
|
+
logLevel: logger.loggerLevel,
|
|
552
614
|
logOptions: logPrefix ? { prefix: logPrefix } : undefined,
|
|
553
615
|
enablePagesAssetsServiceBinding,
|
|
554
616
|
};
|
package/src/dev/start-server.ts
CHANGED
|
@@ -91,6 +91,7 @@ export async function startDevServer(
|
|
|
91
91
|
services: props.bindings.services,
|
|
92
92
|
firstPartyWorkerDevFacade: props.firstPartyWorker,
|
|
93
93
|
testScheduled: props.testScheduled,
|
|
94
|
+
experimentalLocalStubCache: props.experimentalLocal,
|
|
94
95
|
});
|
|
95
96
|
|
|
96
97
|
//run local now
|
|
@@ -111,7 +112,6 @@ export async function startDevServer(
|
|
|
111
112
|
crons: props.crons,
|
|
112
113
|
localProtocol: props.localProtocol,
|
|
113
114
|
localUpstream: props.localUpstream,
|
|
114
|
-
logLevel: props.logLevel,
|
|
115
115
|
logPrefix: props.logPrefix,
|
|
116
116
|
inspect: props.inspect,
|
|
117
117
|
onReady: props.onReady,
|
|
@@ -160,6 +160,7 @@ async function runEsbuild({
|
|
|
160
160
|
services,
|
|
161
161
|
firstPartyWorkerDevFacade,
|
|
162
162
|
testScheduled,
|
|
163
|
+
experimentalLocalStubCache,
|
|
163
164
|
}: {
|
|
164
165
|
entry: Entry;
|
|
165
166
|
destination: string | undefined;
|
|
@@ -177,6 +178,7 @@ async function runEsbuild({
|
|
|
177
178
|
workerDefinitions: WorkerRegistry;
|
|
178
179
|
firstPartyWorkerDevFacade: boolean | undefined;
|
|
179
180
|
testScheduled?: boolean;
|
|
181
|
+
experimentalLocalStubCache: boolean | undefined;
|
|
180
182
|
}): Promise<EsbuildBundle | undefined> {
|
|
181
183
|
if (!destination) return;
|
|
182
184
|
|
|
@@ -212,7 +214,9 @@ async function runEsbuild({
|
|
|
212
214
|
services,
|
|
213
215
|
firstPartyWorkerDevFacade,
|
|
214
216
|
targetConsumer: "dev", // We are starting a dev server
|
|
217
|
+
local: false,
|
|
215
218
|
testScheduled,
|
|
219
|
+
experimentalLocalStubCache,
|
|
216
220
|
});
|
|
217
221
|
|
|
218
222
|
return {
|
|
@@ -246,7 +250,6 @@ export async function startLocalServer({
|
|
|
246
250
|
localUpstream,
|
|
247
251
|
inspect,
|
|
248
252
|
onReady,
|
|
249
|
-
logLevel,
|
|
250
253
|
logPrefix,
|
|
251
254
|
enablePagesAssetsServiceBinding,
|
|
252
255
|
}: LocalProps) {
|
|
@@ -321,6 +324,7 @@ export async function startLocalServer({
|
|
|
321
324
|
usageModel,
|
|
322
325
|
kv_namespaces: bindings?.kv_namespaces,
|
|
323
326
|
r2_buckets: bindings?.r2_buckets,
|
|
327
|
+
d1_databases: bindings?.d1_databases,
|
|
324
328
|
internalDurableObjects,
|
|
325
329
|
externalDurableObjects,
|
|
326
330
|
localPersistencePath,
|
|
@@ -332,7 +336,6 @@ export async function startLocalServer({
|
|
|
332
336
|
dataBlobBindings,
|
|
333
337
|
crons,
|
|
334
338
|
upstream,
|
|
335
|
-
logLevel,
|
|
336
339
|
logPrefix,
|
|
337
340
|
workerDefinitions,
|
|
338
341
|
enablePagesAssetsServiceBinding,
|
package/src/dev/use-esbuild.ts
CHANGED
|
@@ -30,14 +30,17 @@ export function useEsbuild({
|
|
|
30
30
|
tsconfig,
|
|
31
31
|
minify,
|
|
32
32
|
nodeCompat,
|
|
33
|
+
betaD1Shims,
|
|
33
34
|
define,
|
|
34
35
|
noBundle,
|
|
35
36
|
workerDefinitions,
|
|
36
37
|
services,
|
|
37
38
|
durableObjects,
|
|
38
39
|
firstPartyWorkerDevFacade,
|
|
40
|
+
local,
|
|
39
41
|
targetConsumer,
|
|
40
42
|
testScheduled,
|
|
43
|
+
experimentalLocalStubCache,
|
|
41
44
|
}: {
|
|
42
45
|
entry: Entry;
|
|
43
46
|
destination: string | undefined;
|
|
@@ -51,12 +54,15 @@ export function useEsbuild({
|
|
|
51
54
|
tsconfig: string | undefined;
|
|
52
55
|
minify: boolean | undefined;
|
|
53
56
|
nodeCompat: boolean | undefined;
|
|
57
|
+
betaD1Shims?: string[];
|
|
54
58
|
noBundle: boolean;
|
|
55
59
|
workerDefinitions: WorkerRegistry;
|
|
56
60
|
durableObjects: Config["durable_objects"];
|
|
57
61
|
firstPartyWorkerDevFacade: boolean | undefined;
|
|
62
|
+
local: boolean;
|
|
58
63
|
targetConsumer: "dev" | "publish";
|
|
59
64
|
testScheduled: boolean;
|
|
65
|
+
experimentalLocalStubCache: boolean | undefined;
|
|
60
66
|
}): EsbuildBundle | undefined {
|
|
61
67
|
const [bundle, setBundle] = useState<EsbuildBundle>();
|
|
62
68
|
const { exit } = useApp();
|
|
@@ -110,6 +116,7 @@ export function useEsbuild({
|
|
|
110
116
|
tsconfig,
|
|
111
117
|
minify,
|
|
112
118
|
nodeCompat,
|
|
119
|
+
betaD1Shims,
|
|
113
120
|
define,
|
|
114
121
|
checkFetch: true,
|
|
115
122
|
assets: assets && {
|
|
@@ -120,8 +127,10 @@ export function useEsbuild({
|
|
|
120
127
|
workerDefinitions,
|
|
121
128
|
services,
|
|
122
129
|
firstPartyWorkerDevFacade,
|
|
130
|
+
local,
|
|
123
131
|
targetConsumer,
|
|
124
132
|
testScheduled,
|
|
133
|
+
experimentalLocalStubCache,
|
|
125
134
|
});
|
|
126
135
|
|
|
127
136
|
// Capture the `stop()` method to use as the `useEffect()` destructor.
|
|
@@ -140,7 +149,6 @@ export function useEsbuild({
|
|
|
140
149
|
watcher.close();
|
|
141
150
|
};
|
|
142
151
|
}
|
|
143
|
-
|
|
144
152
|
setBundle({
|
|
145
153
|
id: 0,
|
|
146
154
|
entry,
|
|
@@ -179,8 +187,11 @@ export function useEsbuild({
|
|
|
179
187
|
durableObjects,
|
|
180
188
|
workerDefinitions,
|
|
181
189
|
firstPartyWorkerDevFacade,
|
|
190
|
+
betaD1Shims,
|
|
191
|
+
local,
|
|
182
192
|
targetConsumer,
|
|
183
193
|
testScheduled,
|
|
194
|
+
experimentalLocalStubCache,
|
|
184
195
|
]);
|
|
185
196
|
return bundle;
|
|
186
197
|
}
|
package/src/dev.tsx
CHANGED
|
@@ -6,6 +6,7 @@ import React from "react";
|
|
|
6
6
|
import { findWranglerToml, printBindings, readConfig } from "./config";
|
|
7
7
|
import Dev from "./dev/dev";
|
|
8
8
|
import { getVarsForDev } from "./dev/dev-vars";
|
|
9
|
+
import { getLocalPersistencePath } from "./dev/get-local-persistence-path";
|
|
9
10
|
|
|
10
11
|
import { startDevServer } from "./dev/start-server";
|
|
11
12
|
import { getEntry } from "./entry";
|
|
@@ -13,18 +14,19 @@ import { logger } from "./logger";
|
|
|
13
14
|
import * as metrics from "./metrics";
|
|
14
15
|
import { getAssetPaths, getSiteAssetPaths } from "./sites";
|
|
15
16
|
import { getAccountFromCache } from "./user";
|
|
16
|
-
import {
|
|
17
|
+
import { identifyD1BindingsAsBeta } from "./worker";
|
|
18
|
+
import { getHostFromRoute, getZoneForRoute, getZoneIdFromHost } from "./zones";
|
|
17
19
|
import {
|
|
18
|
-
printWranglerBanner,
|
|
19
|
-
DEFAULT_LOCAL_PORT,
|
|
20
20
|
type ConfigPath,
|
|
21
|
-
|
|
21
|
+
DEFAULT_INSPECTOR_PORT,
|
|
22
|
+
DEFAULT_LOCAL_PORT,
|
|
22
23
|
getDevCompatibilityDate,
|
|
23
24
|
getRules,
|
|
25
|
+
getScriptName,
|
|
24
26
|
isLegacyEnv,
|
|
25
|
-
|
|
27
|
+
printWranglerBanner,
|
|
26
28
|
} from "./index";
|
|
27
|
-
import type { Config } from "./config";
|
|
29
|
+
import type { Config, Environment } from "./config";
|
|
28
30
|
import type { Route } from "./config/environment";
|
|
29
31
|
import type { EnablePagesAssetsServiceBindingOptions } from "./miniflare-cli";
|
|
30
32
|
import type { CfWorkerInit } from "./worker";
|
|
@@ -60,6 +62,7 @@ interface DevArgs {
|
|
|
60
62
|
"jsx-fragment"?: string;
|
|
61
63
|
tsconfig?: string;
|
|
62
64
|
local?: boolean;
|
|
65
|
+
"experimental-local"?: boolean;
|
|
63
66
|
minify?: boolean;
|
|
64
67
|
var?: string[];
|
|
65
68
|
define?: string[];
|
|
@@ -69,7 +72,7 @@ interface DevArgs {
|
|
|
69
72
|
"persist-to"?: string;
|
|
70
73
|
"live-reload"?: boolean;
|
|
71
74
|
onReady?: (ip: string, port: number) => void;
|
|
72
|
-
logLevel?: "none" | "error" | "log" | "warn" | "debug";
|
|
75
|
+
logLevel?: "none" | "info" | "error" | "log" | "warn" | "debug";
|
|
73
76
|
logPrefix?: string;
|
|
74
77
|
showInteractiveDevSession?: boolean;
|
|
75
78
|
"test-scheduled"?: boolean;
|
|
@@ -232,6 +235,20 @@ export function devOptions(yargs: Argv): Argv<DevArgs> {
|
|
|
232
235
|
type: "boolean",
|
|
233
236
|
default: false, // I bet this will a point of contention. We'll revisit it.
|
|
234
237
|
})
|
|
238
|
+
.option("experimental-local", {
|
|
239
|
+
describe: "Run on my machine using the Cloudflare Workers runtime",
|
|
240
|
+
type: "boolean",
|
|
241
|
+
default: false,
|
|
242
|
+
})
|
|
243
|
+
.check((argv) => {
|
|
244
|
+
if (argv.local && argv["experimental-local"]) {
|
|
245
|
+
throw new Error(
|
|
246
|
+
"--local and --experimental-local are mutually exclusive. " +
|
|
247
|
+
"Please select one or the other."
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
return true;
|
|
251
|
+
})
|
|
235
252
|
.option("minify", {
|
|
236
253
|
describe: "Minify the script",
|
|
237
254
|
type: "boolean",
|
|
@@ -280,7 +297,6 @@ export function devOptions(yargs: Argv): Argv<DevArgs> {
|
|
|
280
297
|
default: false,
|
|
281
298
|
})
|
|
282
299
|
.option("log-level", {
|
|
283
|
-
// "none" will currently default to "error" for Wrangler Logger
|
|
284
300
|
choices: ["debug", "info", "log", "warn", "error", "none"] as const,
|
|
285
301
|
describe: "Specify logging level",
|
|
286
302
|
default: "log",
|
|
@@ -320,6 +336,7 @@ export type AdditionalDevProps = {
|
|
|
320
336
|
bucket_name: string;
|
|
321
337
|
preview_bucket_name?: string;
|
|
322
338
|
}[];
|
|
339
|
+
d1Databases?: Environment["d1_databases"];
|
|
323
340
|
};
|
|
324
341
|
|
|
325
342
|
type StartDevOptions = ArgumentsCamelCase<DevArgs> &
|
|
@@ -335,8 +352,7 @@ export async function startDev(args: StartDevOptions) {
|
|
|
335
352
|
let rerender: (node: React.ReactNode) => void | undefined;
|
|
336
353
|
try {
|
|
337
354
|
if (args.logLevel) {
|
|
338
|
-
|
|
339
|
-
logger.loggerLevel = args.logLevel === "none" ? "error" : args.logLevel;
|
|
355
|
+
logger.loggerLevel = args.logLevel;
|
|
340
356
|
}
|
|
341
357
|
await printWranglerBanner();
|
|
342
358
|
|
|
@@ -404,7 +420,9 @@ export async function startDev(args: StartDevOptions) {
|
|
|
404
420
|
nodeCompat={nodeCompat}
|
|
405
421
|
build={configParam.build || {}}
|
|
406
422
|
define={{ ...configParam.define, ...cliDefines }}
|
|
407
|
-
initialMode={
|
|
423
|
+
initialMode={
|
|
424
|
+
args.local || args.experimentalLocal ? "local" : "remote"
|
|
425
|
+
}
|
|
408
426
|
jsxFactory={args["jsx-factory"] || configParam.jsx_factory}
|
|
409
427
|
jsxFragment={args["jsx-fragment"] || configParam.jsx_fragment}
|
|
410
428
|
tsconfig={args.tsconfig ?? configParam.tsconfig}
|
|
@@ -434,7 +452,6 @@ export async function startDev(args: StartDevOptions) {
|
|
|
434
452
|
usageModel={configParam.usage_model}
|
|
435
453
|
bindings={bindings}
|
|
436
454
|
crons={configParam.triggers.crons}
|
|
437
|
-
logLevel={args.logLevel}
|
|
438
455
|
logPrefix={args.logPrefix}
|
|
439
456
|
onReady={args.onReady}
|
|
440
457
|
inspect={args.inspect ?? true}
|
|
@@ -444,6 +461,7 @@ export async function startDev(args: StartDevOptions) {
|
|
|
444
461
|
firstPartyWorker={configParam.first_party_worker}
|
|
445
462
|
sendMetrics={configParam.send_metrics}
|
|
446
463
|
testScheduled={args["test-scheduled"]}
|
|
464
|
+
experimentalLocal={args.experimentalLocal}
|
|
447
465
|
/>
|
|
448
466
|
);
|
|
449
467
|
}
|
|
@@ -464,8 +482,7 @@ export async function startDev(args: StartDevOptions) {
|
|
|
464
482
|
|
|
465
483
|
export async function startApiDev(args: StartDevOptions) {
|
|
466
484
|
if (args.logLevel) {
|
|
467
|
-
|
|
468
|
-
logger.loggerLevel = args.logLevel === "none" ? "error" : args.logLevel;
|
|
485
|
+
logger.loggerLevel = args.logLevel;
|
|
469
486
|
}
|
|
470
487
|
await printWranglerBanner();
|
|
471
488
|
|
|
@@ -501,9 +518,13 @@ export async function startApiDev(args: StartDevOptions) {
|
|
|
501
518
|
configParam
|
|
502
519
|
);
|
|
503
520
|
|
|
521
|
+
//if args.bundle is on, don't disable bundling
|
|
522
|
+
//if there's no args.bundle, and configParam.no_bundle is on, disable bundling
|
|
523
|
+
//otherwise, enable bundling
|
|
524
|
+
const enableBundling = args.bundle ?? !configParam.no_bundle;
|
|
504
525
|
return await startDevServer({
|
|
505
526
|
name: getScriptName({ name: args.name, env: args.env }, configParam),
|
|
506
|
-
noBundle: !
|
|
527
|
+
noBundle: !enableBundling,
|
|
507
528
|
entry: entry,
|
|
508
529
|
env: args.env,
|
|
509
530
|
zone: zoneId,
|
|
@@ -522,7 +543,7 @@ export async function startApiDev(args: StartDevOptions) {
|
|
|
522
543
|
upstreamProtocol: upstreamProtocol,
|
|
523
544
|
localProtocol: args.localProtocol || configParam.dev.local_protocol,
|
|
524
545
|
localUpstream: args["local-upstream"] || host,
|
|
525
|
-
localPersistencePath
|
|
546
|
+
localPersistencePath,
|
|
526
547
|
liveReload: args.liveReload || false,
|
|
527
548
|
accountId: configParam.account_id || getAccountFromCache()?.id,
|
|
528
549
|
assetPaths: assetPaths,
|
|
@@ -547,7 +568,6 @@ export async function startApiDev(args: StartDevOptions) {
|
|
|
547
568
|
usageModel: configParam.usage_model,
|
|
548
569
|
bindings: bindings,
|
|
549
570
|
crons: configParam.triggers.crons,
|
|
550
|
-
logLevel: args.logLevel,
|
|
551
571
|
logPrefix: args.logPrefix,
|
|
552
572
|
onReady: args.onReady,
|
|
553
573
|
inspect: args.inspect ?? true,
|
|
@@ -558,6 +578,7 @@ export async function startApiDev(args: StartDevOptions) {
|
|
|
558
578
|
firstPartyWorker: configParam.first_party_worker,
|
|
559
579
|
sendMetrics: configParam.send_metrics,
|
|
560
580
|
testScheduled: args.testScheduled,
|
|
581
|
+
experimentalLocal: undefined,
|
|
561
582
|
});
|
|
562
583
|
}
|
|
563
584
|
|
|
@@ -683,7 +704,6 @@ async function validateDevServerSettings(
|
|
|
683
704
|
"The --assets argument is experimental and may change or break at any time"
|
|
684
705
|
);
|
|
685
706
|
}
|
|
686
|
-
|
|
687
707
|
const upstreamProtocol =
|
|
688
708
|
args["upstream-protocol"] || config.dev.upstream_protocol;
|
|
689
709
|
if (upstreamProtocol === "http") {
|
|
@@ -708,17 +728,11 @@ async function validateDevServerSettings(
|
|
|
708
728
|
);
|
|
709
729
|
}
|
|
710
730
|
|
|
711
|
-
const localPersistencePath =
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
// if one can be found, otherwise cwd()
|
|
717
|
-
path.resolve(
|
|
718
|
-
config.configPath ? path.dirname(config.configPath) : process.cwd(),
|
|
719
|
-
".wrangler/state"
|
|
720
|
-
)
|
|
721
|
-
: null;
|
|
731
|
+
const localPersistencePath = getLocalPersistencePath(
|
|
732
|
+
args.persistTo,
|
|
733
|
+
Boolean(args.persist),
|
|
734
|
+
config.configPath
|
|
735
|
+
);
|
|
722
736
|
|
|
723
737
|
const cliDefines =
|
|
724
738
|
args.define?.reduce<Record<string, string>>((collectDefines, d) => {
|
|
@@ -758,6 +772,7 @@ async function getBindingsAndAssetPaths(
|
|
|
758
772
|
vars: { ...args.vars, ...cliVars },
|
|
759
773
|
durableObjects: args.durableObjects,
|
|
760
774
|
r2: args.r2,
|
|
775
|
+
d1Databases: args.d1Databases,
|
|
761
776
|
});
|
|
762
777
|
|
|
763
778
|
const maskedVars = maskVars(bindings, configParam);
|
|
@@ -844,6 +859,10 @@ async function getBindings(
|
|
|
844
859
|
services: configParam.services,
|
|
845
860
|
unsafe: configParam.unsafe?.bindings,
|
|
846
861
|
logfwdr: configParam.logfwdr,
|
|
862
|
+
d1_databases: identifyD1BindingsAsBeta([
|
|
863
|
+
...configParam.d1_databases,
|
|
864
|
+
...(args.d1Databases || []),
|
|
865
|
+
]),
|
|
847
866
|
};
|
|
848
867
|
|
|
849
868
|
return bindings;
|
package/src/dialogs.tsx
CHANGED
|
@@ -138,6 +138,10 @@ export function select(
|
|
|
138
138
|
});
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
export function logDim(msg: string) {
|
|
142
|
+
console.log(chalk.gray(msg));
|
|
143
|
+
}
|
|
144
|
+
|
|
141
145
|
export async function fromDashMessagePrompt(
|
|
142
146
|
deploySource: "dash" | "wrangler" | "api"
|
|
143
147
|
): Promise<boolean | void> {
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import { logger } from "./logger";
|
|
2
2
|
|
|
3
|
+
type VariableNames =
|
|
4
|
+
| "CLOUDFLARE_ACCOUNT_ID"
|
|
5
|
+
| "CLOUDFLARE_API_TOKEN"
|
|
6
|
+
| "CLOUDFLARE_API_KEY"
|
|
7
|
+
| "CLOUDFLARE_EMAIL"
|
|
8
|
+
| "WRANGLER_SEND_METRICS"
|
|
9
|
+
| "CLOUDFLARE_API_BASE_URL"
|
|
10
|
+
| "WRANGLER_LOG";
|
|
11
|
+
|
|
12
|
+
type DeprecatedNames =
|
|
13
|
+
| "CF_ACCOUNT_ID"
|
|
14
|
+
| "CF_API_TOKEN"
|
|
15
|
+
| "CF_API_KEY"
|
|
16
|
+
| "CF_EMAIL"
|
|
17
|
+
| "CF_API_BASE_URL";
|
|
3
18
|
/**
|
|
4
19
|
* Create a function used to access an environment variable.
|
|
5
20
|
*
|
|
@@ -11,8 +26,8 @@ export function getEnvironmentVariableFactory({
|
|
|
11
26
|
deprecatedName,
|
|
12
27
|
defaultValue,
|
|
13
28
|
}: {
|
|
14
|
-
variableName:
|
|
15
|
-
deprecatedName?:
|
|
29
|
+
variableName: VariableNames;
|
|
30
|
+
deprecatedName?: DeprecatedNames;
|
|
16
31
|
defaultValue?: string;
|
|
17
32
|
}) {
|
|
18
33
|
let hasWarned = false;
|