@10up/wp-vite-plugins 1.0.0-alpha.2 → 1.0.0-alpha.3
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/README.md +53 -3
- package/dist/build.d.ts +2 -2
- package/dist/build.js +18 -1
- package/dist/build.js.map +1 -1
- package/dist/cli.js +85 -7
- package/dist/cli.js.map +1 -1
- package/dist/dev.d.ts +35 -0
- package/dist/dev.js +384 -0
- package/dist/dev.js.map +1 -0
- package/dist/index.d.ts +153 -2
- package/dist/index.js +1561 -120
- package/dist/index.js.map +1 -1
- package/dist/{runner-WUYCS-nx.d.ts → runner-jUVlAHlZ.d.ts} +8 -3
- package/dist/watch.d.ts +2 -2
- package/dist/watch.js +18 -1
- package/dist/watch.js.map +1 -1
- package/package.json +6 -1
package/dist/dev.js
ADDED
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
import { resolve, join, parse, dirname, isAbsolute, sep } from 'path';
|
|
2
|
+
import { spawn } from 'child_process';
|
|
3
|
+
import { existsSync, readFileSync } from 'fs';
|
|
4
|
+
import { rm } from 'fs/promises';
|
|
5
|
+
|
|
6
|
+
// src/dev.ts
|
|
7
|
+
var DEFAULT_BUILD_ARGS = ["build", "--no-emptyOutDir", "--no-clearScreen"];
|
|
8
|
+
var DEFAULT_WATCH_ARGS = ["build", "--watch", "--no-emptyOutDir", "--no-clearScreen"];
|
|
9
|
+
var BIN_CANDIDATES = ["vite", "vp"];
|
|
10
|
+
function spawnPass(options) {
|
|
11
|
+
const { pass, stdout, stderr } = options;
|
|
12
|
+
const child = spawn(options.bin, options.argv, {
|
|
13
|
+
cwd: options.cwd,
|
|
14
|
+
env: {
|
|
15
|
+
...process.env,
|
|
16
|
+
...options.env,
|
|
17
|
+
WP_VITE_RUNNER: options.runner,
|
|
18
|
+
WP_VITE_PASS: pass,
|
|
19
|
+
// Kept for the documented watch-only guard:
|
|
20
|
+
// `emptyOutDir: !isModulePass && !process.env.WP_VITE_UNIFIED_WATCH`.
|
|
21
|
+
...options.runner === "watch" ? { WP_VITE_UNIFIED_WATCH: "1" } : {}
|
|
22
|
+
},
|
|
23
|
+
stdio: options.inherit ? "inherit" : ["ignore", "pipe", "pipe"],
|
|
24
|
+
// .cmd shims are not directly executable on Windows.
|
|
25
|
+
shell: process.platform === "win32"
|
|
26
|
+
});
|
|
27
|
+
if (options.inherit) {
|
|
28
|
+
const result2 = new Promise((settle) => {
|
|
29
|
+
let settled = false;
|
|
30
|
+
const finish = (passResult) => {
|
|
31
|
+
if (settled) return;
|
|
32
|
+
settled = true;
|
|
33
|
+
settle(passResult);
|
|
34
|
+
};
|
|
35
|
+
child.on("error", (error) => {
|
|
36
|
+
stderr.write(`[wp-vite] the ${pass} pass failed to start: ${error.message}
|
|
37
|
+
`);
|
|
38
|
+
finish({ pass, code: null, signal: null, error });
|
|
39
|
+
});
|
|
40
|
+
child.on("close", (code, signal) => finish({ pass, code, signal }));
|
|
41
|
+
});
|
|
42
|
+
return { pass, child, result: result2 };
|
|
43
|
+
}
|
|
44
|
+
const outPrefixer = createLinePrefixer(`[${pass}] `, (text) => stdout.write(text));
|
|
45
|
+
const errPrefixer = createLinePrefixer(`[${pass}] `, (text) => stderr.write(text));
|
|
46
|
+
child.stdout?.setEncoding("utf8");
|
|
47
|
+
child.stdout?.on("data", (chunk) => outPrefixer.write(chunk));
|
|
48
|
+
child.stderr?.setEncoding("utf8");
|
|
49
|
+
child.stderr?.on("data", (chunk) => errPrefixer.write(chunk));
|
|
50
|
+
const result = new Promise((settle) => {
|
|
51
|
+
let settled = false;
|
|
52
|
+
const finish = (passResult) => {
|
|
53
|
+
if (settled) return;
|
|
54
|
+
settled = true;
|
|
55
|
+
outPrefixer.flush();
|
|
56
|
+
errPrefixer.flush();
|
|
57
|
+
settle(passResult);
|
|
58
|
+
};
|
|
59
|
+
child.on("error", (error) => {
|
|
60
|
+
stderr.write(`[wp-vite] the ${pass} pass failed to start: ${error.message}
|
|
61
|
+
`);
|
|
62
|
+
finish({ pass, code: null, signal: null, error });
|
|
63
|
+
});
|
|
64
|
+
child.on("close", (code, signal) => finish({ pass, code, signal }));
|
|
65
|
+
});
|
|
66
|
+
return { pass, child, result };
|
|
67
|
+
}
|
|
68
|
+
function forwardSignals(handler) {
|
|
69
|
+
const bound = ["SIGINT", "SIGTERM"].map(
|
|
70
|
+
(signal) => [signal, () => handler(signal)]
|
|
71
|
+
);
|
|
72
|
+
for (const [signal, listener] of bound) process.on(signal, listener);
|
|
73
|
+
return () => {
|
|
74
|
+
for (const [signal, listener] of bound) process.off(signal, listener);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function describeExit(code, signal) {
|
|
78
|
+
if (signal) return `signal ${signal}`;
|
|
79
|
+
if (code === null) return "unknown cause";
|
|
80
|
+
return `exit code ${code}`;
|
|
81
|
+
}
|
|
82
|
+
var SIGNAL_EXIT_CODES = {
|
|
83
|
+
SIGINT: 130,
|
|
84
|
+
SIGTERM: 143,
|
|
85
|
+
SIGHUP: 129,
|
|
86
|
+
SIGQUIT: 131
|
|
87
|
+
};
|
|
88
|
+
function signalExitCode(signal) {
|
|
89
|
+
if (!signal) return 1;
|
|
90
|
+
return SIGNAL_EXIT_CODES[signal] ?? 1;
|
|
91
|
+
}
|
|
92
|
+
function passExitCode(result) {
|
|
93
|
+
if (result.error) return 1;
|
|
94
|
+
if (result.code !== null) return result.code;
|
|
95
|
+
return signalExitCode(result.signal);
|
|
96
|
+
}
|
|
97
|
+
var VITE_CONFIG_FILES = [
|
|
98
|
+
"vite.config.ts",
|
|
99
|
+
"vite.config.mts",
|
|
100
|
+
"vite.config.cts",
|
|
101
|
+
"vite.config.js",
|
|
102
|
+
"vite.config.mjs",
|
|
103
|
+
"vite.config.cjs"
|
|
104
|
+
];
|
|
105
|
+
function detectModulePass(options = {}) {
|
|
106
|
+
if (typeof options.modules === "boolean") {
|
|
107
|
+
return {
|
|
108
|
+
modules: options.modules,
|
|
109
|
+
reason: `explicit --${options.modules ? "modules" : "no-modules"} flag`
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
113
|
+
const modulesMode = options.modulesMode ?? "modules";
|
|
114
|
+
const escapedMode = escapeRegExp(modulesMode);
|
|
115
|
+
const scriptMatch = new RegExp(`(?:--mode[=\\s]+|(?:^|\\s)-m\\s+)${escapedMode}(?![\\w-])`);
|
|
116
|
+
const packageJson = readJson(join(cwd, "package.json"));
|
|
117
|
+
const scripts = packageJson?.scripts;
|
|
118
|
+
if (scripts && typeof scripts === "object") {
|
|
119
|
+
for (const [name, command] of Object.entries(scripts)) {
|
|
120
|
+
if (typeof command === "string" && scriptMatch.test(command)) {
|
|
121
|
+
return {
|
|
122
|
+
modules: true,
|
|
123
|
+
reason: `package.json script "${name}" runs --mode ${modulesMode}`
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const configMatch = new RegExp(`(['"\`])${escapedMode}\\1`);
|
|
129
|
+
for (const fileName of VITE_CONFIG_FILES) {
|
|
130
|
+
const filePath = join(cwd, fileName);
|
|
131
|
+
const source = readFileIfExists(filePath);
|
|
132
|
+
if (source === null) continue;
|
|
133
|
+
if (configMatch.test(source)) {
|
|
134
|
+
return { modules: true, reason: `${fileName} mentions the "${modulesMode}" mode` };
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
modules: false,
|
|
138
|
+
reason: `${fileName} never mentions the "${modulesMode}" mode`
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
modules: false,
|
|
143
|
+
reason: `no package.json script or Vite config mentions the "${modulesMode}" mode`
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function resolveViteBin(cwd = process.cwd(), candidates = BIN_CANDIDATES) {
|
|
147
|
+
const searched = [];
|
|
148
|
+
for (const binDir of nodeModulesBinDirs(cwd)) {
|
|
149
|
+
for (const name of candidates) {
|
|
150
|
+
for (const fileName of binFileNames(name)) {
|
|
151
|
+
const candidatePath = join(binDir, fileName);
|
|
152
|
+
searched.push(candidatePath);
|
|
153
|
+
if (existsSync(candidatePath)) return { name, path: candidatePath };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
throw new Error(
|
|
158
|
+
`[wp-vite] could not find a Vite binary (${candidates.join(" or ")}) in any node_modules/.bin above ${cwd}. Install vite in the package, or pass --bin <name|path>. Looked at:
|
|
159
|
+
${searched.join("\n ")}`
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
function resolveBin(bin, cwd) {
|
|
163
|
+
if (!bin) return resolveViteBin(cwd).path;
|
|
164
|
+
if (isAbsolute(bin) || bin.includes("/") || bin.includes("\\")) return bin;
|
|
165
|
+
try {
|
|
166
|
+
return resolveViteBin(cwd, [bin]).path;
|
|
167
|
+
} catch {
|
|
168
|
+
return bin;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function nodeModulesBinDirs(from) {
|
|
172
|
+
const dirs = [];
|
|
173
|
+
let current = resolve(from);
|
|
174
|
+
const { root } = parse(current);
|
|
175
|
+
while (true) {
|
|
176
|
+
dirs.push(join(current, "node_modules", ".bin"));
|
|
177
|
+
if (current === root) break;
|
|
178
|
+
const parent = dirname(current);
|
|
179
|
+
if (parent === current) break;
|
|
180
|
+
current = parent;
|
|
181
|
+
}
|
|
182
|
+
return dirs;
|
|
183
|
+
}
|
|
184
|
+
function binFileNames(name) {
|
|
185
|
+
return process.platform === "win32" ? [`${name}.cmd`, name] : [name];
|
|
186
|
+
}
|
|
187
|
+
async function cleanOutDir(outDir = "dist", cwd = process.cwd()) {
|
|
188
|
+
const base = resolve(cwd);
|
|
189
|
+
const target = isAbsolute(outDir) ? resolve(outDir) : resolve(base, outDir);
|
|
190
|
+
if (target === parse(target).root || target === base || !target.startsWith(base + sep)) {
|
|
191
|
+
throw new Error(
|
|
192
|
+
`[wp-vite] refusing to clean ${target}: the out dir must be inside ${base}`
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
await rm(target, { recursive: true, force: true });
|
|
196
|
+
return target;
|
|
197
|
+
}
|
|
198
|
+
var ESCAPE = String.fromCharCode(27);
|
|
199
|
+
var ERASE_SEQUENCE = new RegExp(`^(?:${ESCAPE}\\[[0-2]?[KJ])+`);
|
|
200
|
+
function createLinePrefixer(prefix, write) {
|
|
201
|
+
let buffer = "";
|
|
202
|
+
const emit = (line) => {
|
|
203
|
+
const withoutCrlf = line.endsWith("\r") ? line.slice(0, -1) : line;
|
|
204
|
+
const rendered = withoutCrlf.split("\r").pop() ?? "";
|
|
205
|
+
const content = rendered.replace(ERASE_SEQUENCE, "");
|
|
206
|
+
write(content.length === 0 ? "\n" : `${prefix}${content}
|
|
207
|
+
`);
|
|
208
|
+
};
|
|
209
|
+
return {
|
|
210
|
+
write(chunk) {
|
|
211
|
+
buffer += chunk;
|
|
212
|
+
const lines = buffer.split("\n");
|
|
213
|
+
buffer = lines.pop() ?? "";
|
|
214
|
+
for (const line of lines) emit(line);
|
|
215
|
+
},
|
|
216
|
+
flush() {
|
|
217
|
+
if (buffer.length === 0) return;
|
|
218
|
+
const pending = buffer;
|
|
219
|
+
buffer = "";
|
|
220
|
+
emit(pending);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
function parseCliArgs(argv) {
|
|
225
|
+
const parsed = {
|
|
226
|
+
command: void 0,
|
|
227
|
+
options: {},
|
|
228
|
+
help: false,
|
|
229
|
+
version: false,
|
|
230
|
+
unknown: []
|
|
231
|
+
};
|
|
232
|
+
const passthrough = [];
|
|
233
|
+
let index = 0;
|
|
234
|
+
for (; index < argv.length; index += 1) {
|
|
235
|
+
const arg = argv[index];
|
|
236
|
+
if (arg === "--") {
|
|
237
|
+
passthrough.push(...argv.slice(index + 1));
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
if (!arg.startsWith("-")) {
|
|
241
|
+
if (parsed.command === void 0) parsed.command = arg;
|
|
242
|
+
else parsed.unknown.push(arg);
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const equalsAt = arg.indexOf("=");
|
|
246
|
+
const flag = equalsAt === -1 ? arg : arg.slice(0, equalsAt);
|
|
247
|
+
const inlineValue = equalsAt === -1 ? void 0 : arg.slice(equalsAt + 1);
|
|
248
|
+
const takeValue = () => {
|
|
249
|
+
if (inlineValue !== void 0) return inlineValue;
|
|
250
|
+
const next = argv[index + 1];
|
|
251
|
+
if (next === void 0 || next.startsWith("-")) return void 0;
|
|
252
|
+
index += 1;
|
|
253
|
+
return next;
|
|
254
|
+
};
|
|
255
|
+
switch (flag) {
|
|
256
|
+
case "-h":
|
|
257
|
+
case "--help":
|
|
258
|
+
parsed.help = true;
|
|
259
|
+
break;
|
|
260
|
+
case "-v":
|
|
261
|
+
case "--version":
|
|
262
|
+
parsed.version = true;
|
|
263
|
+
break;
|
|
264
|
+
case "--out-dir":
|
|
265
|
+
case "--outDir": {
|
|
266
|
+
const value = takeValue();
|
|
267
|
+
if (value === void 0) parsed.unknown.push(`${flag} (missing value)`);
|
|
268
|
+
else parsed.options.outDir = value;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
case "--modules-mode":
|
|
272
|
+
case "--modulesMode": {
|
|
273
|
+
const value = takeValue();
|
|
274
|
+
if (value === void 0) parsed.unknown.push(`${flag} (missing value)`);
|
|
275
|
+
else parsed.options.modulesMode = value;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
case "--bin": {
|
|
279
|
+
const value = takeValue();
|
|
280
|
+
if (value === void 0) parsed.unknown.push(`${flag} (missing value)`);
|
|
281
|
+
else parsed.options.bin = value;
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
case "--cwd": {
|
|
285
|
+
const value = takeValue();
|
|
286
|
+
if (value === void 0) parsed.unknown.push(`${flag} (missing value)`);
|
|
287
|
+
else parsed.options.cwd = value;
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
case "--modules":
|
|
291
|
+
parsed.options.modules = true;
|
|
292
|
+
break;
|
|
293
|
+
case "--no-modules":
|
|
294
|
+
parsed.options.modules = false;
|
|
295
|
+
break;
|
|
296
|
+
case "--clean":
|
|
297
|
+
parsed.options.clean = true;
|
|
298
|
+
break;
|
|
299
|
+
case "--no-clean":
|
|
300
|
+
parsed.options.clean = false;
|
|
301
|
+
break;
|
|
302
|
+
default:
|
|
303
|
+
parsed.unknown.push(flag);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (passthrough.length > 0) parsed.options.args = passthrough;
|
|
307
|
+
return parsed;
|
|
308
|
+
}
|
|
309
|
+
function escapeRegExp(value) {
|
|
310
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
311
|
+
}
|
|
312
|
+
function readFileIfExists(filePath) {
|
|
313
|
+
try {
|
|
314
|
+
return readFileSync(filePath, "utf8");
|
|
315
|
+
} catch {
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function readJson(filePath) {
|
|
320
|
+
const source = readFileIfExists(filePath);
|
|
321
|
+
if (source === null) return null;
|
|
322
|
+
try {
|
|
323
|
+
return JSON.parse(source);
|
|
324
|
+
} catch {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// src/dev.ts
|
|
330
|
+
var DEFAULT_DEV_ARGS = ["dev", "--no-clearScreen"];
|
|
331
|
+
async function dev(options = {}) {
|
|
332
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
333
|
+
const stdout = options.stdout ?? process.stdout;
|
|
334
|
+
const stderr = options.stderr ?? process.stderr;
|
|
335
|
+
const bin = resolveBin(options.bin, cwd);
|
|
336
|
+
if (options.clean === true) {
|
|
337
|
+
const cleaned = await cleanOutDir(options.outDir ?? "dist", cwd);
|
|
338
|
+
stdout.write(`[wp-vite] cleaned ${cleaned}
|
|
339
|
+
`);
|
|
340
|
+
}
|
|
341
|
+
stdout.write(`[wp-vite] starting the dev server via ${bin}
|
|
342
|
+
`);
|
|
343
|
+
let current;
|
|
344
|
+
let interrupted = false;
|
|
345
|
+
const disposeSignals = options.handleSignals === false ? () => {
|
|
346
|
+
} : forwardSignals((signal) => {
|
|
347
|
+
if (interrupted) return;
|
|
348
|
+
interrupted = true;
|
|
349
|
+
if (current && current.exitCode === null && current.signalCode === null) {
|
|
350
|
+
current.kill(signal);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
try {
|
|
354
|
+
const spawned = spawnPass({
|
|
355
|
+
pass: "dev",
|
|
356
|
+
runner: "dev",
|
|
357
|
+
bin,
|
|
358
|
+
cwd,
|
|
359
|
+
argv: [...options.devArgs ?? DEFAULT_DEV_ARGS, ...options.args ?? []],
|
|
360
|
+
env: options.env,
|
|
361
|
+
stdout,
|
|
362
|
+
stderr,
|
|
363
|
+
inherit: options.inherit !== false
|
|
364
|
+
});
|
|
365
|
+
current = spawned.child;
|
|
366
|
+
const result = await spawned.result;
|
|
367
|
+
current = void 0;
|
|
368
|
+
if (interrupted) return 0;
|
|
369
|
+
const code = passExitCode(result);
|
|
370
|
+
if (code !== 0) {
|
|
371
|
+
stderr.write(
|
|
372
|
+
`[wp-vite] the dev server exited (${describeExit(result.code, result.signal)})
|
|
373
|
+
`
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
return code;
|
|
377
|
+
} finally {
|
|
378
|
+
disposeSignals();
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export { BIN_CANDIDATES, DEFAULT_BUILD_ARGS, DEFAULT_DEV_ARGS, DEFAULT_WATCH_ARGS, cleanOutDir, createLinePrefixer, detectModulePass, dev, parseCliArgs, resolveViteBin };
|
|
383
|
+
//# sourceMappingURL=dev.js.map
|
|
384
|
+
//# sourceMappingURL=dev.js.map
|
package/dist/dev.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runner.ts","../src/dev.ts"],"names":["result","parsePath","resolve"],"mappings":"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","file":"dev.js","sourcesContent":["/**\n * Shared internals for the `wp-vite` commands.\n *\n * `wp-vite build` and `wp-vite watch` are the same idea run two ways: take a\n * dual-pass project (`vite build` for classic scripts, `vite build --mode\n * modules` for Script Modules), clean the out dir once, then drive both passes\n * — sequentially for a build, concurrently for a watch — as a single process\n * with prefixed output and signal-clean shutdown.\n *\n * Everything they have in common lives here: out-dir cleaning, module-pass\n * detection, Vite binary resolution, child spawning with line prefixing,\n * signal forwarding, and argv parsing. The commands themselves are in\n * `./build` and `./watch`.\n *\n * No Vite internals are used — the commands only shell out to the consuming\n * package's own `vite` (or `vp`) binary.\n */\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { rm } from 'node:fs/promises';\nimport { dirname, isAbsolute, join, parse as parsePath, resolve, sep } from 'node:path';\n\n/**\n * The Vite invocations the commands can drive. `script` / `modules` are the\n * two build passes; `dev` is the single serve-mode server `wp-vite dev` runs\n * (there is no second pass in dev — one server handles both, see\n * `wpDevServer`).\n */\nexport type PassName = 'script' | 'modules' | 'dev';\n\n/** Which command is driving the passes. Exposed to children as `WP_VITE_RUNNER`. */\nexport type RunnerName = 'build' | 'watch' | 'dev';\n\n/**\n * Signals the commands forward. Spelled out rather than pulled from the\n * ambient Node signal type, which this repo's ESLint config reports as an\n * undefined global.\n */\nexport type RunnerSignal = 'SIGINT' | 'SIGTERM';\n\n/** Sink for prefixed child output. `process.stdout` satisfies it. */\nexport interface OutputSink {\n\twrite(text: string): unknown;\n}\n\n/** Options shared by `build()` and `watch()`. */\nexport interface RunnerOptions {\n\t/** Package directory the passes run in. Default: `process.cwd()`. */\n\tcwd?: string;\n\t/**\n\t * Directory cleaned once at startup. Must match `build.outDir` of the\n\t * Vite config. Default: `'dist'`.\n\t */\n\toutDir?: string;\n\t/**\n\t * Force the module pass on/off. When omitted, `detectModulePass` decides.\n\t */\n\tmodules?: boolean;\n\t/** `--mode` value for the module pass. Default: `'modules'`. */\n\tmodulesMode?: string;\n\t/**\n\t * Binary to run. A bare name (`'vite'`, `'vp'`) is looked up in the\n\t * nearest `node_modules/.bin`; a path is used as-is. When omitted, `vite`\n\t * is preferred over `vp` (see `resolveViteBin`).\n\t */\n\tbin?: string;\n\t/** Extra arguments appended to both passes. */\n\targs?: string[];\n\t/** Skip the startup clean. Default: `false` (it cleans). */\n\tclean?: boolean;\n\t/** Install SIGINT/SIGTERM handlers on `process`. Default: `true`. */\n\thandleSignals?: boolean;\n\t/** Extra environment for the children. */\n\tenv?: Record<string, string | undefined>;\n\t/** Output sinks. Default: `process.stdout` / `process.stderr`. */\n\tstdout?: OutputSink;\n\tstderr?: OutputSink;\n\t/**\n\t * Replaces the built-in argv (`DEFAULT_BUILD_ARGS` / `DEFAULT_WATCH_ARGS`)\n\t * for every pass. Escape hatch for tests — it lets a stand-in child stand\n\t * in for a real Vite invocation.\n\t */\n\tbuildArgs?: string[];\n}\n\n/**\n * Arguments every `wp-vite build` pass gets, before the pass-specific\n * `--mode`.\n *\n * `--no-emptyOutDir` makes the runner's own one-time clean the single source\n * of truth, so no pass can delete another's output no matter how the config\n * sets `emptyOutDir`. `--no-clearScreen` keeps the second pass from erasing\n * the first pass' summary.\n */\nexport const DEFAULT_BUILD_ARGS = ['build', '--no-emptyOutDir', '--no-clearScreen'];\n\n/**\n * Arguments every `wp-vite watch` pass gets, before the pass-specific\n * `--mode`.\n *\n * `--no-emptyOutDir` is what stops the script pass from wiping the module\n * pass' chunks out of dist/ on every rebuild; it overrides `emptyOutDir: true`\n * from the config file (verified on Vite 8). `--no-clearScreen` stops two\n * watchers sharing one terminal from clearing each other's output.\n */\nexport const DEFAULT_WATCH_ARGS = ['build', '--watch', '--no-emptyOutDir', '--no-clearScreen'];\n\n/** Binary names tried, in order, when `bin` is not given. */\nexport const BIN_CANDIDATES = ['vite', 'vp'] as const;\n\n/** How a pass ended. */\nexport interface PassResult {\n\tpass: PassName;\n\tcode: number | null;\n\tsignal: string | null;\n\t/** Set when the binary could not be spawned at all. */\n\terror?: Error;\n}\n\nexport interface SpawnPassOptions {\n\tpass: PassName;\n\t/** Which command is driving — surfaced to the child as `WP_VITE_RUNNER`. */\n\trunner: RunnerName;\n\tbin: string;\n\targv: string[];\n\tcwd: string;\n\tenv?: Record<string, string | undefined>;\n\tstdout: OutputSink;\n\tstderr: OutputSink;\n\t/**\n\t * Hand the child this process' stdio instead of piping and prefixing it.\n\t * Prefixing exists to keep two concurrent passes apart; a dev server is on\n\t * its own, and piping would cost it the things that make it usable —\n\t * a TTY for the `r`/`u`/`q` shortcuts, colour, and the clickable\n\t * \"Local:\" URL. Ignored for the build/watch passes.\n\t */\n\tinherit?: boolean;\n}\n\nexport interface SpawnedPass {\n\tpass: PassName;\n\tchild: ChildProcess;\n\t/** Resolves once the child is gone *and* its output has been flushed. */\n\tresult: Promise<PassResult>;\n}\n\n/**\n * Spawn one pass with its output prefixed (`[script] ` / `[modules] `).\n *\n * The child gets `WP_VITE_RUNNER` and `WP_VITE_PASS` so a Vite config can tell\n * it is being driven by `wp-vite`, plus `WP_VITE_UNIFIED_WATCH=1` for the\n * watch command specifically (the documented `emptyOutDir` guard).\n */\nexport function spawnPass(options: SpawnPassOptions): SpawnedPass {\n\tconst { pass, stdout, stderr } = options;\n\n\tconst child = spawn(options.bin, options.argv, {\n\t\tcwd: options.cwd,\n\t\tenv: {\n\t\t\t...process.env,\n\t\t\t...options.env,\n\t\t\tWP_VITE_RUNNER: options.runner,\n\t\t\tWP_VITE_PASS: pass,\n\t\t\t// Kept for the documented watch-only guard:\n\t\t\t// `emptyOutDir: !isModulePass && !process.env.WP_VITE_UNIFIED_WATCH`.\n\t\t\t...(options.runner === 'watch' ? { WP_VITE_UNIFIED_WATCH: '1' } : {}),\n\t\t},\n\t\tstdio: options.inherit ? 'inherit' : ['ignore', 'pipe', 'pipe'],\n\t\t// .cmd shims are not directly executable on Windows.\n\t\tshell: process.platform === 'win32',\n\t});\n\n\tif (options.inherit) {\n\t\tconst result = new Promise<PassResult>((settle) => {\n\t\t\tlet settled = false;\n\t\t\tconst finish = (passResult: PassResult) => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tsettle(passResult);\n\t\t\t};\n\t\t\tchild.on('error', (error: Error) => {\n\t\t\t\tstderr.write(`[wp-vite] the ${pass} pass failed to start: ${error.message}\\n`);\n\t\t\t\tfinish({ pass, code: null, signal: null, error });\n\t\t\t});\n\t\t\tchild.on('close', (code, signal) => finish({ pass, code, signal }));\n\t\t});\n\t\treturn { pass, child, result };\n\t}\n\n\tconst outPrefixer = createLinePrefixer(`[${pass}] `, (text) => stdout.write(text));\n\tconst errPrefixer = createLinePrefixer(`[${pass}] `, (text) => stderr.write(text));\n\tchild.stdout?.setEncoding('utf8');\n\tchild.stdout?.on('data', (chunk: string) => outPrefixer.write(chunk));\n\tchild.stderr?.setEncoding('utf8');\n\tchild.stderr?.on('data', (chunk: string) => errPrefixer.write(chunk));\n\n\tconst result = new Promise<PassResult>((settle) => {\n\t\tlet settled = false;\n\t\tconst finish = (passResult: PassResult) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\toutPrefixer.flush();\n\t\t\terrPrefixer.flush();\n\t\t\tsettle(passResult);\n\t\t};\n\t\tchild.on('error', (error: Error) => {\n\t\t\tstderr.write(`[wp-vite] the ${pass} pass failed to start: ${error.message}\\n`);\n\t\t\tfinish({ pass, code: null, signal: null, error });\n\t\t});\n\t\tchild.on('close', (code, signal) => finish({ pass, code, signal }));\n\t});\n\n\treturn { pass, child, result };\n}\n\n/** Full argv for a pass: base args, then `--mode` for the module pass, then passthrough. */\nexport function passArgs(\n\tbase: readonly string[],\n\tpass: PassName,\n\tmodulesMode: string,\n\textra: readonly string[] = [],\n): string[] {\n\treturn [...base, ...(pass === 'modules' ? ['--mode', modulesMode] : []), ...extra];\n}\n\n/**\n * Register SIGINT/SIGTERM handlers that call `handler` with the signal that\n * fired. Returns a disposer.\n *\n * One bound handler per signal: the forwarded signal comes from the binding,\n * not from the event argument (which is absent when a test or a wrapper emits\n * the event by hand).\n */\nexport function forwardSignals(handler: (signal: RunnerSignal) => void): () => void {\n\tconst bound: Array<[RunnerSignal, () => void]> = (['SIGINT', 'SIGTERM'] as RunnerSignal[]).map(\n\t\t(signal) => [signal, () => handler(signal)],\n\t);\n\tfor (const [signal, listener] of bound) process.on(signal, listener);\n\treturn () => {\n\t\tfor (const [signal, listener] of bound) process.off(signal, listener);\n\t};\n}\n\n/** Human-readable cause of a child exit. */\nexport function describeExit(code: number | null, signal: string | null): string {\n\tif (signal) return `signal ${signal}`;\n\tif (code === null) return 'unknown cause';\n\treturn `exit code ${code}`;\n}\n\n/** Shell convention: a process killed by signal N reports `128 + N`. */\nconst SIGNAL_EXIT_CODES: Record<string, number> = {\n\tSIGINT: 130,\n\tSIGTERM: 143,\n\tSIGHUP: 129,\n\tSIGQUIT: 131,\n};\n\n/** Exit code for a signalled death: `128 + signo`, or `1` for anything unmapped. */\nexport function signalExitCode(signal: string | null): number {\n\tif (!signal) return 1;\n\treturn SIGNAL_EXIT_CODES[signal] ?? 1;\n}\n\n/** The exit code a pass result should produce. `0` only for a clean exit. */\nexport function passExitCode(result: PassResult): number {\n\tif (result.error) return 1;\n\tif (result.code !== null) return result.code;\n\treturn signalExitCode(result.signal);\n}\n\nexport interface ModulePassDetection {\n\tmodules: boolean;\n\t/** Why — surfaced in the startup log so the heuristic is never a mystery. */\n\treason: string;\n}\n\nexport interface DetectModulePassOptions {\n\tcwd?: string;\n\tmodulesMode?: string;\n\t/** Explicit override; wins over every heuristic. */\n\tmodules?: boolean;\n}\n\n/** Config file names probed for the module mode string, nearest-first. */\nconst VITE_CONFIG_FILES = [\n\t'vite.config.ts',\n\t'vite.config.mts',\n\t'vite.config.cts',\n\t'vite.config.js',\n\t'vite.config.mjs',\n\t'vite.config.cjs',\n];\n\n/**\n * Decide whether this package has a module pass.\n *\n * The commands deliberately do not import the user's Vite config (top-level\n * side effects) and cannot discover Script Module entries themselves — that\n * needs `blocksDir` / `adminPagesDir`, which only the config knows. So they\n * use a cheap, predictable, read-only heuristic:\n *\n * 1. an explicit `modules` option (`--modules` / `--no-modules`) wins;\n * 2. a `package.json` script whose command contains `--mode <modulesMode>`;\n * 3. a Vite config file whose source text contains the mode as a string\n * literal (`mode === 'modules'`, `'modules'` in a map, …).\n *\n * Everything else means \"script pass only\".\n */\nexport function detectModulePass(options: DetectModulePassOptions = {}): ModulePassDetection {\n\tif (typeof options.modules === 'boolean') {\n\t\treturn {\n\t\t\tmodules: options.modules,\n\t\t\treason: `explicit --${options.modules ? 'modules' : 'no-modules'} flag`,\n\t\t};\n\t}\n\n\tconst cwd = resolve(options.cwd ?? process.cwd());\n\tconst modulesMode = options.modulesMode ?? 'modules';\n\tconst escapedMode = escapeRegExp(modulesMode);\n\n\tconst scriptMatch = new RegExp(`(?:--mode[=\\\\s]+|(?:^|\\\\s)-m\\\\s+)${escapedMode}(?![\\\\w-])`);\n\tconst packageJson = readJson(join(cwd, 'package.json'));\n\tconst scripts = packageJson?.scripts;\n\tif (scripts && typeof scripts === 'object') {\n\t\tfor (const [name, command] of Object.entries(scripts as Record<string, unknown>)) {\n\t\t\tif (typeof command === 'string' && scriptMatch.test(command)) {\n\t\t\t\treturn {\n\t\t\t\t\tmodules: true,\n\t\t\t\t\treason: `package.json script \"${name}\" runs --mode ${modulesMode}`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tconst configMatch = new RegExp(`(['\"\\`])${escapedMode}\\\\1`);\n\tfor (const fileName of VITE_CONFIG_FILES) {\n\t\tconst filePath = join(cwd, fileName);\n\t\tconst source = readFileIfExists(filePath);\n\t\tif (source === null) continue;\n\t\tif (configMatch.test(source)) {\n\t\t\treturn { modules: true, reason: `${fileName} mentions the \"${modulesMode}\" mode` };\n\t\t}\n\t\t// The nearest config wins — don't keep probing alternate extensions.\n\t\treturn {\n\t\t\tmodules: false,\n\t\t\treason: `${fileName} never mentions the \"${modulesMode}\" mode`,\n\t\t};\n\t}\n\n\treturn {\n\t\tmodules: false,\n\t\treason: `no package.json script or Vite config mentions the \"${modulesMode}\" mode`,\n\t};\n}\n\nexport interface ResolvedBin {\n\t/** Binary name, or the raw value when an explicit path was given. */\n\tname: string;\n\t/** What gets handed to `spawn`. */\n\tpath: string;\n}\n\n/**\n * Find the Vite CLI the consuming package would use.\n *\n * Walks `node_modules/.bin` from `cwd` upwards, so workspace packages find a\n * hoisted binary at the monorepo root. `vite` is preferred over `vp`: plain\n * Vite is present in every setup (Vite+ installs it too) and `vp build`'s\n * extra orchestration buys these commands nothing. Packages that need `vp` —\n * for its caching or remote-cache layer — pass `--bin vp`.\n */\nexport function resolveViteBin(\n\tcwd: string = process.cwd(),\n\tcandidates: readonly string[] = BIN_CANDIDATES,\n): ResolvedBin {\n\tconst searched: string[] = [];\n\tfor (const binDir of nodeModulesBinDirs(cwd)) {\n\t\tfor (const name of candidates) {\n\t\t\tfor (const fileName of binFileNames(name)) {\n\t\t\t\tconst candidatePath = join(binDir, fileName);\n\t\t\t\tsearched.push(candidatePath);\n\t\t\t\tif (existsSync(candidatePath)) return { name, path: candidatePath };\n\t\t\t}\n\t\t}\n\t}\n\tthrow new Error(\n\t\t`[wp-vite] could not find a Vite binary (${candidates.join(' or ')}) in any ` +\n\t\t\t`node_modules/.bin above ${cwd}. Install vite in the package, or pass --bin <name|path>. ` +\n\t\t\t`Looked at:\\n ${searched.join('\\n ')}`,\n\t);\n}\n\n/** Resolve the `bin` option: a path is used as-is, a bare name is looked up. */\nexport function resolveBin(bin: string | undefined, cwd: string): string {\n\tif (!bin) return resolveViteBin(cwd).path;\n\tif (isAbsolute(bin) || bin.includes('/') || bin.includes('\\\\')) return bin;\n\ttry {\n\t\treturn resolveViteBin(cwd, [bin]).path;\n\t} catch {\n\t\t// Not in node_modules/.bin — let the OS resolve it from PATH.\n\t\treturn bin;\n\t}\n}\n\n/** Every `node_modules/.bin` from `from` up to the filesystem root. */\nfunction nodeModulesBinDirs(from: string): string[] {\n\tconst dirs: string[] = [];\n\tlet current = resolve(from);\n\tconst { root } = parsePath(current);\n\twhile (true) {\n\t\tdirs.push(join(current, 'node_modules', '.bin'));\n\t\tif (current === root) break;\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) break;\n\t\tcurrent = parent;\n\t}\n\treturn dirs;\n}\n\n/** Windows shims first, then the POSIX name. */\nfunction binFileNames(name: string): string[] {\n\treturn process.platform === 'win32' ? [`${name}.cmd`, name] : [name];\n}\n\n/**\n * Remove `outDir` — once, before any pass runs. Returns the absolute path that\n * was cleaned.\n */\nexport async function cleanOutDir(outDir = 'dist', cwd: string = process.cwd()): Promise<string> {\n\tconst base = resolve(cwd);\n\tconst target = isAbsolute(outDir) ? resolve(outDir) : resolve(base, outDir);\n\t// Never let a stray `--out-dir ..` or `--out-dir /` delete the world.\n\tif (target === parsePath(target).root || target === base || !target.startsWith(base + sep)) {\n\t\tthrow new Error(\n\t\t\t`[wp-vite] refusing to clean ${target}: the out dir must be inside ${base}`,\n\t\t);\n\t}\n\tawait rm(target, { recursive: true, force: true });\n\treturn target;\n}\n\nexport interface LinePrefixer {\n\t/** Feed a (possibly partial) chunk of child output. */\n\twrite(chunk: string): void;\n\t/** Emit a trailing line that never got its newline. */\n\tflush(): void;\n}\n\n/** Leading erase-line/erase-display sequences left over from CR redraws. */\nconst ESCAPE = String.fromCharCode(27);\nconst ERASE_SEQUENCE = new RegExp(`^(?:${ESCAPE}\\\\[[0-2]?[KJ])+`);\n\n/**\n * Prefix child output line by line. Chunks arrive on arbitrary boundaries, so\n * a partial trailing line is buffered until its newline shows up.\n *\n * Two cosmetic rules keep interleaved passes readable: blank lines pass\n * through unprefixed (Vite prints plenty, and `[script] ` alone is noise), and\n * a line redrawn with carriage returns is reduced to what a terminal would\n * actually show — the text after the last CR, minus the erase codes.\n */\nexport function createLinePrefixer(prefix: string, write: (text: string) => void): LinePrefixer {\n\tlet buffer = '';\n\tconst emit = (line: string) => {\n\t\t// A trailing CR is just CRLF; earlier CRs are redraws of the same line.\n\t\tconst withoutCrlf = line.endsWith('\\r') ? line.slice(0, -1) : line;\n\t\tconst rendered = withoutCrlf.split('\\r').pop() ?? '';\n\t\tconst content = rendered.replace(ERASE_SEQUENCE, '');\n\t\twrite(content.length === 0 ? '\\n' : `${prefix}${content}\\n`);\n\t};\n\treturn {\n\t\twrite(chunk: string) {\n\t\t\tbuffer += chunk;\n\t\t\tconst lines = buffer.split('\\n');\n\t\t\tbuffer = lines.pop() ?? '';\n\t\t\tfor (const line of lines) emit(line);\n\t\t},\n\t\tflush() {\n\t\t\tif (buffer.length === 0) return;\n\t\t\tconst pending = buffer;\n\t\t\tbuffer = '';\n\t\t\temit(pending);\n\t\t},\n\t};\n}\n\nexport interface ParsedCliArgs {\n\tcommand: string | undefined;\n\toptions: RunnerOptions;\n\thelp: boolean;\n\tversion: boolean;\n\t/** Flags that are not recognised — the CLI reports these and exits 1. */\n\tunknown: string[];\n}\n\n/**\n * Hand-rolled argv parser (no dependency). Supports:\n *\n * wp-vite <build|watch> [--out-dir dist] [--modules|--no-modules]\n * [--modules-mode modules] [--bin vite|vp|<path>]\n * [--no-clean] [--cwd <dir>] [-- <extra vite args>]\n *\n * `--flag=value` and `--flag value` are both accepted. Everything after a\n * bare `--` is forwarded verbatim to both Vite passes.\n */\nexport function parseCliArgs(argv: readonly string[]): ParsedCliArgs {\n\tconst parsed: ParsedCliArgs = {\n\t\tcommand: undefined,\n\t\toptions: {},\n\t\thelp: false,\n\t\tversion: false,\n\t\tunknown: [],\n\t};\n\tconst passthrough: string[] = [];\n\tlet index = 0;\n\n\tfor (; index < argv.length; index += 1) {\n\t\tconst arg = argv[index];\n\n\t\tif (arg === '--') {\n\t\t\tpassthrough.push(...argv.slice(index + 1));\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!arg.startsWith('-')) {\n\t\t\tif (parsed.command === undefined) parsed.command = arg;\n\t\t\telse parsed.unknown.push(arg);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst equalsAt = arg.indexOf('=');\n\t\tconst flag = equalsAt === -1 ? arg : arg.slice(0, equalsAt);\n\t\tconst inlineValue = equalsAt === -1 ? undefined : arg.slice(equalsAt + 1);\n\t\tconst takeValue = (): string | undefined => {\n\t\t\tif (inlineValue !== undefined) return inlineValue;\n\t\t\tconst next = argv[index + 1];\n\t\t\tif (next === undefined || next.startsWith('-')) return undefined;\n\t\t\tindex += 1;\n\t\t\treturn next;\n\t\t};\n\n\t\tswitch (flag) {\n\t\t\tcase '-h':\n\t\t\tcase '--help':\n\t\t\t\tparsed.help = true;\n\t\t\t\tbreak;\n\t\t\tcase '-v':\n\t\t\tcase '--version':\n\t\t\t\tparsed.version = true;\n\t\t\t\tbreak;\n\t\t\tcase '--out-dir':\n\t\t\tcase '--outDir': {\n\t\t\t\tconst value = takeValue();\n\t\t\t\tif (value === undefined) parsed.unknown.push(`${flag} (missing value)`);\n\t\t\t\telse parsed.options.outDir = value;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '--modules-mode':\n\t\t\tcase '--modulesMode': {\n\t\t\t\tconst value = takeValue();\n\t\t\t\tif (value === undefined) parsed.unknown.push(`${flag} (missing value)`);\n\t\t\t\telse parsed.options.modulesMode = value;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '--bin': {\n\t\t\t\tconst value = takeValue();\n\t\t\t\tif (value === undefined) parsed.unknown.push(`${flag} (missing value)`);\n\t\t\t\telse parsed.options.bin = value;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '--cwd': {\n\t\t\t\tconst value = takeValue();\n\t\t\t\tif (value === undefined) parsed.unknown.push(`${flag} (missing value)`);\n\t\t\t\telse parsed.options.cwd = value;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase '--modules':\n\t\t\t\tparsed.options.modules = true;\n\t\t\t\tbreak;\n\t\t\tcase '--no-modules':\n\t\t\t\tparsed.options.modules = false;\n\t\t\t\tbreak;\n\t\t\tcase '--clean':\n\t\t\t\tparsed.options.clean = true;\n\t\t\t\tbreak;\n\t\t\tcase '--no-clean':\n\t\t\t\tparsed.options.clean = false;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tparsed.unknown.push(flag);\n\t\t}\n\t}\n\n\tif (passthrough.length > 0) parsed.options.args = passthrough;\n\treturn parsed;\n}\n\n/**\n * Shared preamble: resolve the binary, decide on the module pass, clean the\n * out dir once, and log both decisions.\n */\nexport async function prepareRun(\n\toptions: RunnerOptions,\n\trunner: RunnerName,\n): Promise<{\n\tcwd: string;\n\tbin: string;\n\tmodulesMode: string;\n\tpasses: PassName[];\n\tstdout: OutputSink;\n\tstderr: OutputSink;\n}> {\n\tconst cwd = resolve(options.cwd ?? process.cwd());\n\tconst outDir = options.outDir ?? 'dist';\n\tconst modulesMode = options.modulesMode ?? 'modules';\n\tconst stdout = options.stdout ?? process.stdout;\n\tconst stderr = options.stderr ?? process.stderr;\n\n\tconst bin = resolveBin(options.bin, cwd);\n\tconst detection = detectModulePass({ cwd, modulesMode, modules: options.modules });\n\tconst passes: PassName[] = detection.modules ? ['script', 'modules'] : ['script'];\n\n\t// Cleaning here, once, is what lets every pass run with `--no-emptyOutDir`\n\t// and still start from an empty dist/.\n\tif (options.clean !== false) {\n\t\tconst cleaned = await cleanOutDir(outDir, cwd);\n\t\tstdout.write(`[wp-vite] cleaned ${cleaned}\\n`);\n\t}\n\n\tstdout.write(\n\t\t`[wp-vite] module pass ${detection.modules ? 'enabled' : 'disabled'} — ${detection.reason}; ` +\n\t\t\t`${runner === 'watch' ? 'watching' : 'building'} ${passes.join(runner === 'watch' ? ' + ' : ' then ')} via ${bin}\\n`,\n\t);\n\n\treturn { cwd, bin, modulesMode, passes, stdout, stderr };\n}\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction readFileIfExists(filePath: string): string | null {\n\ttry {\n\t\treturn readFileSync(filePath, 'utf8');\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction readJson(filePath: string): Record<string, unknown> | null {\n\tconst source = readFileIfExists(filePath);\n\tif (source === null) return null;\n\ttry {\n\t\treturn JSON.parse(source) as Record<string, unknown>;\n\t} catch {\n\t\treturn null;\n\t}\n}\n","/**\n * `wp-vite dev` — start one Vite dev server for a WordPress package.\n *\n * The sibling commands drive *two* Vite invocations, because a dual-pass build\n * genuinely needs two: a classic-script bundle and a Script Module bundle\n * cannot come out of one Rollup run. A dev server has no such problem. There\n * is no bundle at all — modules are transformed per request — so\n * [`wpDevServer`](./wp-dev-server.ts) serves both kinds of entry from a single\n * process by telling `wpExternals`, per file, which mode that file is in.\n *\n * Which makes this command the simplest of the three: resolve the consuming\n * package's Vite binary, spawn `<bin> dev`, forward signals, exit with the\n * child's code. The interesting parts all live in the plugin.\n *\n * Two deliberate differences from `build` / `watch`:\n *\n * - **The out dir is not cleaned.** `dist/` in dev holds the hot file, the\n * `.asset.php` sidecars and the blocks metadata that PHP reads on the very\n * first request — plus whatever a previous build left there, which stays\n * valid the moment the server stops. Wiping it on every `dev` would break\n * the site for the seconds before the plugin rewrites it, and would delete\n * build output nobody asked to lose. Pass `--clean` if you want it.\n * - **The child inherits stdio.** No `[dev] ` prefix: one child needs no\n * disambiguation, and piping would cost the dev server its TTY — the\n * `r`/`u`/`o`/`q` shortcuts, colour, and the clickable local URL.\n *\n * The shell-out rule from [`./runner`](./runner.ts) holds here too: this file\n * never imports Vite. It spawns yours.\n */\nimport type { ChildProcess } from 'node:child_process';\nimport { resolve } from 'node:path';\nimport {\n\tcleanOutDir,\n\tdescribeExit,\n\tforwardSignals,\n\tpassExitCode,\n\tresolveBin,\n\tspawnPass,\n\ttype RunnerOptions,\n} from './runner';\n\n/**\n * The shared surface the commands expose, so a consumer can reach the helpers\n * from any of the three subpaths.\n */\nexport {\n\tBIN_CANDIDATES,\n\tDEFAULT_BUILD_ARGS,\n\tDEFAULT_WATCH_ARGS,\n\tcleanOutDir,\n\tcreateLinePrefixer,\n\tdetectModulePass,\n\tparseCliArgs,\n\tresolveViteBin,\n} from './runner';\nexport type {\n\tDetectModulePassOptions,\n\tLinePrefixer,\n\tModulePassDetection,\n\tOutputSink,\n\tParsedCliArgs,\n\tPassName,\n\tResolvedBin,\n\tRunnerName,\n\tRunnerOptions,\n\tRunnerSignal,\n} from './runner';\n\n/**\n * Arguments the dev server is started with.\n *\n * `--no-clearScreen` keeps the startup banner (`[wp-vite] serving …`) on\n * screen, for the same reason the build passes get it: a line that explains\n * which binary is running and where it is running must not be erased by the\n * thing it explains.\n */\nexport const DEFAULT_DEV_ARGS = ['dev', '--no-clearScreen'];\n\n/**\n * Options for `dev()`. A subset of `RunnerOptions` — the dual-pass knobs\n * (`modules`, `modulesMode`) have no meaning for a single server.\n */\nexport type DevOptions = Omit<RunnerOptions, 'modules' | 'modulesMode' | 'buildArgs'> & {\n\t/**\n\t * Replaces the built-in argv (`DEFAULT_DEV_ARGS`). Escape hatch for tests —\n\t * it lets a stand-in child stand in for a real Vite invocation.\n\t */\n\tdevArgs?: string[];\n\t/**\n\t * Give the child this process' stdio. Default `true`; tests turn it off so\n\t * output can be captured.\n\t */\n\tinherit?: boolean;\n};\n\n/**\n * Start the dev server. Resolves with the process exit code: the child's own\n * code normally, `0` for a clean `Ctrl-C`.\n */\nexport async function dev(options: DevOptions = {}): Promise<number> {\n\tconst cwd = resolve(options.cwd ?? process.cwd());\n\tconst stdout = options.stdout ?? process.stdout;\n\tconst stderr = options.stderr ?? process.stderr;\n\tconst bin = resolveBin(options.bin, cwd);\n\n\t// Opt-in only — see the module comment.\n\tif (options.clean === true) {\n\t\tconst cleaned = await cleanOutDir(options.outDir ?? 'dist', cwd);\n\t\tstdout.write(`[wp-vite] cleaned ${cleaned}\\n`);\n\t}\n\n\tstdout.write(`[wp-vite] starting the dev server via ${bin}\\n`);\n\n\tlet current: ChildProcess | undefined;\n\tlet interrupted = false;\n\n\tconst disposeSignals =\n\t\toptions.handleSignals === false\n\t\t\t? () => {}\n\t\t\t: forwardSignals((signal) => {\n\t\t\t\t\tif (interrupted) return;\n\t\t\t\t\tinterrupted = true;\n\t\t\t\t\tif (current && current.exitCode === null && current.signalCode === null) {\n\t\t\t\t\t\tcurrent.kill(signal);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\ttry {\n\t\tconst spawned = spawnPass({\n\t\t\tpass: 'dev',\n\t\t\trunner: 'dev',\n\t\t\tbin,\n\t\t\tcwd,\n\t\t\targv: [...(options.devArgs ?? DEFAULT_DEV_ARGS), ...(options.args ?? [])],\n\t\t\tenv: options.env,\n\t\t\tstdout,\n\t\t\tstderr,\n\t\t\tinherit: options.inherit !== false,\n\t\t});\n\t\tcurrent = spawned.child;\n\t\tconst result = await spawned.result;\n\t\tcurrent = undefined;\n\n\t\t// A server the user stopped is a success, whatever signal did it.\n\t\tif (interrupted) return 0;\n\n\t\tconst code = passExitCode(result);\n\t\tif (code !== 0) {\n\t\t\tstderr.write(\n\t\t\t\t`[wp-vite] the dev server exited (${describeExit(result.code, result.signal)})\\n`,\n\t\t\t);\n\t\t}\n\t\treturn code;\n\t} finally {\n\t\tdisposeSignals();\n\t}\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -174,6 +174,13 @@ interface WpExternalsOptions {
|
|
|
174
174
|
* Example: `['ignite-wp-navigation', 'ignite-*']`
|
|
175
175
|
*/
|
|
176
176
|
scriptModuleNamespaces?: string[];
|
|
177
|
+
/**
|
|
178
|
+
* Populated during the build with specifier → window global for every
|
|
179
|
+
* script-eligible external. `wpScriptIife` uses it to build a `require`
|
|
180
|
+
* shim for CJS deps, which Rolldown resolves at runtime rather than
|
|
181
|
+
* through the import rewrite.
|
|
182
|
+
*/
|
|
183
|
+
globalsSink?: Map<string, string>;
|
|
177
184
|
/**
|
|
178
185
|
* Bare package names to **force-bundle**: their externalization is
|
|
179
186
|
* suppressed and their imports are rewritten to resolve against the
|
|
@@ -204,8 +211,133 @@ interface WpExternalsOptions {
|
|
|
204
211
|
* without this list the behavior depends on which copy the resolver hoists.)
|
|
205
212
|
*/
|
|
206
213
|
declare const DEFAULT_BUNDLED_PACKAGES: string[];
|
|
214
|
+
/**
|
|
215
|
+
* Config `resolveExternal` needs to make its verdict, extracted so the
|
|
216
|
+
* resolver can be reused outside `wpExternals()` itself (e.g. a dev server
|
|
217
|
+
* doing its own static dependency scan) without re-deriving `wpExternals`'
|
|
218
|
+
* option defaults.
|
|
219
|
+
*/
|
|
220
|
+
interface ResolveExternalOptions {
|
|
221
|
+
/** Project root used to resolve `@wordpress/*` package.jsons. */
|
|
222
|
+
projectRoot: string;
|
|
223
|
+
/** Vendor external map (`react`, `jquery`, …). Defaults to `DEFAULT_VENDOR`. */
|
|
224
|
+
vendorExternals?: Record<string, {
|
|
225
|
+
global: string;
|
|
226
|
+
handle: string | null;
|
|
227
|
+
}>;
|
|
228
|
+
/** Config-driven classic-script namespaces (`@woo/*`, etc.). */
|
|
229
|
+
externalNamespaces?: Record<string, ExternalNamespace>;
|
|
230
|
+
/** Script Module namespaces — exact names or `prefix-*` globs. */
|
|
231
|
+
scriptModuleNamespaces?: string[];
|
|
232
|
+
/** Bare package names to force-bundle (never externalized). */
|
|
233
|
+
bundledPackages?: ReadonlySet<string> | string[];
|
|
234
|
+
}
|
|
207
235
|
declare function wpExternals(options?: WpExternalsOptions): Plugin[];
|
|
208
236
|
|
|
237
|
+
/**
|
|
238
|
+
* Name of the hot file, relative to the resolved `build.outDir`.
|
|
239
|
+
*
|
|
240
|
+
* Exported because the generated PHP bridge has to spell the same name, and a
|
|
241
|
+
* drifting constant here is a silently dead dev server there.
|
|
242
|
+
*/
|
|
243
|
+
declare const HOT_FILE_NAME = ".wp-vite-dev.json";
|
|
244
|
+
/**
|
|
245
|
+
* Name of the generated PHP bridge, relative to the resolved `build.outDir`.
|
|
246
|
+
*
|
|
247
|
+
* Written by *both* halves of this module: `wpDevServerPhp` emits it into every
|
|
248
|
+
* build so a consumer's `require_once` is never a dead path, and `wpDevServer`
|
|
249
|
+
* writes the identical bytes on server start so a `dist/` that has never been
|
|
250
|
+
* built still bridges.
|
|
251
|
+
*/
|
|
252
|
+
declare const DEV_SERVER_PHP_NAME = "dev-server.php";
|
|
253
|
+
interface WpDevServerOptions {
|
|
254
|
+
/** Blocks directory — same value `wpBlocks` gets. Enables block discovery. */
|
|
255
|
+
blocksDir?: string;
|
|
256
|
+
/** Per-block stylesheet directory — same value `wpBlockStyles` gets. */
|
|
257
|
+
blocksStylesDir?: string;
|
|
258
|
+
/** Admin pages directory — same value `wpAdminPages` gets. */
|
|
259
|
+
adminPagesDir?: string;
|
|
260
|
+
/** Block directory names to skip, mirroring `wpBlocks`' `skip`. */
|
|
261
|
+
skip?: string[];
|
|
262
|
+
/**
|
|
263
|
+
* The mode this server's config maps to — the same `buildType` the build
|
|
264
|
+
* plugins get. Only the entries declared in `build.rollupOptions.input`
|
|
265
|
+
* need it; blocks and admin pages carry their own verdict from discovery.
|
|
266
|
+
* Default: `'script'`, which is what a dual-pass consumer's serve-mode
|
|
267
|
+
* config resolves to.
|
|
268
|
+
*/
|
|
269
|
+
buildType?: 'script' | 'module';
|
|
270
|
+
/** Write `blocks-manifest.php` into `outDir`. Default: `true`. */
|
|
271
|
+
emitManifest?: boolean;
|
|
272
|
+
/**
|
|
273
|
+
* Root used to resolve `@wordpress/*` package.jsons during the dependency
|
|
274
|
+
* scan. Must match `wpExternals`' `projectRoot` or the two disagree about
|
|
275
|
+
* what is external. Defaults to `process.cwd()`.
|
|
276
|
+
*/
|
|
277
|
+
projectRoot?: string;
|
|
278
|
+
/**
|
|
279
|
+
* The rest of `wpExternals`' externalization config, so the dev scan
|
|
280
|
+
* reaches the same verdicts the build does. `wp()` forwards these.
|
|
281
|
+
*/
|
|
282
|
+
externalNamespaces?: ResolveExternalOptions['externalNamespaces'];
|
|
283
|
+
additionalExternals?: ResolveExternalOptions['vendorExternals'];
|
|
284
|
+
scriptModuleNamespaces?: string[];
|
|
285
|
+
bundledPackages?: string[];
|
|
286
|
+
/**
|
|
287
|
+
* Live array shared with `wpExternals`' `moduleEntryMatchers`. The plugin
|
|
288
|
+
* *pushes* every discovered module-pass entry path into it during
|
|
289
|
+
* `configResolved`, which is what makes one dev server serve both passes
|
|
290
|
+
* correctly — see the note on `syncModuleEntryMatchers()`.
|
|
291
|
+
*/
|
|
292
|
+
moduleEntryMatchers?: string[];
|
|
293
|
+
/**
|
|
294
|
+
* Entry source paths whose sidecar uses the `@wordpress/build` shape,
|
|
295
|
+
* mirroring `wpExternals`' option of the same name. `wp()` wires
|
|
296
|
+
* `adminPagesDir` in automatically.
|
|
297
|
+
*/
|
|
298
|
+
wpBuildAssetMatchers?: string[];
|
|
299
|
+
/** Depth limit for the static import walk. Default: 24. */
|
|
300
|
+
maxScanDepth?: number;
|
|
301
|
+
/**
|
|
302
|
+
* Identifier prefix for `dev-server.php`'s functions and script handles.
|
|
303
|
+
* Defaults to `wpPlugin.name`, else the de-scoped `name`, from the
|
|
304
|
+
* package.json at Vite's `root` — else `'wp-vite'`.
|
|
305
|
+
*/
|
|
306
|
+
phpPrefix?: string;
|
|
307
|
+
}
|
|
308
|
+
/** `wpDevServerPhp`'s options — the build-side half of the bridge. */
|
|
309
|
+
interface WpDevServerPhpOptions {
|
|
310
|
+
/** Identifier prefix. Same default as `wpDevServer`'s option of the same name. */
|
|
311
|
+
phpPrefix?: string;
|
|
312
|
+
/** Root whose package.json supplies the prefix default. Defaults to Vite's `root`. */
|
|
313
|
+
projectRoot?: string;
|
|
314
|
+
}
|
|
315
|
+
/** What the hot file contains. Consumed by the generated PHP bridge. */
|
|
316
|
+
interface WpDevServerHotFile {
|
|
317
|
+
/** Scheme + host + port the browser should fetch assets from. No trailing slash. */
|
|
318
|
+
origin: string;
|
|
319
|
+
/** Vite's `base`, with its leading and trailing slash intact (`/` by default). */
|
|
320
|
+
base: string;
|
|
321
|
+
/** Names of the plugins in the resolved config that PHP has to react to. */
|
|
322
|
+
plugins: string[];
|
|
323
|
+
}
|
|
324
|
+
declare function wpDevServer(options?: WpDevServerOptions): Plugin;
|
|
325
|
+
/**
|
|
326
|
+
* Emit `dist/dev-server.php` — the build-side half of the bridge.
|
|
327
|
+
*
|
|
328
|
+
* Its own plugin, `apply: 'build'`, for one reason: the consumer's PHP holds a
|
|
329
|
+
* single unconditional `require_once __DIR__ . '/dist/dev-server.php'`, and
|
|
330
|
+
* that line has to be true of *every* build — a block plugin with no admin
|
|
331
|
+
* pages, a theme with nothing but a stylesheet entry, the module pass of a
|
|
332
|
+
* dual-pass build. Hanging the emission off `wpAdminPages` (which owns the rest
|
|
333
|
+
* of the generated PHP) or off `wpExternals` (which owns the sidecars the
|
|
334
|
+
* bridge reads) would have made it conditional on something unrelated.
|
|
335
|
+
*
|
|
336
|
+
* The file itself is inert in a built site: nothing writes a hot file next to
|
|
337
|
+
* it, so it returns after one `file_exists()`.
|
|
338
|
+
*/
|
|
339
|
+
declare function wpDevServerPhp(options?: WpDevServerPhpOptions): Plugin;
|
|
340
|
+
|
|
209
341
|
interface WpOptions {
|
|
210
342
|
/** Build mode for sub-plugins. Default: `'script'`. */
|
|
211
343
|
buildType?: 'script' | 'module';
|
|
@@ -222,6 +354,15 @@ interface WpOptions {
|
|
|
222
354
|
copyAssets?: Partial<WpCopyAssetsOptions> | false;
|
|
223
355
|
adminPages?: Partial<WpAdminPagesOptions> | false;
|
|
224
356
|
externals?: WpExternalsOptions | false;
|
|
357
|
+
/**
|
|
358
|
+
* The `apply: 'serve'` dev-server bridge — hot file, dev `.asset.php`
|
|
359
|
+
* sidecars, blocks metadata, and the bare-specifier escape that keeps
|
|
360
|
+
* Script Module entries servable. Included by default and completely inert
|
|
361
|
+
* in a build; pass `false` to leave dev alone, or an object to override its
|
|
362
|
+
* options (the directories and externals config are wired from the
|
|
363
|
+
* top-level keys automatically).
|
|
364
|
+
*/
|
|
365
|
+
devServer?: WpDevServerOptions | false;
|
|
225
366
|
/** Disable the auto-included script-IIFE helper. Default: enabled in script mode. */
|
|
226
367
|
iife?: false;
|
|
227
368
|
/**
|
|
@@ -260,7 +401,17 @@ declare function wpScriptDedupe(): Plugin;
|
|
|
260
401
|
* must stay as bare ESM for WP's import map to resolve them at runtime.
|
|
261
402
|
*/
|
|
262
403
|
|
|
263
|
-
|
|
404
|
+
interface WpScriptIifeOptions {
|
|
405
|
+
/**
|
|
406
|
+
* Specifier → window global, used to shim `require()` for CJS dependencies
|
|
407
|
+
* whose `require` Rolldown resolves at runtime rather than through
|
|
408
|
+
* `wpExternals`' import rewrite.
|
|
409
|
+
*
|
|
410
|
+
* `wp()` passes `wpExternals`' `globalsSink` automatically.
|
|
411
|
+
*/
|
|
412
|
+
globals?: Map<string, string>;
|
|
413
|
+
}
|
|
414
|
+
declare function wpScriptIife(options?: WpScriptIifeOptions): Plugin;
|
|
264
415
|
|
|
265
416
|
/**
|
|
266
417
|
* vite-plugin-wp-clean-css-chunks
|
|
@@ -278,4 +429,4 @@ declare function wpCleanCssChunks(): Plugin;
|
|
|
278
429
|
|
|
279
430
|
declare function wpCssAssetInfo(): Plugin;
|
|
280
431
|
|
|
281
|
-
export { DEFAULT_BUNDLED_PACKAGES, type ExternalNamespace, type WpAdminPagesOptions, type WpAdminPagesPhpOptions, type WpBlockStylesOptions, type WpBlocksOptions, type WpCopyAssetsOptions, type WpExternalsOptions, type WpOptions, wp, wpAdminPages, wpBlockStyles, wpBlocks, wpCleanCssChunks, wpCopyAssets, wpCssAssetInfo, wpExternals, wpScriptDedupe, wpScriptIife };
|
|
432
|
+
export { DEFAULT_BUNDLED_PACKAGES, DEV_SERVER_PHP_NAME, type ExternalNamespace, HOT_FILE_NAME, type WpAdminPagesOptions, type WpAdminPagesPhpOptions, type WpBlockStylesOptions, type WpBlocksOptions, type WpCopyAssetsOptions, type WpDevServerHotFile, type WpDevServerOptions, type WpDevServerPhpOptions, type WpExternalsOptions, type WpOptions, type WpScriptIifeOptions, wp, wpAdminPages, wpBlockStyles, wpBlocks, wpCleanCssChunks, wpCopyAssets, wpCssAssetInfo, wpDevServer, wpDevServerPhp, wpExternals, wpScriptDedupe, wpScriptIife };
|