wrangler 0.0.0-e6e1daba → 0.0.0-e7cf0caa
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/bin/wrangler.js +1 -1
- package/miniflare-dist/index.mjs +1 -1
- package/package.json +14 -9
- package/src/__tests__/api-devregistry.test.ts +121 -0
- package/src/__tests__/api.test.ts +27 -5
- package/src/__tests__/configuration.test.ts +294 -18
- package/src/__tests__/d1/execute.test.ts +3 -1
- package/src/__tests__/d1/migrate.test.ts +2 -0
- package/src/__tests__/delete.test.ts +6 -0
- package/src/__tests__/deployments.test.ts +335 -95
- package/src/__tests__/dev.test.tsx +87 -57
- package/src/__tests__/generate.test.ts +3 -4
- package/src/__tests__/helpers/mock-console.ts +6 -0
- package/src/__tests__/helpers/msw/handlers/deployments.ts +70 -3
- package/src/__tests__/helpers/msw/index.ts +4 -2
- package/src/__tests__/helpers/worker-scripts/parent-worker.js +4 -1
- package/src/__tests__/index.test.ts +10 -4
- package/src/__tests__/init.test.ts +136 -104
- package/src/__tests__/jest.setup.ts +4 -0
- package/src/__tests__/kv.test.ts +9 -9
- package/src/__tests__/logger.test.ts +68 -2
- package/src/__tests__/middleware.scheduled.test.ts +2 -2
- package/src/__tests__/middleware.test.ts +4 -3
- package/src/__tests__/mtls-certificates.test.ts +5 -2
- package/src/__tests__/pages/deployment-list.test.ts +2 -0
- package/src/__tests__/pages/functions-build.test.ts +91 -41
- package/src/__tests__/pages/project-list.test.ts +2 -0
- package/src/__tests__/pages/project-upload.test.ts +43 -24
- package/src/__tests__/pages/publish.test.ts +267 -148
- package/src/__tests__/publish.test.ts +420 -164
- package/src/__tests__/pubsub.test.ts +3 -0
- package/src/__tests__/queues.test.ts +5 -2
- package/src/__tests__/test-old-node-version.js +3 -3
- package/src/__tests__/traverse-module-graph.test.ts +220 -0
- package/src/__tests__/tsconfig.tsbuildinfo +1 -1
- package/src/__tests__/type-generation.test.ts +1 -0
- package/src/__tests__/user.test.ts +1 -1
- package/src/__tests__/worker-namespace.test.ts +1 -0
- package/src/api/dev.ts +10 -22
- package/src/api/pages/create-worker-bundle-contents.ts +1 -0
- package/src/api/pages/publish.tsx +38 -51
- package/src/bundle.ts +44 -13
- package/src/config/environment.ts +36 -4
- package/src/config/index.ts +30 -2
- package/src/config/validation-helpers.ts +1 -1
- package/src/config/validation.ts +149 -5
- package/src/create-worker-upload-form.ts +28 -3
- package/src/d1/backups.tsx +15 -11
- package/src/d1/create.tsx +20 -16
- package/src/d1/execute.tsx +22 -19
- package/src/d1/list.tsx +2 -2
- package/src/d1/migrations/apply.tsx +35 -29
- package/src/d1/migrations/create.tsx +15 -12
- package/src/d1/migrations/list.tsx +10 -7
- package/src/deployments.ts +260 -8
- package/src/dev/dev.tsx +4 -4
- package/src/dev/local.tsx +14 -16
- package/src/dev/start-server.ts +12 -16
- package/src/dev/use-esbuild.ts +11 -13
- package/src/dev/validate-dev-props.ts +9 -0
- package/src/dev-registry.ts +2 -1
- package/src/dev.tsx +28 -13
- package/src/entry.ts +18 -8
- package/src/generate/index.ts +2 -2
- package/src/index.ts +76 -23
- package/src/init.ts +144 -134
- package/src/logger.ts +18 -3
- package/src/metrics/send-event.ts +2 -1
- package/src/miniflare-cli/index.ts +1 -1
- package/src/miniflare-cli/tsconfig.tsbuildinfo +1 -1
- package/src/module-collection.ts +91 -25
- package/src/pages/build.ts +277 -99
- package/src/pages/buildFunctions.ts +20 -10
- package/src/pages/deployments.tsx +3 -5
- package/src/pages/dev.ts +21 -21
- package/src/pages/errors.ts +1 -0
- package/src/pages/functions/buildPlugin.ts +57 -34
- package/src/pages/functions/buildWorker.ts +34 -31
- package/src/pages/functions/tsconfig.tsbuildinfo +1 -1
- package/src/pages/projects.tsx +2 -5
- package/src/pages/publish.tsx +1 -10
- package/src/pages/upload.tsx +29 -9
- package/src/paths.ts +1 -1
- package/src/publish/index.ts +1 -1
- package/src/publish/publish.ts +29 -34
- package/src/queues/cli/commands/consumer/add.ts +6 -0
- package/src/queues/client.ts +1 -0
- package/src/secret/index.ts +2 -1
- package/src/traverse-module-graph.ts +53 -0
- package/src/type-generation.ts +1 -1
- package/src/user/user.ts +1 -1
- package/src/utils/render.ts +93 -0
- package/src/worker.ts +18 -1
- package/templates/d1-beta-facade.js +5 -2
- package/templates/gitignore +1 -0
- package/templates/middleware/middleware-miniflare3-json-error.ts +17 -5
- package/templates/tsconfig.init.json +1 -2
- package/templates/tsconfig.tsbuildinfo +1 -1
- package/wrangler-dist/cli.d.ts +33 -13
- package/wrangler-dist/cli.js +20732 -19984
- package/src/__tests__/api-devregistry.test.js +0 -64
package/src/deployments.ts
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
import { URLSearchParams } from "url";
|
|
2
|
+
import TOML from "@iarna/toml";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { FormData } from "undici";
|
|
2
5
|
import { fetchResult } from "./cfetch";
|
|
6
|
+
import { readConfig } from "./config";
|
|
7
|
+
import { confirm, prompt } from "./dialogs";
|
|
8
|
+
import { mapBindings } from "./init";
|
|
3
9
|
import { logger } from "./logger";
|
|
4
10
|
import * as metrics from "./metrics";
|
|
11
|
+
import { requireAuth } from "./user";
|
|
12
|
+
import { getScriptName, printWranglerBanner } from ".";
|
|
13
|
+
|
|
5
14
|
import type { Config } from "./config";
|
|
15
|
+
import type { WorkerMetadataBinding } from "./create-worker-upload-form";
|
|
6
16
|
import type { ServiceMetadataRes } from "./init";
|
|
17
|
+
import type { CommonYargsOptions } from "./yargs-types";
|
|
18
|
+
import type { ArgumentsCamelCase } from "yargs";
|
|
7
19
|
|
|
8
20
|
type DeploymentDetails = {
|
|
9
21
|
id: string;
|
|
@@ -11,6 +23,7 @@ type DeploymentDetails = {
|
|
|
11
23
|
annotations: {
|
|
12
24
|
"workers/triggered_by": string;
|
|
13
25
|
"workers/rollback_from": string;
|
|
26
|
+
"workers/message": string;
|
|
14
27
|
};
|
|
15
28
|
metadata: {
|
|
16
29
|
author_id: string;
|
|
@@ -20,8 +33,15 @@ type DeploymentDetails = {
|
|
|
20
33
|
modified_on: string;
|
|
21
34
|
};
|
|
22
35
|
resources: {
|
|
23
|
-
script:
|
|
24
|
-
|
|
36
|
+
script: {
|
|
37
|
+
handlers: string[];
|
|
38
|
+
};
|
|
39
|
+
bindings: WorkerMetadataBinding[];
|
|
40
|
+
script_runtime: {
|
|
41
|
+
compatibility_date: string | undefined;
|
|
42
|
+
compatibility_flags: string[] | undefined;
|
|
43
|
+
usage_model: string | undefined;
|
|
44
|
+
};
|
|
25
45
|
};
|
|
26
46
|
};
|
|
27
47
|
|
|
@@ -49,11 +69,12 @@ export async function deployments(
|
|
|
49
69
|
}
|
|
50
70
|
);
|
|
51
71
|
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
72
|
+
const scriptTag = (
|
|
73
|
+
await fetchResult<ServiceMetadataRes>(
|
|
74
|
+
`/accounts/${accountId}/workers/services/${scriptName}`
|
|
75
|
+
)
|
|
76
|
+
).default_environment.script.tag;
|
|
55
77
|
|
|
56
|
-
const scriptTag = scriptMetadata.default_environment.script.tag;
|
|
57
78
|
const params = new URLSearchParams({ order: "asc" });
|
|
58
79
|
const { items: deploys } = await fetchResult<DeploymentListResult>(
|
|
59
80
|
`/accounts/${accountId}/workers/deployments/by-script/${scriptTag}`,
|
|
@@ -72,12 +93,16 @@ export async function deployments(
|
|
|
72
93
|
Deployment ID: ${versions.id}
|
|
73
94
|
Created on: ${versions.metadata.created_on}
|
|
74
95
|
Author: ${versions.metadata.author_email}
|
|
75
|
-
|
|
96
|
+
Source: ${triggerStr}`;
|
|
76
97
|
|
|
77
98
|
if (versions.annotations?.["workers/rollback_from"]) {
|
|
78
99
|
version += `\nRollback from: ${versions.annotations["workers/rollback_from"]}`;
|
|
79
100
|
}
|
|
80
101
|
|
|
102
|
+
if (versions.annotations?.["workers/message"]) {
|
|
103
|
+
version += `\nMessage: ${versions.annotations["workers/message"]}`;
|
|
104
|
+
}
|
|
105
|
+
|
|
81
106
|
return version + `\n`;
|
|
82
107
|
});
|
|
83
108
|
|
|
@@ -99,7 +124,6 @@ function formatSource(source: string): string {
|
|
|
99
124
|
return "Other";
|
|
100
125
|
}
|
|
101
126
|
}
|
|
102
|
-
|
|
103
127
|
function formatTrigger(trigger: string): string {
|
|
104
128
|
switch (trigger) {
|
|
105
129
|
case "upload":
|
|
@@ -114,3 +138,231 @@ function formatTrigger(trigger: string): string {
|
|
|
114
138
|
return "Unknown";
|
|
115
139
|
}
|
|
116
140
|
}
|
|
141
|
+
|
|
142
|
+
export async function rollbackDeployment(
|
|
143
|
+
accountId: string,
|
|
144
|
+
scriptName: string | undefined,
|
|
145
|
+
{ send_metrics: sendMetrics }: { send_metrics?: Config["send_metrics"] } = {},
|
|
146
|
+
deploymentId: string | undefined,
|
|
147
|
+
message: string | undefined
|
|
148
|
+
) {
|
|
149
|
+
if (deploymentId === undefined) {
|
|
150
|
+
const scriptTag = (
|
|
151
|
+
await fetchResult<ServiceMetadataRes>(
|
|
152
|
+
`/accounts/${accountId}/workers/services/${scriptName}`
|
|
153
|
+
)
|
|
154
|
+
).default_environment.script.tag;
|
|
155
|
+
|
|
156
|
+
const params = new URLSearchParams({ order: "asc" });
|
|
157
|
+
const { items: deploys } = await fetchResult<DeploymentListResult>(
|
|
158
|
+
`/accounts/${accountId}/workers/deployments/by-script/${scriptTag}`,
|
|
159
|
+
undefined,
|
|
160
|
+
params
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
if (deploys.length < 2) {
|
|
164
|
+
throw new Error(
|
|
165
|
+
"Cannot rollback to previous deployment since there are less than 2 deployemnts"
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
deploymentId = deploys.at(-2)?.id;
|
|
170
|
+
if (deploymentId === undefined) {
|
|
171
|
+
throw new Error("Cannot find previous deployment");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const firstHash = deploymentId.substring(0, deploymentId.indexOf("-"));
|
|
176
|
+
|
|
177
|
+
let rollbackMessage = "";
|
|
178
|
+
if (message !== undefined) {
|
|
179
|
+
rollbackMessage = message;
|
|
180
|
+
} else {
|
|
181
|
+
if (
|
|
182
|
+
!(await confirm(
|
|
183
|
+
`This deployment ${chalk.underline(
|
|
184
|
+
firstHash
|
|
185
|
+
)} will immediately replace the current deployment and become the active deployment across all your deployed routes and domains. However, your local development environment will not be affected by this rollback. ${chalk.blue.bold(
|
|
186
|
+
"Note:"
|
|
187
|
+
)} Rolling back to a previous deployment will not rollback any of the bound resources (Durable Object, R2, KV, etc.).`
|
|
188
|
+
))
|
|
189
|
+
) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
rollbackMessage = await prompt(
|
|
194
|
+
"Please provide a message for this rollback (120 characters max)",
|
|
195
|
+
{ defaultValue: "" }
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
let deployment_id = await rollbackRequest(
|
|
200
|
+
accountId,
|
|
201
|
+
scriptName,
|
|
202
|
+
deploymentId,
|
|
203
|
+
rollbackMessage
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
await metrics.sendMetricsEvent(
|
|
207
|
+
"rollback deployments",
|
|
208
|
+
{ view: scriptName ? "single" : "all" },
|
|
209
|
+
{
|
|
210
|
+
sendMetrics,
|
|
211
|
+
}
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
deploymentId = addHyphens(deploymentId) ?? deploymentId;
|
|
215
|
+
deployment_id = addHyphens(deployment_id) ?? deployment_id;
|
|
216
|
+
|
|
217
|
+
logger.log(`\nSuccessfully rolled back to Deployment ID: ${deploymentId}`);
|
|
218
|
+
logger.log("Current Deployment ID:", deployment_id);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async function rollbackRequest(
|
|
222
|
+
accountId: string,
|
|
223
|
+
scriptName: string | undefined,
|
|
224
|
+
deploymentId: string,
|
|
225
|
+
rollbackReason: string
|
|
226
|
+
): Promise<string | null> {
|
|
227
|
+
const body = new FormData();
|
|
228
|
+
body.set("message", rollbackReason);
|
|
229
|
+
|
|
230
|
+
const { deployment_id } = await fetchResult<{
|
|
231
|
+
deployment_id: string | null;
|
|
232
|
+
}>(
|
|
233
|
+
`/accounts/${accountId}/workers/scripts/${scriptName}?rollback_to=${deploymentId}`,
|
|
234
|
+
{
|
|
235
|
+
method: "PUT",
|
|
236
|
+
body,
|
|
237
|
+
}
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
return deployment_id;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export async function viewDeployment(
|
|
244
|
+
accountId: string,
|
|
245
|
+
scriptName: string | undefined,
|
|
246
|
+
{ send_metrics: sendMetrics }: { send_metrics?: Config["send_metrics"] } = {},
|
|
247
|
+
deploymentId: string | undefined
|
|
248
|
+
) {
|
|
249
|
+
await metrics.sendMetricsEvent(
|
|
250
|
+
"view deployments",
|
|
251
|
+
{ view: scriptName ? "single" : "all" },
|
|
252
|
+
{
|
|
253
|
+
sendMetrics,
|
|
254
|
+
}
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
const scriptTag = (
|
|
258
|
+
await fetchResult<ServiceMetadataRes>(
|
|
259
|
+
`/accounts/${accountId}/workers/services/${scriptName}`
|
|
260
|
+
)
|
|
261
|
+
).default_environment.script.tag;
|
|
262
|
+
|
|
263
|
+
if (deploymentId === undefined) {
|
|
264
|
+
const params = new URLSearchParams({ order: "asc" });
|
|
265
|
+
const { latest } = await fetchResult<DeploymentListResult>(
|
|
266
|
+
`/accounts/${accountId}/workers/deployments/by-script/${scriptTag}`,
|
|
267
|
+
undefined,
|
|
268
|
+
params
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
deploymentId = latest.id;
|
|
272
|
+
if (deploymentId === undefined) {
|
|
273
|
+
throw new Error("Cannot find previous deployment");
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const deploymentDetails = await fetchResult<DeploymentListResult["latest"]>(
|
|
278
|
+
`/accounts/${accountId}/workers/deployments/by-script/${scriptTag}/detail/${deploymentId}`
|
|
279
|
+
);
|
|
280
|
+
|
|
281
|
+
const triggerStr = deploymentDetails.annotations?.["workers/triggered_by"]
|
|
282
|
+
? `${formatTrigger(
|
|
283
|
+
deploymentDetails.annotations["workers/triggered_by"]
|
|
284
|
+
)} from ${formatSource(deploymentDetails.metadata.source)}`
|
|
285
|
+
: `${formatSource(deploymentDetails.metadata.source)}`;
|
|
286
|
+
|
|
287
|
+
const rollbackStr = deploymentDetails.annotations?.["workers/rollback_from"]
|
|
288
|
+
? `\nRollback from: ${deploymentDetails.annotations["workers/rollback_from"]}`
|
|
289
|
+
: ``;
|
|
290
|
+
|
|
291
|
+
const reasonStr = deploymentDetails.annotations?.["workers/message"]
|
|
292
|
+
? `\nMessage: ${deploymentDetails.annotations["workers/message"]}`
|
|
293
|
+
: ``;
|
|
294
|
+
|
|
295
|
+
const compatDateStr = deploymentDetails.resources.script_runtime
|
|
296
|
+
?.compatibility_date
|
|
297
|
+
? `\nCompatibility Date: ${deploymentDetails.resources.script_runtime?.compatibility_date}`
|
|
298
|
+
: ``;
|
|
299
|
+
const compatFlagsStr = deploymentDetails.resources.script_runtime
|
|
300
|
+
?.compatibility_flags
|
|
301
|
+
? `\nCompatibility Flags: ${deploymentDetails.resources.script_runtime?.compatibility_flags}`
|
|
302
|
+
: ``;
|
|
303
|
+
|
|
304
|
+
const bindings = deploymentDetails.resources.bindings;
|
|
305
|
+
|
|
306
|
+
const version = `
|
|
307
|
+
Deployment ID: ${deploymentDetails.id}
|
|
308
|
+
Created on: ${deploymentDetails.metadata.created_on}
|
|
309
|
+
Author: ${deploymentDetails.metadata.author_email}
|
|
310
|
+
Source: ${triggerStr}${rollbackStr}${reasonStr}
|
|
311
|
+
------------------------------------------------------------
|
|
312
|
+
Author ID: ${deploymentDetails.metadata.author_id}
|
|
313
|
+
Usage Model: ${deploymentDetails.resources.script_runtime.usage_model}
|
|
314
|
+
Handlers: ${
|
|
315
|
+
deploymentDetails.resources.script.handlers
|
|
316
|
+
}${compatDateStr}${compatFlagsStr}
|
|
317
|
+
--------------------------bindings--------------------------
|
|
318
|
+
${
|
|
319
|
+
bindings.length > 0
|
|
320
|
+
? TOML.stringify(mapBindings(bindings) as TOML.JsonMap)
|
|
321
|
+
: `None`
|
|
322
|
+
}
|
|
323
|
+
`;
|
|
324
|
+
|
|
325
|
+
logger.log(version);
|
|
326
|
+
|
|
327
|
+
// early return to skip the deployments listings
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export async function commonDeploymentCMDSetup(
|
|
332
|
+
yargs: ArgumentsCamelCase<CommonYargsOptions>,
|
|
333
|
+
deploymentsWarning: string
|
|
334
|
+
) {
|
|
335
|
+
await printWranglerBanner();
|
|
336
|
+
const config = readConfig(yargs.config, yargs);
|
|
337
|
+
const accountId = await requireAuth(config);
|
|
338
|
+
const scriptName = getScriptName(
|
|
339
|
+
{ name: yargs.name as string, env: undefined },
|
|
340
|
+
config
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
logger.log(`${deploymentsWarning}\n`);
|
|
344
|
+
|
|
345
|
+
return { accountId, scriptName, config };
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export function addHyphens(uuid: string | null): string | null {
|
|
349
|
+
if (uuid == null) {
|
|
350
|
+
return uuid;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (uuid.length != 32) {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const uuid_parts: string[] = [];
|
|
358
|
+
uuid_parts.push(uuid.slice(0, 8));
|
|
359
|
+
uuid_parts.push(uuid.slice(8, 12));
|
|
360
|
+
uuid_parts.push(uuid.slice(12, 16));
|
|
361
|
+
uuid_parts.push(uuid.slice(16, 20));
|
|
362
|
+
uuid_parts.push(uuid.slice(20));
|
|
363
|
+
|
|
364
|
+
let hyphenated = "";
|
|
365
|
+
uuid_parts.forEach((part) => (hyphenated += part + "-"));
|
|
366
|
+
|
|
367
|
+
return hyphenated.slice(0, 36);
|
|
368
|
+
}
|
package/src/dev/dev.tsx
CHANGED
|
@@ -138,7 +138,8 @@ export type DevProps = {
|
|
|
138
138
|
compatibilityFlags: string[] | undefined;
|
|
139
139
|
usageModel: "bundled" | "unbound" | undefined;
|
|
140
140
|
minify: boolean | undefined;
|
|
141
|
-
|
|
141
|
+
legacyNodeCompat: boolean | undefined;
|
|
142
|
+
nodejsCompat: boolean | undefined;
|
|
142
143
|
build: Config["build"];
|
|
143
144
|
env: string | undefined;
|
|
144
145
|
legacyEnv: boolean;
|
|
@@ -146,7 +147,6 @@ export type DevProps = {
|
|
|
146
147
|
host: string | undefined;
|
|
147
148
|
routes: Route[] | undefined;
|
|
148
149
|
inspect: boolean;
|
|
149
|
-
logPrefix?: string;
|
|
150
150
|
onReady: ((ip: string, port: number) => void) | undefined;
|
|
151
151
|
showInteractiveDevSession: boolean | undefined;
|
|
152
152
|
forceLocal: boolean | undefined;
|
|
@@ -278,7 +278,8 @@ function DevSession(props: DevSessionProps) {
|
|
|
278
278
|
),
|
|
279
279
|
tsconfig: props.tsconfig,
|
|
280
280
|
minify: props.minify,
|
|
281
|
-
|
|
281
|
+
legacyNodeCompat: props.legacyNodeCompat,
|
|
282
|
+
nodejsCompat: props.nodejsCompat,
|
|
282
283
|
betaD1Shims,
|
|
283
284
|
define: props.define,
|
|
284
285
|
noBundle: props.noBundle,
|
|
@@ -341,7 +342,6 @@ function DevSession(props: DevSessionProps) {
|
|
|
341
342
|
queueConsumers={props.queueConsumers}
|
|
342
343
|
localProtocol={props.localProtocol}
|
|
343
344
|
localUpstream={props.localUpstream}
|
|
344
|
-
logPrefix={props.logPrefix}
|
|
345
345
|
inspect={props.inspect}
|
|
346
346
|
onReady={announceAndOnReady}
|
|
347
347
|
enablePagesAssetsServiceBinding={props.enablePagesAssetsServiceBinding}
|
package/src/dev/local.tsx
CHANGED
|
@@ -70,7 +70,6 @@ export interface LocalProps {
|
|
|
70
70
|
localUpstream: string | undefined;
|
|
71
71
|
inspect: boolean;
|
|
72
72
|
onReady: ((ip: string, port: number) => void) | undefined;
|
|
73
|
-
logPrefix?: string;
|
|
74
73
|
enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
|
|
75
74
|
testScheduled?: boolean;
|
|
76
75
|
experimentalLocal: boolean | undefined;
|
|
@@ -121,7 +120,6 @@ function useLocalWorker({
|
|
|
121
120
|
localUpstream,
|
|
122
121
|
inspect,
|
|
123
122
|
onReady,
|
|
124
|
-
logPrefix,
|
|
125
123
|
enablePagesAssetsServiceBinding,
|
|
126
124
|
experimentalLocal,
|
|
127
125
|
accountId,
|
|
@@ -216,13 +214,12 @@ function useLocalWorker({
|
|
|
216
214
|
dataBlobBindings,
|
|
217
215
|
crons,
|
|
218
216
|
upstream,
|
|
219
|
-
logPrefix,
|
|
220
217
|
workerDefinitions,
|
|
221
218
|
enablePagesAssetsServiceBinding,
|
|
222
219
|
});
|
|
223
220
|
|
|
224
221
|
if (experimentalLocal) {
|
|
225
|
-
const log = await buildMiniflare3Logger(
|
|
222
|
+
const log = await buildMiniflare3Logger();
|
|
226
223
|
const mf3Options = await transformMf2OptionsToMf3Options({
|
|
227
224
|
miniflare2Options: options,
|
|
228
225
|
format,
|
|
@@ -231,6 +228,7 @@ function useLocalWorker({
|
|
|
231
228
|
enablePagesAssetsServiceBinding,
|
|
232
229
|
kvNamespaces: bindings?.kv_namespaces,
|
|
233
230
|
r2Buckets: bindings?.r2_buckets,
|
|
231
|
+
d1Databases: bindings?.d1_databases,
|
|
234
232
|
authenticatedAccountId: accountId,
|
|
235
233
|
kvRemote: experimentalLocalRemoteKv,
|
|
236
234
|
inspectorPort: runtimeInspectorPort,
|
|
@@ -437,7 +435,6 @@ function useLocalWorker({
|
|
|
437
435
|
localProtocol,
|
|
438
436
|
localUpstream,
|
|
439
437
|
inspect,
|
|
440
|
-
logPrefix,
|
|
441
438
|
onReady,
|
|
442
439
|
enablePagesAssetsServiceBinding,
|
|
443
440
|
experimentalLocal,
|
|
@@ -576,7 +573,6 @@ interface SetupMiniflareOptionsProps {
|
|
|
576
573
|
dataBlobBindings: Record<string, string>;
|
|
577
574
|
crons: Config["triggers"]["crons"];
|
|
578
575
|
upstream: string | undefined;
|
|
579
|
-
logPrefix: string | undefined;
|
|
580
576
|
workerDefinitions: WorkerRegistry | undefined;
|
|
581
577
|
enablePagesAssetsServiceBinding?: EnablePagesAssetsServiceBindingOptions;
|
|
582
578
|
}
|
|
@@ -608,7 +604,6 @@ export function setupMiniflareOptions({
|
|
|
608
604
|
dataBlobBindings,
|
|
609
605
|
crons,
|
|
610
606
|
upstream,
|
|
611
|
-
logPrefix,
|
|
612
607
|
workerDefinitions,
|
|
613
608
|
enablePagesAssetsServiceBinding,
|
|
614
609
|
}: SetupMiniflareOptionsProps): {
|
|
@@ -721,7 +716,6 @@ export function setupMiniflareOptions({
|
|
|
721
716
|
crons,
|
|
722
717
|
upstream,
|
|
723
718
|
logLevel: logger.loggerLevel,
|
|
724
|
-
logOptions: logPrefix ? { prefix: logPrefix } : undefined,
|
|
725
719
|
enablePagesAssetsServiceBinding,
|
|
726
720
|
};
|
|
727
721
|
// The path to the Miniflare CLI assumes that this file is being run from
|
|
@@ -776,6 +770,7 @@ export interface SetupMiniflare3Options {
|
|
|
776
770
|
// we need actual namespace IDs to connect to.
|
|
777
771
|
kvNamespaces: CfKvNamespace[] | undefined;
|
|
778
772
|
r2Buckets: CfR2Bucket[] | undefined;
|
|
773
|
+
d1Databases: CfD1Database[] | undefined;
|
|
779
774
|
|
|
780
775
|
// Account ID to use for authenticated Cloudflare fetch. If true, prompt
|
|
781
776
|
// user for ID if multiple available.
|
|
@@ -787,18 +782,14 @@ export interface SetupMiniflare3Options {
|
|
|
787
782
|
inspectorPort: number;
|
|
788
783
|
}
|
|
789
784
|
|
|
790
|
-
export async function buildMiniflare3Logger(
|
|
791
|
-
logPrefix?: string
|
|
792
|
-
): Promise<Miniflare3LogType> {
|
|
785
|
+
export async function buildMiniflare3Logger(): Promise<Miniflare3LogType> {
|
|
793
786
|
const { Log, NoOpLog, LogLevel } = await getMiniflare3();
|
|
794
787
|
|
|
795
788
|
let level = logger.loggerLevel.toUpperCase() as Uppercase<LoggerLevel>;
|
|
796
789
|
if (level === "LOG") level = "INFO";
|
|
797
790
|
const logLevel = LogLevel[level];
|
|
798
791
|
|
|
799
|
-
return logLevel === LogLevel.NONE
|
|
800
|
-
? new NoOpLog()
|
|
801
|
-
: new Log(logLevel, { prefix: logPrefix });
|
|
792
|
+
return logLevel === LogLevel.NONE ? new NoOpLog() : new Log(logLevel);
|
|
802
793
|
}
|
|
803
794
|
|
|
804
795
|
export async function transformMf2OptionsToMf3Options({
|
|
@@ -809,6 +800,7 @@ export async function transformMf2OptionsToMf3Options({
|
|
|
809
800
|
enablePagesAssetsServiceBinding,
|
|
810
801
|
kvNamespaces,
|
|
811
802
|
r2Buckets,
|
|
803
|
+
d1Databases,
|
|
812
804
|
authenticatedAccountId,
|
|
813
805
|
kvRemote,
|
|
814
806
|
inspectorPort,
|
|
@@ -836,6 +828,12 @@ export async function transformMf2OptionsToMf3Options({
|
|
|
836
828
|
r2Buckets: Object.fromEntries(
|
|
837
829
|
r2Buckets?.map(({ binding, bucket_name }) => [binding, bucket_name]) ?? []
|
|
838
830
|
),
|
|
831
|
+
d1Databases: Object.fromEntries(
|
|
832
|
+
d1Databases?.map(({ binding, database_id, preview_database_id }) => [
|
|
833
|
+
binding,
|
|
834
|
+
preview_database_id ?? database_id,
|
|
835
|
+
]) ?? []
|
|
836
|
+
),
|
|
839
837
|
inspectorPort,
|
|
840
838
|
verbose: true,
|
|
841
839
|
cloudflareFetch,
|
|
@@ -852,7 +850,7 @@ export async function transformMf2OptionsToMf3Options({
|
|
|
852
850
|
// relies on the fact that `require` is untyped.
|
|
853
851
|
//
|
|
854
852
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
855
|
-
const generateASSETSBinding = require("../miniflare-cli/assets");
|
|
853
|
+
const generateASSETSBinding = require("../miniflare-cli/assets").default;
|
|
856
854
|
options.serviceBindings = {
|
|
857
855
|
...options.serviceBindings,
|
|
858
856
|
ASSETS: (await generateASSETSBinding({
|
|
@@ -918,5 +916,5 @@ export async function getMiniflare3(): Promise<
|
|
|
918
916
|
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
919
917
|
typeof import("@miniflare/tre")
|
|
920
918
|
> {
|
|
921
|
-
return (miniflare3Module ??= await npxImport("@miniflare/tre@3.0.0-next.
|
|
919
|
+
return (miniflare3Module ??= await npxImport("@miniflare/tre@3.0.0-next.12"));
|
|
922
920
|
}
|
package/src/dev/start-server.ts
CHANGED
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { runCustomBuild } from "../entry";
|
|
15
15
|
import { logger } from "../logger";
|
|
16
16
|
import { waitForPortToBeAvailable } from "../proxy";
|
|
17
|
+
import traverseModuleGraph from "../traverse-module-graph";
|
|
17
18
|
import {
|
|
18
19
|
setupBindings,
|
|
19
20
|
getMiniflare3,
|
|
@@ -98,7 +99,8 @@ export async function startDevServer(
|
|
|
98
99
|
),
|
|
99
100
|
tsconfig: props.tsconfig,
|
|
100
101
|
minify: props.minify,
|
|
101
|
-
|
|
102
|
+
legacyNodeCompat: props.legacyNodeCompat,
|
|
103
|
+
nodejsCompat: props.nodejsCompat,
|
|
102
104
|
define: props.define,
|
|
103
105
|
noBundle: props.noBundle,
|
|
104
106
|
assets: props.assetsConfig,
|
|
@@ -131,7 +133,6 @@ export async function startDevServer(
|
|
|
131
133
|
queueConsumers: props.queueConsumers,
|
|
132
134
|
localProtocol: props.localProtocol,
|
|
133
135
|
localUpstream: props.localUpstream,
|
|
134
|
-
logPrefix: props.logPrefix,
|
|
135
136
|
inspect: props.inspect,
|
|
136
137
|
onReady: props.onReady,
|
|
137
138
|
enablePagesAssetsServiceBinding: props.enablePagesAssetsServiceBinding,
|
|
@@ -210,7 +211,8 @@ async function runEsbuild({
|
|
|
210
211
|
serveAssetsFromWorker,
|
|
211
212
|
tsconfig,
|
|
212
213
|
minify,
|
|
213
|
-
|
|
214
|
+
legacyNodeCompat,
|
|
215
|
+
nodejsCompat,
|
|
214
216
|
define,
|
|
215
217
|
noBundle,
|
|
216
218
|
workerDefinitions,
|
|
@@ -233,7 +235,8 @@ async function runEsbuild({
|
|
|
233
235
|
serveAssetsFromWorker: boolean;
|
|
234
236
|
tsconfig: string | undefined;
|
|
235
237
|
minify: boolean | undefined;
|
|
236
|
-
|
|
238
|
+
legacyNodeCompat: boolean | undefined;
|
|
239
|
+
nodejsCompat: boolean | undefined;
|
|
237
240
|
noBundle: boolean;
|
|
238
241
|
workerDefinitions: WorkerRegistry;
|
|
239
242
|
firstPartyWorkerDevFacade: boolean | undefined;
|
|
@@ -251,14 +254,7 @@ async function runEsbuild({
|
|
|
251
254
|
dependencies,
|
|
252
255
|
sourceMapPath,
|
|
253
256
|
}: Awaited<ReturnType<typeof bundleWorker>> = noBundle
|
|
254
|
-
?
|
|
255
|
-
modules: [],
|
|
256
|
-
dependencies: {},
|
|
257
|
-
resolvedEntryPointPath: entry.file,
|
|
258
|
-
bundleType: entry.format === "modules" ? "esm" : "commonjs",
|
|
259
|
-
stop: undefined,
|
|
260
|
-
sourceMapPath: undefined,
|
|
261
|
-
}
|
|
257
|
+
? await traverseModuleGraph(entry, rules)
|
|
262
258
|
: await bundleWorker(entry, destination, {
|
|
263
259
|
serveAssetsFromWorker,
|
|
264
260
|
jsxFactory,
|
|
@@ -266,7 +262,8 @@ async function runEsbuild({
|
|
|
266
262
|
rules,
|
|
267
263
|
tsconfig,
|
|
268
264
|
minify,
|
|
269
|
-
|
|
265
|
+
legacyNodeCompat,
|
|
266
|
+
nodejsCompat,
|
|
270
267
|
define,
|
|
271
268
|
checkFetch: true,
|
|
272
269
|
assets: assets && {
|
|
@@ -318,7 +315,6 @@ export async function startLocalServer({
|
|
|
318
315
|
localUpstream,
|
|
319
316
|
inspect,
|
|
320
317
|
onReady,
|
|
321
|
-
logPrefix,
|
|
322
318
|
enablePagesAssetsServiceBinding,
|
|
323
319
|
experimentalLocal,
|
|
324
320
|
accountId,
|
|
@@ -398,13 +394,12 @@ export async function startLocalServer({
|
|
|
398
394
|
dataBlobBindings,
|
|
399
395
|
crons,
|
|
400
396
|
upstream,
|
|
401
|
-
logPrefix,
|
|
402
397
|
workerDefinitions,
|
|
403
398
|
enablePagesAssetsServiceBinding,
|
|
404
399
|
});
|
|
405
400
|
|
|
406
401
|
if (experimentalLocal) {
|
|
407
|
-
const log = await buildMiniflare3Logger(
|
|
402
|
+
const log = await buildMiniflare3Logger();
|
|
408
403
|
const mf3Options = await transformMf2OptionsToMf3Options({
|
|
409
404
|
miniflare2Options: options,
|
|
410
405
|
format,
|
|
@@ -412,6 +407,7 @@ export async function startLocalServer({
|
|
|
412
407
|
log,
|
|
413
408
|
kvNamespaces: bindings?.kv_namespaces,
|
|
414
409
|
r2Buckets: bindings?.r2_buckets,
|
|
410
|
+
d1Databases: bindings?.d1_databases,
|
|
415
411
|
authenticatedAccountId: accountId,
|
|
416
412
|
kvRemote: experimentalLocalRemoteKv,
|
|
417
413
|
inspectorPort,
|
package/src/dev/use-esbuild.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { useApp } from "ink";
|
|
|
4
4
|
import { useState, useEffect } from "react";
|
|
5
5
|
import { bundleWorker, rewriteNodeCompatBuildFailure } from "../bundle";
|
|
6
6
|
import { logBuildFailure, logger } from "../logger";
|
|
7
|
+
import traverseModuleGraph from "../traverse-module-graph";
|
|
7
8
|
import type { Config } from "../config";
|
|
8
9
|
import type { WorkerRegistry } from "../dev-registry";
|
|
9
10
|
import type { Entry } from "../entry";
|
|
@@ -30,7 +31,8 @@ export function useEsbuild({
|
|
|
30
31
|
serveAssetsFromWorker,
|
|
31
32
|
tsconfig,
|
|
32
33
|
minify,
|
|
33
|
-
|
|
34
|
+
legacyNodeCompat,
|
|
35
|
+
nodejsCompat,
|
|
34
36
|
betaD1Shims,
|
|
35
37
|
define,
|
|
36
38
|
noBundle,
|
|
@@ -54,7 +56,8 @@ export function useEsbuild({
|
|
|
54
56
|
serveAssetsFromWorker: boolean;
|
|
55
57
|
tsconfig: string | undefined;
|
|
56
58
|
minify: boolean | undefined;
|
|
57
|
-
|
|
59
|
+
legacyNodeCompat: boolean | undefined;
|
|
60
|
+
nodejsCompat: boolean | undefined;
|
|
58
61
|
betaD1Shims?: string[];
|
|
59
62
|
noBundle: boolean;
|
|
60
63
|
workerDefinitions: WorkerRegistry;
|
|
@@ -85,7 +88,7 @@ export function useEsbuild({
|
|
|
85
88
|
const watchMode: WatchMode = {
|
|
86
89
|
async onRebuild(error) {
|
|
87
90
|
if (error !== null) {
|
|
88
|
-
if (!
|
|
91
|
+
if (!legacyNodeCompat) rewriteNodeCompatBuildFailure(error);
|
|
89
92
|
logBuildFailure(error);
|
|
90
93
|
logger.error("Watch build failed:", error.message);
|
|
91
94
|
} else {
|
|
@@ -105,14 +108,7 @@ export function useEsbuild({
|
|
|
105
108
|
stop,
|
|
106
109
|
sourceMapPath,
|
|
107
110
|
}: Awaited<ReturnType<typeof bundleWorker>> = noBundle
|
|
108
|
-
?
|
|
109
|
-
modules: [],
|
|
110
|
-
dependencies: {},
|
|
111
|
-
resolvedEntryPointPath: entry.file,
|
|
112
|
-
bundleType: entry.format === "modules" ? "esm" : "commonjs",
|
|
113
|
-
stop: undefined,
|
|
114
|
-
sourceMapPath: undefined,
|
|
115
|
-
}
|
|
111
|
+
? await traverseModuleGraph(entry, rules)
|
|
116
112
|
: await bundleWorker(entry, destination, {
|
|
117
113
|
serveAssetsFromWorker,
|
|
118
114
|
jsxFactory,
|
|
@@ -121,7 +117,8 @@ export function useEsbuild({
|
|
|
121
117
|
watch: watchMode,
|
|
122
118
|
tsconfig,
|
|
123
119
|
minify,
|
|
124
|
-
|
|
120
|
+
legacyNodeCompat,
|
|
121
|
+
nodejsCompat,
|
|
125
122
|
betaD1Shims,
|
|
126
123
|
doBindings: durableObjects.bindings,
|
|
127
124
|
define,
|
|
@@ -188,7 +185,8 @@ export function useEsbuild({
|
|
|
188
185
|
exit,
|
|
189
186
|
noBundle,
|
|
190
187
|
minify,
|
|
191
|
-
|
|
188
|
+
legacyNodeCompat,
|
|
189
|
+
nodejsCompat,
|
|
192
190
|
define,
|
|
193
191
|
assets,
|
|
194
192
|
services,
|
|
@@ -28,4 +28,13 @@ export function validateDevProps(props: DevProps) {
|
|
|
28
28
|
"You cannot configure [data_blobs] with an ES module worker. Instead, import the file directly in your code, and optionally configure `[rules]` in your wrangler.toml"
|
|
29
29
|
);
|
|
30
30
|
}
|
|
31
|
+
|
|
32
|
+
if (
|
|
33
|
+
props.compatibilityFlags?.includes("nodejs_compat") &&
|
|
34
|
+
props.legacyNodeCompat
|
|
35
|
+
) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
"You cannot use the `nodejs_compat` compatibility flag in conjunction with the legacy `--node-compat` flag. If you want to use the new runtime Node.js compatibility features, please remove the `--node-compat` argument from your CLI command or your config file."
|
|
38
|
+
);
|
|
39
|
+
}
|
|
31
40
|
}
|
package/src/dev-registry.ts
CHANGED
|
@@ -13,7 +13,7 @@ import type { HttpTerminator } from "http-terminator";
|
|
|
13
13
|
const DEV_REGISTRY_PORT = "6284";
|
|
14
14
|
const DEV_REGISTRY_HOST = `http://localhost:${DEV_REGISTRY_PORT}`;
|
|
15
15
|
|
|
16
|
-
let server: Server;
|
|
16
|
+
let server: Server | null;
|
|
17
17
|
let terminator: HttpTerminator;
|
|
18
18
|
|
|
19
19
|
export type WorkerRegistry = Record<string, WorkerDefinition>;
|
|
@@ -102,6 +102,7 @@ export async function startWorkerRegistry() {
|
|
|
102
102
|
*/
|
|
103
103
|
export async function stopWorkerRegistry() {
|
|
104
104
|
await terminator?.terminate();
|
|
105
|
+
server = null;
|
|
105
106
|
}
|
|
106
107
|
|
|
107
108
|
/**
|