vize 0.97.0 → 0.100.0
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/dist/cli.d.mts +7 -1
- package/dist/cli.d.mts.map +1 -1
- package/dist/cli.mjs +104 -70
- package/dist/cli.mjs.map +1 -1
- package/package.json +9 -9
- package/src/cli.test.ts +27 -0
- package/src/cli.ts +185 -105
package/dist/cli.d.mts
CHANGED
|
@@ -7,6 +7,12 @@ declare function shouldRetainCheckSource(options: {
|
|
|
7
7
|
}): boolean;
|
|
8
8
|
declare function sanitizeTerminalText(value: unknown): string;
|
|
9
9
|
declare function displayPath(filePath: string): string;
|
|
10
|
+
interface BoundedFileBatchOptions {
|
|
11
|
+
maxFiles: number;
|
|
12
|
+
maxBytes: number;
|
|
13
|
+
sizeOf?: (file: string) => number;
|
|
14
|
+
}
|
|
15
|
+
declare function createBoundedFileBatches(files: readonly string[], options: BoundedFileBatchOptions): string[][];
|
|
10
16
|
//#endregion
|
|
11
|
-
export { displayPath, sanitizeTerminalText, shouldPreferWorkspaceBinding, shouldRetainCheckSource };
|
|
17
|
+
export { createBoundedFileBatches, displayPath, sanitizeTerminalText, shouldPreferWorkspaceBinding, shouldRetainCheckSource };
|
|
12
18
|
//# sourceMappingURL=cli.d.mts.map
|
package/dist/cli.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.mts","names":[],"sources":["../src/cli.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.mts","names":[],"sources":["../src/cli.ts"],"mappings":";iBA8IgB,4BAAA,CAA6B,YAAA;AAAA,iBAixB7B,uBAAA,CAAwB,OAAA;EACtC,WAAA;EACA,MAAA;EACA,KAAA;AAAA;AAAA,iBAac,oBAAA,CAAqB,KAAA;AAAA,iBA+DrB,WAAA,CAAY,QAAA;AAAA,UA4IlB,uBAAA;EACR,QAAA;EACA,QAAA;EACA,MAAA,IAAU,IAAA;AAAA;AAAA,iBAWI,wBAAA,CACd,KAAA,qBACA,OAAA,EAAS,uBAAA"}
|
package/dist/cli.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import { pathToFileURL } from "node:url";
|
|
|
8
8
|
const require = createRequire(import.meta.url);
|
|
9
9
|
const WORKSPACE_BINDING_PATH = "../../vize-native";
|
|
10
10
|
const BUILD_BATCH_SIZE = 128;
|
|
11
|
+
const BUILD_BATCH_MAX_BYTES = 32 * 1024 * 1024;
|
|
11
12
|
const SKIPPED_VUE_FILE_DIRECTORIES = new Set([
|
|
12
13
|
"node_modules",
|
|
13
14
|
"dist",
|
|
@@ -279,16 +280,18 @@ async function runBuild(args) {
|
|
|
279
280
|
}
|
|
280
281
|
const native = loadNative("build");
|
|
281
282
|
const startedAt = performance.now();
|
|
283
|
+
const batches = createBoundedFileBatches(files, {
|
|
284
|
+
maxFiles: BUILD_BATCH_SIZE,
|
|
285
|
+
maxBytes: BUILD_BATCH_MAX_BYTES
|
|
286
|
+
});
|
|
282
287
|
if (options.format !== "stats") mkdirSync(options.output, { recursive: true });
|
|
283
288
|
let nativeTimeMs = 0;
|
|
284
289
|
let failed = 0;
|
|
285
290
|
let success = 0;
|
|
286
|
-
for (
|
|
287
|
-
const end = Math.min(start + BUILD_BATCH_SIZE, files.length);
|
|
291
|
+
for (const batch of batches) {
|
|
288
292
|
const inputs = [];
|
|
289
293
|
const extensionByPath = /* @__PURE__ */ new Map();
|
|
290
|
-
for (
|
|
291
|
-
const file = files[index];
|
|
294
|
+
for (const file of batch) {
|
|
292
295
|
const source = readFileSync(file, "utf8");
|
|
293
296
|
extensionByPath.set(file, getOutputExtension(source, options.scriptExt));
|
|
294
297
|
inputs.push({
|
|
@@ -515,14 +518,13 @@ function displayPath(filePath) {
|
|
|
515
518
|
function isVueFile(filePath) {
|
|
516
519
|
return path.extname(filePath) === ".vue";
|
|
517
520
|
}
|
|
518
|
-
function collectVueFilesFromDirectory(directory, recursive) {
|
|
519
|
-
const files = [];
|
|
521
|
+
function collectVueFilesFromDirectory(directory, recursive, files = []) {
|
|
520
522
|
const entries = readdirSync(directory, { withFileTypes: true });
|
|
521
523
|
for (const entry of entries) {
|
|
522
524
|
const entryPath = path.join(directory, entry.name);
|
|
523
525
|
if (entry.isDirectory()) {
|
|
524
526
|
if (SKIPPED_VUE_FILE_DIRECTORIES.has(entry.name)) continue;
|
|
525
|
-
if (recursive)
|
|
527
|
+
if (recursive) collectVueFilesFromDirectory(entryPath, true, files);
|
|
526
528
|
} else if (entry.isFile() && isVueFile(entryPath)) files.push(entryPath);
|
|
527
529
|
}
|
|
528
530
|
return files;
|
|
@@ -588,10 +590,37 @@ function collectVueFiles(patterns) {
|
|
|
588
590
|
}
|
|
589
591
|
return Array.from(files).sort();
|
|
590
592
|
}
|
|
591
|
-
function
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
593
|
+
function statFileSize(file) {
|
|
594
|
+
try {
|
|
595
|
+
return statSync(file).size;
|
|
596
|
+
} catch {
|
|
597
|
+
return 0;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
function createBoundedFileBatches(files, options) {
|
|
601
|
+
const maxFiles = Math.max(1, Math.floor(options.maxFiles));
|
|
602
|
+
const maxBytes = Math.max(1, Math.floor(options.maxBytes));
|
|
603
|
+
const sizeOf = options.sizeOf ?? statFileSize;
|
|
604
|
+
const batches = [];
|
|
605
|
+
let current = [];
|
|
606
|
+
let currentBytes = 0;
|
|
607
|
+
for (const file of files) {
|
|
608
|
+
const fileBytes = Math.max(0, sizeOf(file));
|
|
609
|
+
if (current.length > 0 && (current.length >= maxFiles || currentBytes + fileBytes > maxBytes)) {
|
|
610
|
+
batches.push(current);
|
|
611
|
+
current = [];
|
|
612
|
+
currentBytes = 0;
|
|
613
|
+
}
|
|
614
|
+
current.push(file);
|
|
615
|
+
currentBytes += fileBytes;
|
|
616
|
+
}
|
|
617
|
+
if (current.length > 0) batches.push(current);
|
|
618
|
+
return batches;
|
|
619
|
+
}
|
|
620
|
+
function commonSourceDirectory(files) {
|
|
621
|
+
let common = path.dirname(files[0] ?? process.cwd());
|
|
622
|
+
for (let i = 1; i < files.length; i++) {
|
|
623
|
+
const directory = path.dirname(files[i]);
|
|
595
624
|
while (common !== path.dirname(common)) {
|
|
596
625
|
const relative = path.relative(common, directory);
|
|
597
626
|
if (relative !== ".." && !relative.startsWith(`..${path.sep}`)) break;
|
|
@@ -600,23 +629,16 @@ function commonSourceDirectory(results) {
|
|
|
600
629
|
}
|
|
601
630
|
return common;
|
|
602
631
|
}
|
|
603
|
-
function
|
|
604
|
-
if (!options.declaration) return [];
|
|
605
|
-
if (typeof native.generateDeclaration !== "function") throw new Error("The loaded native binding does not support declaration generation.");
|
|
632
|
+
function emitCheckDeclaration(file, source, sourceRoot, native, options) {
|
|
606
633
|
const outDir = path.resolve(process.cwd(), options.declarationDir ?? "dist/types");
|
|
607
|
-
const
|
|
608
|
-
const
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
file: displayPath(outputPath),
|
|
616
|
-
path: outputPath
|
|
617
|
-
});
|
|
618
|
-
}
|
|
619
|
-
return declarations;
|
|
634
|
+
const relative = normalizePath(path.relative(sourceRoot, file));
|
|
635
|
+
const outputPath = path.join(outDir, `${relative}.d.ts`);
|
|
636
|
+
mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
637
|
+
writeFileSync(outputPath, native.generateDeclaration(source, { filename: file }).code);
|
|
638
|
+
return {
|
|
639
|
+
file: displayPath(outputPath),
|
|
640
|
+
path: outputPath
|
|
641
|
+
};
|
|
620
642
|
}
|
|
621
643
|
function lineStarts(source) {
|
|
622
644
|
const starts = [0];
|
|
@@ -659,31 +681,47 @@ function toNativeTypeCheckOptions(file, options) {
|
|
|
659
681
|
check_fallthrough_attrs: options.checkFallthroughAttrs
|
|
660
682
|
};
|
|
661
683
|
}
|
|
662
|
-
function
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
const
|
|
671
|
-
process.stdout.write(
|
|
672
|
-
|
|
673
|
-
const color = diagnostic.severity === "error" ? "\x1B[31m" : "\x1B[33m";
|
|
674
|
-
const location = offsetToLineColumn(starts, diagnostic.start);
|
|
675
|
-
const code = diagnostic.code ? ` [${sanitizeTerminalText(diagnostic.code)}]` : "";
|
|
676
|
-
process.stdout.write(` ${color}${diagnostic.severity}:${location.line}:${location.column}\x1b[0m${code} ${sanitizeTerminalText(diagnostic.message)}\n`);
|
|
677
|
-
if (diagnostic.help) process.stdout.write(` help: ${sanitizeTerminalText(diagnostic.help)}\n`);
|
|
678
|
-
}
|
|
684
|
+
function renderCheckFileText(file, source, result, options) {
|
|
685
|
+
if (options.includeVirtualTs && result.virtualTs) process.stderr.write(`\n=== ${displayPath(file)} ===\n${sanitizeTerminalText(result.virtualTs)}\n`);
|
|
686
|
+
if (options.quiet || result.diagnostics.length === 0) return;
|
|
687
|
+
const starts = lineStarts(source);
|
|
688
|
+
process.stdout.write(`\n\x1b[4m${displayPath(file)}\x1b[0m\n`);
|
|
689
|
+
for (const diagnostic of result.diagnostics) {
|
|
690
|
+
const color = diagnostic.severity === "error" ? "\x1B[31m" : "\x1B[33m";
|
|
691
|
+
const location = offsetToLineColumn(starts, diagnostic.start);
|
|
692
|
+
const code = diagnostic.code ? ` [${sanitizeTerminalText(diagnostic.code)}]` : "";
|
|
693
|
+
process.stdout.write(` ${color}${diagnostic.severity}:${location.line}:${location.column}\x1b[0m${code} ${sanitizeTerminalText(diagnostic.message)}\n`);
|
|
694
|
+
if (diagnostic.help) process.stdout.write(` help: ${sanitizeTerminalText(diagnostic.help)}\n`);
|
|
679
695
|
}
|
|
696
|
+
}
|
|
697
|
+
function renderCheckSummary(totalErrors, totalWarnings, fileCount, timeMs, declarations) {
|
|
680
698
|
const status = totalErrors > 0 ? "\x1B[31mERR\x1B[0m" : "\x1B[32mOK\x1B[0m";
|
|
681
|
-
process.stdout.write(`\n${status} Type checked ${
|
|
699
|
+
process.stdout.write(`\n${status} Type checked ${fileCount} Vue files in ${timeMs.toFixed(2)}ms\n`);
|
|
682
700
|
if (totalErrors > 0) process.stdout.write(` \x1b[31m${totalErrors} error(s)\x1b[0m\n`);
|
|
683
701
|
else process.stdout.write(" \x1B[32mNo type errors found!\x1B[0m\n");
|
|
684
702
|
if (totalWarnings > 0) process.stdout.write(` \x1b[33m${totalWarnings} warning(s)\x1b[0m\n`);
|
|
685
703
|
if (declarations.length > 0) process.stdout.write(` \x1b[32mEmitted ${declarations.length} declaration file(s)\x1b[0m\n`);
|
|
686
704
|
}
|
|
705
|
+
function indentJson(value, spaces) {
|
|
706
|
+
const padding = " ".repeat(spaces);
|
|
707
|
+
return JSON.stringify(value, null, 2).split("\n").map((line) => `${padding}${line}`).join("\n");
|
|
708
|
+
}
|
|
709
|
+
function writeCheckJsonFile(index, file, result) {
|
|
710
|
+
if (index > 0) process.stdout.write(",\n");
|
|
711
|
+
process.stdout.write(indentJson({
|
|
712
|
+
file: displayPath(file),
|
|
713
|
+
diagnostics: result.diagnostics,
|
|
714
|
+
virtualTs: result.virtualTs
|
|
715
|
+
}, 4));
|
|
716
|
+
}
|
|
717
|
+
function writeCheckJsonEnd(totalErrors, totalWarnings, fileCount, declarations) {
|
|
718
|
+
process.stdout.write("\n ],\n");
|
|
719
|
+
process.stdout.write(` "errorCount": ${totalErrors},\n`);
|
|
720
|
+
process.stdout.write(` "warningCount": ${totalWarnings},\n`);
|
|
721
|
+
process.stdout.write(` "fileCount": ${fileCount},\n`);
|
|
722
|
+
process.stdout.write(` "declarations": ${indentJson(declarations.map(({ file }) => file), 2).trimStart()}\n`);
|
|
723
|
+
process.stdout.write("}\n");
|
|
724
|
+
}
|
|
687
725
|
async function runCheck(args) {
|
|
688
726
|
const { patterns, options, sharedConfig } = parseCheckCommand(args);
|
|
689
727
|
if (options.help) {
|
|
@@ -713,32 +751,28 @@ async function runCheck(args) {
|
|
|
713
751
|
return;
|
|
714
752
|
}
|
|
715
753
|
const native = loadNative("check");
|
|
716
|
-
|
|
754
|
+
if (options.declaration && typeof native.generateDeclaration !== "function") throw new Error("The loaded native binding does not support declaration generation.");
|
|
755
|
+
const sourceRoot = options.declaration ? commonSourceDirectory(files) : "";
|
|
756
|
+
const checkStartedAt = performance.now();
|
|
717
757
|
const retainSource = shouldRetainCheckSource(options);
|
|
718
|
-
const
|
|
758
|
+
const declarations = [];
|
|
759
|
+
let totalErrors = 0;
|
|
760
|
+
let totalWarnings = 0;
|
|
761
|
+
let checkedCount = 0;
|
|
762
|
+
if (options.format === "json") process.stdout.write("{\n \"files\": [\n");
|
|
763
|
+
for (const file of files) {
|
|
719
764
|
const source = readFileSync(file, "utf8");
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
const
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
files: results.map(({ file, result }) => ({
|
|
732
|
-
file: displayPath(file),
|
|
733
|
-
diagnostics: result.diagnostics,
|
|
734
|
-
virtualTs: result.virtualTs
|
|
735
|
-
})),
|
|
736
|
-
errorCount: totalErrors,
|
|
737
|
-
warningCount: totalWarnings,
|
|
738
|
-
fileCount: results.length,
|
|
739
|
-
declarations: declarations.map(({ file }) => file)
|
|
740
|
-
}, null, 2)}\n`);
|
|
741
|
-
else renderCheckText(results, options, timeMs, declarations);
|
|
765
|
+
const result = native.typeCheck(source, toNativeTypeCheckOptions(file, options));
|
|
766
|
+
totalErrors += result.errorCount;
|
|
767
|
+
totalWarnings += result.warningCount;
|
|
768
|
+
checkedCount++;
|
|
769
|
+
if (options.declaration) declarations.push(emitCheckDeclaration(file, source, sourceRoot, native, options));
|
|
770
|
+
if (options.format === "json") writeCheckJsonFile(checkedCount - 1, file, result);
|
|
771
|
+
else renderCheckFileText(file, retainSource ? source : "", result, options);
|
|
772
|
+
}
|
|
773
|
+
const timeMs = performance.now() - checkStartedAt;
|
|
774
|
+
if (options.format === "json") writeCheckJsonEnd(totalErrors, totalWarnings, checkedCount, declarations);
|
|
775
|
+
else renderCheckSummary(totalErrors, totalWarnings, checkedCount, timeMs, declarations);
|
|
742
776
|
if (totalErrors > 0) process.exit(1);
|
|
743
777
|
if (options.maxWarnings !== void 0 && totalWarnings > options.maxWarnings) {
|
|
744
778
|
process.stderr.write(`\nToo many warnings (${totalWarnings} > max ${options.maxWarnings})\n`);
|
|
@@ -981,6 +1015,6 @@ if (!(Boolean(import.meta.vitest) || process.env.VITEST === "true" || process.en
|
|
|
981
1015
|
process.exit(1);
|
|
982
1016
|
});
|
|
983
1017
|
//#endregion
|
|
984
|
-
export { displayPath, sanitizeTerminalText, shouldPreferWorkspaceBinding, shouldRetainCheckSource };
|
|
1018
|
+
export { createBoundedFileBatches, displayPath, sanitizeTerminalText, shouldPreferWorkspaceBinding, shouldRetainCheckSource };
|
|
985
1019
|
|
|
986
1020
|
//# sourceMappingURL=cli.mjs.map
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { spawnSync } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { loadConfig } from \"./config.js\";\n\nconst require = createRequire(import.meta.url);\nconst WORKSPACE_BINDING_PATH = \"../../vize-native\";\nconst BUILD_BATCH_SIZE = 128;\nconst SKIPPED_VUE_FILE_DIRECTORIES = new Set([\n \"node_modules\",\n \"dist\",\n \".git\",\n \".nuxt\",\n \".output\",\n \".nitro\",\n \"coverage\",\n]);\n\n// ============================================================================\n// Native binding loader (oxlint pattern)\n// ============================================================================\n\nfunction isMusl(): boolean {\n const report = process.report?.getReport();\n if (typeof report === \"object\" && report !== null && \"header\" in report) {\n const header = (report as { header: { glibcVersionRuntime?: string } }).header;\n return !header.glibcVersionRuntime;\n }\n try {\n const lddPath = require(\"child_process\").execSync(\"which ldd\").toString().trim();\n return readFileSync(lddPath, \"utf8\").includes(\"musl\");\n } catch {\n return true;\n }\n}\n\nfunction getBindingPackageName(): string {\n const { platform, arch } = process;\n\n switch (platform) {\n case \"darwin\":\n switch (arch) {\n case \"x64\":\n return \"@vizejs/native-darwin-x64\";\n case \"arm64\":\n return \"@vizejs/native-darwin-arm64\";\n default:\n throw new Error(`Unsupported architecture on macOS: ${arch}`);\n }\n case \"win32\":\n switch (arch) {\n case \"x64\":\n return \"@vizejs/native-win32-x64-msvc\";\n case \"arm64\":\n return \"@vizejs/native-win32-arm64-msvc\";\n default:\n throw new Error(`Unsupported architecture on Windows: ${arch}`);\n }\n case \"linux\":\n switch (arch) {\n case \"x64\":\n return isMusl() ? \"@vizejs/native-linux-x64-musl\" : \"@vizejs/native-linux-x64-gnu\";\n case \"arm64\":\n return isMusl() ? \"@vizejs/native-linux-arm64-musl\" : \"@vizejs/native-linux-arm64-gnu\";\n default:\n throw new Error(`Unsupported architecture on Linux: ${arch}`);\n }\n default:\n throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`);\n }\n}\n\ninterface NativeBinding {\n compileSfcBatchWithResults: (\n files: BatchFileInput[],\n options?: NativeBuildOptions,\n ) => BatchCompileResult;\n formatSfc: (source: string, options?: NativeFormatOptions) => FormatResult;\n typeCheck: (source: string, options?: NativeTypeCheckOptions) => TypeCheckResult;\n generateDeclaration?: (source: string, options?: NativeDeclarationOptions) => DeclarationResult;\n lint: (\n patterns: string[],\n options?: {\n format?: string;\n max_warnings?: number;\n quiet?: boolean;\n fix?: boolean;\n help_level?: string;\n preset?: string;\n },\n ) => LintResult;\n}\n\ntype NativeCommand = \"build\" | \"check\" | \"fmt\" | \"lint\";\n\nconst REQUIRED_BINDINGS: Record<NativeCommand, keyof NativeBinding> = {\n build: \"compileSfcBatchWithResults\",\n check: \"typeCheck\",\n fmt: \"formatSfc\",\n lint: \"lint\",\n};\n\nfunction loadNative(command: NativeCommand): NativeBinding {\n const attemptedPackages = getAttemptedPackages();\n let lastError: unknown = null;\n const requiredBinding = REQUIRED_BINDINGS[command];\n\n for (const packageName of attemptedPackages) {\n try {\n const binding = require(packageName) as Partial<NativeBinding>;\n if (typeof binding[requiredBinding] !== \"function\") {\n throw new Error(`${packageName} does not expose the ${command} binding.`);\n }\n return binding as NativeBinding;\n } catch (error) {\n lastError = error;\n }\n }\n\n console.error(`Failed to load native binding. Tried: ${attemptedPackages.join(\", \")}`);\n console.error(\"Try reinstalling: npm install vize\");\n throw lastError instanceof Error ? lastError : new Error(\"Failed to load native binding\");\n}\n\nfunction getAttemptedPackages(): readonly string[] {\n const platformBindingPackage = getBindingPackageName();\n return shouldPreferWorkspaceBinding(resolveWorkspaceBindingPath())\n ? [WORKSPACE_BINDING_PATH, platformBindingPackage]\n : [platformBindingPackage, WORKSPACE_BINDING_PATH];\n}\n\nfunction resolveWorkspaceBindingPath(): string | null {\n try {\n return require.resolve(WORKSPACE_BINDING_PATH);\n } catch {\n return null;\n }\n}\n\nexport function shouldPreferWorkspaceBinding(resolvedPath: string | null): boolean {\n const override = process.env.VIZE_PREFER_WORKSPACE_BINDING;\n if (override === \"1\" || override === \"true\") {\n return true;\n }\n if (override === \"0\" || override === \"false\") {\n return false;\n }\n if (resolvedPath == null) {\n return false;\n }\n\n return resolvedPath.includes(`${path.sep}npm${path.sep}vize-native${path.sep}`);\n}\n\n// ============================================================================\n// Lint command\n// ============================================================================\n\ninterface LintOptions {\n format?: string;\n maxWarnings?: number;\n quiet?: boolean;\n fix?: boolean;\n helpLevel?: string;\n preset?: string;\n}\n\ninterface LintResult {\n output: string;\n errorCount: number;\n warningCount: number;\n fileCount: number;\n timeMs: number;\n}\n\ninterface SharedConfigOptions {\n configFile?: string;\n configMode: \"root\" | \"none\";\n}\n\ninterface ParsedLintCommand {\n patterns: string[];\n options: LintOptions;\n sharedConfig: SharedConfigOptions;\n}\n\nfunction printUsage(): void {\n console.error(\"Usage: vize <command> [options]\");\n console.error(\"Commands: build, fmt, check, lint, upgrade, ready, musea\");\n}\n\nfunction printBuildUsage(): void {\n console.error(\"Usage: vize build [options] [files-or-directories]\");\n console.error(\"Options:\");\n console.error(\" -o, --output <dir> Output directory\");\n console.error(\" -f, --format <js|json|stats> Output format\");\n console.error(\" --ssr Enable SSR compilation\");\n console.error(\" --script-ext <mode> preserve or downcompile\");\n console.error(\" -j, --threads <number> Worker thread count\");\n}\n\nfunction printFmtUsage(): void {\n console.error(\"Usage: vize fmt [options] [files-or-directories]\");\n console.error(\"Options:\");\n console.error(\" --check Exit with an error if files need formatting\");\n console.error(\" -w, --write Write formatted output\");\n console.error(\" --single-quote Use single quotes\");\n console.error(\" --print-width <number> Maximum line width\");\n console.error(\" --tab-width <number> Indentation width\");\n console.error(\" --use-tabs Indent with tabs\");\n console.error(\" --no-semi Omit semicolons\");\n}\n\nfunction printCheckUsage(): void {\n console.error(\"Usage: vize check [options] [files-or-directories]\");\n console.error(\"Options:\");\n console.error(\" -f, --format <text|json> Output format\");\n console.error(\" -q, --quiet Show summary only\");\n console.error(\" --strict Enable strict checks\");\n console.error(\" --show-virtual-ts Print generated Virtual TS\");\n console.error(\" --declaration Emit Vue component .d.ts files\");\n console.error(\" --declaration-dir <dir> Output directory for declarations\");\n console.error(\" --max-warnings <number> Fail when warnings exceed the limit\");\n console.error(\" -c, --config <path> Use a specific vize config file\");\n console.error(\" --no-config Disable config discovery\");\n console.error(\"\");\n console.error(\n \"Note: npm `vize check` uses the packaged NAPI checker. Install the Rust CLI for project-backed Corsa diagnostics.\",\n );\n}\n\nfunction printUpgradeUsage(): void {\n console.error(\"Usage: vize upgrade [options]\");\n console.error(\"Options:\");\n console.error(\" --package-manager <name> npm, pnpm, yarn, bun, or vp\");\n console.error(\" -g, --global Upgrade the global installation\");\n console.error(\" --dry-run Print the command without running it\");\n}\n\nfunction printReadyUsage(): void {\n console.error(\"Usage: vize ready [options] [files-or-directories]\");\n console.error(\"Runs: fmt --write -> lint -> check -> build\");\n console.error(\"Options:\");\n console.error(\" -o, --output <dir> Output directory for build\");\n console.error(\" --ssr Enable SSR compilation for build\");\n console.error(\" --script-ext <mode> preserve or downcompile\");\n}\n\nfunction resolvePackageBinaryFromCwd(packageName: string, binName: string = packageName): string {\n const cwdRequire = createRequire(pathToFileURL(path.join(process.cwd(), \"package.json\")).href);\n const packageJsonPath = cwdRequire.resolve(`${packageName}/package.json`);\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n\n const bin = typeof packageJson.bin === \"string\" ? packageJson.bin : packageJson.bin?.[binName];\n\n if (!bin) {\n throw new Error(`Could not resolve binary '${binName}' from package '${packageName}'`);\n }\n\n return path.resolve(path.dirname(packageJsonPath), bin);\n}\n\nfunction runMusea(args: string[]): void {\n const isHelp = args.includes(\"--help\") || args.includes(\"-h\");\n if (isHelp) {\n console.error(\"Usage: vize musea [--build] [...vite options]\");\n console.error(\" --build Run `vite build` instead of `vite dev`\");\n return;\n }\n\n const isBuild = args.includes(\"--build\");\n const viteArgs = args.filter((arg) => arg !== \"--build\");\n const viteCommand = isBuild ? \"build\" : \"dev\";\n const viteBin = resolvePackageBinaryFromCwd(\"vite\");\n const result = spawnSync(process.execPath, [viteBin, viteCommand, ...viteArgs], {\n stdio: \"inherit\",\n cwd: process.cwd(),\n env: process.env,\n });\n\n if (result.error) {\n throw result.error;\n }\n\n process.exit(result.status ?? 1);\n}\n\nfunction parseLintCommand(args: string[]): ParsedLintCommand {\n const patterns: string[] = [];\n const options: LintOptions = {};\n const sharedConfig: SharedConfigOptions = {\n configMode: \"root\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--format\" || arg === \"-f\") {\n options.format = args[++i];\n } else if (arg === \"--max-warnings\") {\n options.maxWarnings = Number.parseInt(args[++i], 10);\n } else if (arg === \"--quiet\" || arg === \"-q\") {\n options.quiet = true;\n } else if (arg === \"--fix\") {\n options.fix = true;\n } else if (arg === \"--help-level\") {\n options.helpLevel = args[++i];\n } else if (arg === \"--preset\") {\n options.preset = args[++i];\n } else if (arg === \"--config\" || arg === \"-c\") {\n const configFile = args[++i];\n if (!configFile) {\n throw new Error(\"Missing path after --config\");\n }\n sharedConfig.configFile = configFile;\n } else if (arg === \"--no-config\") {\n sharedConfig.configMode = \"none\";\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options, sharedConfig };\n}\n\n// ============================================================================\n// Build command\n// ============================================================================\n\ninterface NativeBuildOptions {\n ssr?: boolean;\n vapor?: boolean;\n customRenderer?: boolean;\n custom_renderer?: boolean;\n isTs?: boolean;\n is_ts?: boolean;\n threads?: number;\n}\n\ninterface BatchFileInput {\n path: string;\n source: string;\n}\n\ninterface MacroArtifact {\n kind: string;\n name: string;\n source: string;\n content: string;\n moduleCode?: string;\n start: number;\n end: number;\n}\n\ninterface BatchFileResult {\n path: string;\n code: string;\n css?: string;\n errors: string[];\n warnings: string[];\n scopeId?: string;\n scope_id?: string;\n hasScoped?: boolean;\n has_scoped?: boolean;\n macroArtifacts?: MacroArtifact[];\n macro_artifacts?: MacroArtifact[];\n}\n\ninterface BatchCompileResult {\n results: BatchFileResult[];\n successCount?: number;\n success_count?: number;\n failedCount?: number;\n failed_count?: number;\n timeMs?: number;\n time_ms?: number;\n}\n\ninterface BuildOptions {\n output: string;\n format: \"js\" | \"json\" | \"stats\";\n ssr?: boolean;\n vapor?: boolean;\n customRenderer?: boolean;\n scriptExt: \"preserve\" | \"downcompile\";\n threads?: number;\n help?: boolean;\n}\n\ninterface ParsedBuildCommand {\n patterns: string[];\n options: BuildOptions;\n sharedConfig: SharedConfigOptions;\n}\n\nfunction parseBuildCommand(args: string[]): ParsedBuildCommand {\n const patterns: string[] = [];\n const options: BuildOptions = {\n output: \"./dist\",\n format: \"js\",\n scriptExt: \"downcompile\",\n };\n const sharedConfig: SharedConfigOptions = {\n configMode: \"root\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--output\" || arg === \"-o\") {\n options.output = args[++i] ?? options.output;\n } else if (arg === \"--format\" || arg === \"-f\") {\n const format = args[++i];\n if (format === \"js\" || format === \"json\" || format === \"stats\") {\n options.format = format;\n }\n } else if (arg === \"--ssr\") {\n options.ssr = true;\n } else if (arg === \"--vapor\") {\n options.vapor = true;\n } else if (arg === \"--custom-renderer\") {\n options.customRenderer = true;\n } else if (arg === \"--script-ext\") {\n const scriptExt = args[++i];\n if (scriptExt === \"preserve\" || scriptExt === \"downcompile\") {\n options.scriptExt = scriptExt;\n }\n } else if (arg === \"--threads\" || arg === \"-j\") {\n options.threads = Number.parseInt(args[++i], 10);\n } else if (arg === \"--config\" || arg === \"-c\") {\n const configFile = args[++i];\n if (!configFile) {\n throw new Error(\"Missing path after --config\");\n }\n sharedConfig.configFile = configFile;\n } else if (arg === \"--no-config\") {\n sharedConfig.configMode = \"none\";\n } else if (arg === \"--profile\" || arg === \"--continue-on-error\") {\n // Accepted for command compatibility. The npm build path prints a compact summary.\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options, sharedConfig };\n}\n\nfunction getScriptLang(source: string): string {\n const match = source.match(/<script\\b[^>]*\\blang=[\"']([^\"']+)[\"']/i);\n return match?.[1] ?? \"js\";\n}\n\nfunction getOutputExtension(source: string, scriptExt: BuildOptions[\"scriptExt\"]): string {\n if (scriptExt === \"downcompile\") {\n return \"js\";\n }\n const lang = getScriptLang(source);\n return lang === \"ts\" || lang === \"tsx\" || lang === \"jsx\" ? lang : \"js\";\n}\n\nfunction outputFileName(file: string, extension: string): string {\n return path.basename(file).replace(/\\.vue$/i, `.${extension}`);\n}\n\nfunction toNativeBuildOptions(options: BuildOptions): NativeBuildOptions {\n const isTs = options.scriptExt === \"preserve\";\n return {\n ssr: options.ssr,\n vapor: options.vapor,\n customRenderer: options.customRenderer,\n custom_renderer: options.customRenderer,\n isTs,\n is_ts: isTs,\n threads: options.threads,\n };\n}\n\nasync function runBuild(args: string[]): Promise<void> {\n const { patterns, options, sharedConfig } = parseBuildCommand(args);\n if (options.help) {\n printBuildUsage();\n return;\n }\n\n const config = await loadConfig(process.cwd(), {\n mode: sharedConfig.configMode,\n configFile: sharedConfig.configFile,\n env: {\n mode: process.env.NODE_ENV ?? \"development\",\n command: \"build\",\n },\n });\n\n if (sharedConfig.configFile && !config) {\n throw new Error(`Could not find config file: ${sharedConfig.configFile}`);\n }\n\n options.ssr ??= config?.compiler?.ssr;\n options.vapor ??= config?.compiler?.vapor;\n options.customRenderer ??= config?.compiler?.customRenderer;\n if (config?.compiler?.scriptExt === \"ts\") {\n options.scriptExt = \"preserve\";\n } else if (config?.compiler?.scriptExt === \"js\") {\n options.scriptExt = \"downcompile\";\n }\n\n const files = collectVueFiles(patterns);\n if (files.length === 0) {\n process.stderr.write(\n `No Vue files found matching inputs: ${sanitizeTerminalText(JSON.stringify(patterns))}\\n`,\n );\n process.exit(1);\n }\n\n const native = loadNative(\"build\");\n const startedAt = performance.now();\n\n if (options.format !== \"stats\") {\n mkdirSync(options.output, { recursive: true });\n }\n\n let nativeTimeMs = 0;\n let failed = 0;\n let success = 0;\n\n for (let start = 0; start < files.length; start += BUILD_BATCH_SIZE) {\n const end = Math.min(start + BUILD_BATCH_SIZE, files.length);\n const inputs: { path: string; source: string }[] = [];\n const extensionByPath = new Map<string, string>();\n for (let index = start; index < end; index++) {\n const file = files[index]!;\n const source = readFileSync(file, \"utf8\");\n extensionByPath.set(file, getOutputExtension(source, options.scriptExt));\n inputs.push({ path: file, source });\n }\n\n const chunkStartedAt = performance.now();\n const result = native.compileSfcBatchWithResults(inputs, toNativeBuildOptions(options));\n inputs.length = 0;\n nativeTimeMs += result.timeMs ?? result.time_ms ?? performance.now() - chunkStartedAt;\n const results = result.results.sort((left, right) => left.path.localeCompare(right.path));\n\n for (const fileResult of results) {\n for (const warning of fileResult.warnings) {\n process.stderr.write(\n `warning: ${displayPath(fileResult.path)} ${sanitizeTerminalText(warning)}\\n`,\n );\n }\n for (const error of fileResult.errors) {\n process.stderr.write(\n `error: ${displayPath(fileResult.path)} ${sanitizeTerminalText(error)}\\n`,\n );\n }\n\n if (fileResult.errors.length > 0 || options.format === \"stats\") {\n continue;\n }\n\n const extension =\n options.format === \"json\" ? \"json\" : (extensionByPath.get(fileResult.path) ?? \"js\");\n const outputPath = path.join(options.output, outputFileName(fileResult.path, extension));\n const content =\n options.format === \"json\" ? JSON.stringify(fileResult, null, 2) : fileResult.code;\n writeFileSync(outputPath, content);\n }\n\n const chunkFailed =\n result.failedCount ?? result.failed_count ?? results.filter((r) => r.errors.length).length;\n failed += chunkFailed;\n success += result.successCount ?? result.success_count ?? results.length - chunkFailed;\n }\n\n const timeMs = nativeTimeMs || performance.now() - startedAt;\n process.stderr.write(\n `\\x1b[32mOK\\x1b[0m Built ${success} Vue file(s) in ${timeMs.toFixed(2)}ms\\n`,\n );\n\n if (failed > 0) {\n process.stderr.write(`\\x1b[31mERR\\x1b[0m ${failed} file(s) failed\\n`);\n process.exit(1);\n }\n}\n\n// ============================================================================\n// Format command\n// ============================================================================\n\ninterface NativeFormatOptions {\n printWidth?: number;\n print_width?: number;\n tabWidth?: number;\n tab_width?: number;\n useTabs?: boolean;\n use_tabs?: boolean;\n semi?: boolean;\n singleQuote?: boolean;\n single_quote?: boolean;\n sortAttributes?: boolean;\n sort_attributes?: boolean;\n singleAttributePerLine?: boolean;\n single_attribute_per_line?: boolean;\n maxAttributesPerLine?: number;\n max_attributes_per_line?: number;\n normalizeDirectiveShorthands?: boolean;\n normalize_directive_shorthands?: boolean;\n}\n\ninterface FormatResult {\n code: string;\n changed: boolean;\n}\n\ninterface FmtOptions extends NativeFormatOptions {\n check?: boolean;\n write?: boolean;\n help?: boolean;\n}\n\ninterface ParsedFmtCommand {\n patterns: string[];\n options: FmtOptions;\n sharedConfig: SharedConfigOptions;\n}\n\nfunction parseFmtCommand(args: string[]): ParsedFmtCommand {\n const patterns: string[] = [];\n const options: FmtOptions = {};\n const sharedConfig: SharedConfigOptions = {\n configMode: \"root\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--check\") {\n options.check = true;\n } else if (arg === \"--write\" || arg === \"-w\") {\n options.write = true;\n } else if (arg === \"--single-quote\") {\n options.singleQuote = true;\n } else if (arg === \"--print-width\") {\n options.printWidth = Number.parseInt(args[++i], 10);\n } else if (arg === \"--tab-width\") {\n options.tabWidth = Number.parseInt(args[++i], 10);\n } else if (arg === \"--use-tabs\") {\n options.useTabs = true;\n } else if (arg === \"--no-semi\") {\n options.semi = false;\n } else if (arg === \"--sort-attributes\") {\n options.sortAttributes = true;\n } else if (arg === \"--single-attribute-per-line\") {\n options.singleAttributePerLine = true;\n } else if (arg === \"--max-attributes-per-line\") {\n options.maxAttributesPerLine = Number.parseInt(args[++i], 10);\n } else if (arg === \"--normalize-directive-shorthands\") {\n options.normalizeDirectiveShorthands = true;\n } else if (arg === \"--config\" || arg === \"-c\") {\n const configFile = args[++i];\n if (!configFile) {\n throw new Error(\"Missing path after --config\");\n }\n sharedConfig.configFile = configFile;\n } else if (arg === \"--no-config\") {\n sharedConfig.configMode = \"none\";\n } else if (arg === \"--profile\") {\n // Accepted for command compatibility. The npm fmt path prints a compact summary.\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options, sharedConfig };\n}\n\nfunction toNativeFormatOptions(options: FmtOptions): NativeFormatOptions {\n return {\n printWidth: options.printWidth,\n print_width: options.printWidth,\n tabWidth: options.tabWidth,\n tab_width: options.tabWidth,\n useTabs: options.useTabs,\n use_tabs: options.useTabs,\n semi: options.semi,\n singleQuote: options.singleQuote,\n single_quote: options.singleQuote,\n sortAttributes: options.sortAttributes,\n sort_attributes: options.sortAttributes,\n singleAttributePerLine: options.singleAttributePerLine,\n single_attribute_per_line: options.singleAttributePerLine,\n maxAttributesPerLine: options.maxAttributesPerLine,\n max_attributes_per_line: options.maxAttributesPerLine,\n normalizeDirectiveShorthands: options.normalizeDirectiveShorthands,\n normalize_directive_shorthands: options.normalizeDirectiveShorthands,\n };\n}\n\nasync function runFmt(args: string[]): Promise<void> {\n const { patterns, options, sharedConfig } = parseFmtCommand(args);\n if (options.help) {\n printFmtUsage();\n return;\n }\n\n const config = await loadConfig(process.cwd(), {\n mode: sharedConfig.configMode,\n configFile: sharedConfig.configFile,\n env: {\n mode: process.env.NODE_ENV ?? \"development\",\n command: \"fmt\",\n },\n });\n\n if (sharedConfig.configFile && !config) {\n throw new Error(`Could not find config file: ${sharedConfig.configFile}`);\n }\n\n options.printWidth ??= config?.formatter?.printWidth;\n options.tabWidth ??= config?.formatter?.tabWidth;\n options.useTabs ??= config?.formatter?.useTabs;\n options.semi ??= config?.formatter?.semi;\n options.singleQuote ??= config?.formatter?.singleQuote;\n\n const files = collectVueFiles(patterns);\n if (files.length === 0) {\n process.stderr.write(\n `No Vue files found matching inputs: ${sanitizeTerminalText(JSON.stringify(patterns))}\\n`,\n );\n return;\n }\n\n const native = loadNative(\"fmt\");\n let changed = 0;\n let errored = 0;\n\n for (const file of files) {\n const source = readFileSync(file, \"utf8\");\n try {\n const result = native.formatSfc(source, toNativeFormatOptions(options));\n if (!result.changed) {\n continue;\n }\n changed++;\n if (options.check) {\n process.stderr.write(`Would reformat: ${displayPath(file)}\\n`);\n } else if (options.write) {\n writeFileSync(file, result.code);\n process.stderr.write(`Reformatted: ${displayPath(file)}\\n`);\n } else {\n process.stderr.write(`Would reformat: ${displayPath(file)}\\n`);\n }\n } catch (error) {\n errored++;\n process.stderr.write(\n `Error formatting ${displayPath(file)}: ${sanitizeTerminalText(error instanceof Error ? error.message : String(error))}\\n`,\n );\n }\n }\n\n process.stderr.write(\n `\\x1b[32mOK\\x1b[0m Formatted ${files.length} Vue file(s), ${changed} changed\\n`,\n );\n\n if (errored > 0 || (options.check && changed > 0)) {\n process.exit(1);\n }\n}\n\n// ============================================================================\n// Check command\n// ============================================================================\n\ninterface NativeTypeCheckOptions {\n filename?: string;\n strict?: boolean;\n includeVirtualTs?: boolean;\n include_virtual_ts?: boolean;\n checkProps?: boolean;\n check_props?: boolean;\n checkEmits?: boolean;\n check_emits?: boolean;\n checkTemplateBindings?: boolean;\n check_template_bindings?: boolean;\n checkReactivity?: boolean;\n check_reactivity?: boolean;\n checkSetupContext?: boolean;\n check_setup_context?: boolean;\n checkInvalidExports?: boolean;\n check_invalid_exports?: boolean;\n checkFallthroughAttrs?: boolean;\n check_fallthrough_attrs?: boolean;\n}\n\ninterface NativeDeclarationOptions {\n filename?: string;\n}\n\ninterface DeclarationResult {\n code: string;\n}\n\ninterface TypeDiagnostic {\n severity: string;\n message: string;\n start: number;\n end: number;\n code?: string;\n help?: string;\n related?: Array<{\n message: string;\n start: number;\n end: number;\n filename?: string;\n }>;\n}\n\ninterface TypeCheckResult {\n diagnostics: TypeDiagnostic[];\n virtualTs?: string;\n errorCount: number;\n warningCount: number;\n analysisTimeMs?: number;\n}\n\ninterface CheckOptions {\n format?: string;\n quiet?: boolean;\n strict?: boolean;\n includeVirtualTs?: boolean;\n maxWarnings?: number;\n checkProps?: boolean;\n checkEmits?: boolean;\n checkTemplateBindings?: boolean;\n checkReactivity?: boolean;\n checkSetupContext?: boolean;\n checkInvalidExports?: boolean;\n checkFallthroughAttrs?: boolean;\n declaration?: boolean;\n declarationDir?: string;\n help?: boolean;\n}\n\ninterface ParsedCheckCommand {\n patterns: string[];\n options: CheckOptions;\n sharedConfig: SharedConfigOptions;\n}\n\ninterface CheckedFileResult {\n file: string;\n source: string;\n result: TypeCheckResult;\n}\n\ninterface EmittedDeclaration {\n file: string;\n path: string;\n}\n\nfunction parseCheckCommand(args: string[]): ParsedCheckCommand {\n const patterns: string[] = [];\n const options: CheckOptions = {};\n const sharedConfig: SharedConfigOptions = {\n configMode: \"root\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--format\" || arg === \"-f\") {\n options.format = args[++i];\n } else if (arg === \"--quiet\" || arg === \"-q\") {\n options.quiet = true;\n } else if (arg === \"--strict\") {\n options.strict = true;\n } else if (arg === \"--no-strict\") {\n options.strict = false;\n } else if (arg === \"--show-virtual-ts\" || arg === \"--include-virtual-ts\") {\n options.includeVirtualTs = true;\n } else if (arg === \"--max-warnings\") {\n options.maxWarnings = Number.parseInt(args[++i], 10);\n } else if (arg === \"--no-check-props\") {\n options.checkProps = false;\n } else if (arg === \"--no-check-emits\") {\n options.checkEmits = false;\n } else if (arg === \"--no-check-template-bindings\") {\n options.checkTemplateBindings = false;\n } else if (arg === \"--no-check-reactivity\") {\n options.checkReactivity = false;\n } else if (arg === \"--no-check-setup-context\") {\n options.checkSetupContext = false;\n } else if (arg === \"--no-check-invalid-exports\") {\n options.checkInvalidExports = false;\n } else if (arg === \"--no-check-fallthrough-attrs\") {\n options.checkFallthroughAttrs = false;\n } else if (arg === \"--declaration\") {\n options.declaration = true;\n } else if (arg === \"--declaration-dir\") {\n const declarationDir = args[++i];\n if (!declarationDir) {\n throw new Error(\"Missing path after --declaration-dir\");\n }\n options.declarationDir = declarationDir;\n } else if (arg === \"--config\" || arg === \"-c\") {\n const configFile = args[++i];\n if (!configFile) {\n throw new Error(\"Missing path after --config\");\n }\n sharedConfig.configFile = configFile;\n } else if (arg === \"--no-config\") {\n sharedConfig.configMode = \"none\";\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (arg === \"--tsconfig\" || arg === \"--corsa-path\" || arg === \"--servers\") {\n i++;\n } else if (arg === \"--socket\" || arg === \"-s\") {\n i++;\n } else if (arg === \"--profile\") {\n // Accepted for package-script compatibility with the Rust CLI.\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options, sharedConfig };\n}\n\nexport function shouldRetainCheckSource(options: {\n declaration?: boolean;\n format?: string;\n quiet?: boolean;\n}): boolean {\n return Boolean(options.declaration || (options.format !== \"json\" && !options.quiet));\n}\n\nfunction hasGlobSyntax(pattern: string): boolean {\n return pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\");\n}\n\nfunction normalizePath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nexport function sanitizeTerminalText(value: unknown): string {\n const text = String(value);\n let sanitized = \"\";\n\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code === 0x1b) {\n i = skipTerminalEscapeSequence(text, i);\n continue;\n }\n if (isUnsafeTerminalControl(code)) {\n continue;\n }\n sanitized += text[i];\n }\n\n return sanitized;\n}\n\nfunction skipTerminalEscapeSequence(text: string, escapeIndex: number): number {\n const introducer = text.charCodeAt(escapeIndex + 1);\n if (introducer === 0x5b) {\n return skipUntilAnsiFinalByte(text, escapeIndex + 2);\n }\n if (introducer === 0x5d || introducer === 0x50 || introducer === 0x5e || introducer === 0x5f) {\n return skipUntilStringTerminator(text, escapeIndex + 2);\n }\n if (Number.isNaN(introducer)) {\n return escapeIndex;\n }\n return escapeIndex + 1;\n}\n\nfunction skipUntilAnsiFinalByte(text: string, index: number): number {\n for (let i = index; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code >= 0x40 && code <= 0x7e) {\n return i;\n }\n }\n return text.length - 1;\n}\n\nfunction skipUntilStringTerminator(text: string, index: number): number {\n for (let i = index; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code === 0x07) {\n return i;\n }\n if (code === 0x1b && text.charCodeAt(i + 1) === 0x5c) {\n return i + 1;\n }\n }\n return text.length - 1;\n}\n\nfunction isUnsafeTerminalControl(code: number): boolean {\n if (code === 0x09 || code === 0x0a || code === 0x0d) {\n return false;\n }\n return (code >= 0x00 && code <= 0x1f) || (code >= 0x7f && code <= 0x9f);\n}\n\nexport function displayPath(filePath: string): string {\n const relative = path.relative(process.cwd(), filePath);\n if (relative && !relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return sanitizeTerminalText(normalizePath(relative));\n }\n return sanitizeTerminalText(normalizePath(filePath));\n}\n\nfunction isVueFile(filePath: string): boolean {\n return path.extname(filePath) === \".vue\";\n}\n\nfunction collectVueFilesFromDirectory(directory: string, recursive: boolean): string[] {\n const files: string[] = [];\n const entries = readdirSync(directory, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n if (SKIPPED_VUE_FILE_DIRECTORIES.has(entry.name)) {\n continue;\n }\n if (recursive) {\n files.push(...collectVueFilesFromDirectory(entryPath, true));\n }\n } else if (entry.isFile() && isVueFile(entryPath)) {\n files.push(entryPath);\n }\n }\n\n return files;\n}\n\nfunction globBase(pattern: string): string {\n const normalized = normalizePath(pattern);\n const globIndex = normalized.search(/[*?[]/);\n if (globIndex === -1) {\n return normalized;\n }\n\n const beforeGlob = normalized.slice(0, globIndex);\n const slashIndex = beforeGlob.lastIndexOf(\"/\");\n if (slashIndex === -1) {\n return \".\";\n }\n return beforeGlob.slice(0, slashIndex) || \"/\";\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n const normalized = normalizePath(pattern);\n let source = \"\";\n\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized[i];\n const next = normalized[i + 1];\n const afterNext = normalized[i + 2];\n\n if (char === \"*\" && next === \"*\" && afterNext === \"/\") {\n source += \"(?:.*/)?\";\n i += 2;\n } else if (char === \"*\" && next === \"*\") {\n source += \".*\";\n i++;\n } else if (char === \"*\") {\n source += \"[^/]*\";\n } else if (char === \"?\") {\n source += \"[^/]\";\n } else if (\"\\\\^$+?.()|{}[]\".includes(char)) {\n source += `\\\\${char}`;\n } else {\n source += char;\n }\n }\n\n return new RegExp(`^${source}$`);\n}\n\nfunction shouldRecurseGlob(pattern: string, base: string): boolean {\n const normalizedPattern = normalizePath(pattern);\n const normalizedBase = normalizePath(base);\n const rest =\n normalizedBase === \".\"\n ? normalizedPattern\n : normalizedPattern.slice(normalizedBase.length).replace(/^\\/+/, \"\");\n return rest.includes(\"/\");\n}\n\nfunction collectVueFilesFromGlob(pattern: string): string[] {\n const basePattern = globBase(pattern);\n const base = path.resolve(process.cwd(), basePattern);\n if (!existsSync(base)) {\n return [];\n }\n\n const isAbsolutePattern = path.isAbsolute(pattern);\n const normalizedPattern = normalizePath(isAbsolutePattern ? path.resolve(pattern) : pattern);\n const regex = globToRegExp(normalizedPattern);\n const candidates = collectVueFilesFromDirectory(base, shouldRecurseGlob(pattern, basePattern));\n\n return candidates.filter((file) => {\n const comparable = isAbsolutePattern\n ? normalizePath(file)\n : normalizePath(path.relative(process.cwd(), file));\n return regex.test(comparable);\n });\n}\n\nfunction collectVueFiles(patterns: string[]): string[] {\n const files = new Set<string>();\n const inputs = patterns.length === 0 ? [\".\"] : patterns;\n\n for (const input of inputs) {\n if (hasGlobSyntax(input)) {\n for (const file of collectVueFilesFromGlob(input)) {\n files.add(path.resolve(file));\n }\n continue;\n }\n\n const resolved = path.resolve(process.cwd(), input);\n if (!existsSync(resolved)) {\n continue;\n }\n\n const stats = statSync(resolved);\n if (stats.isDirectory()) {\n for (const file of collectVueFilesFromDirectory(resolved, true)) {\n files.add(path.resolve(file));\n }\n } else if (stats.isFile() && isVueFile(resolved)) {\n files.add(resolved);\n }\n }\n\n return Array.from(files).sort();\n}\n\nfunction commonSourceDirectory(results: CheckedFileResult[]): string {\n let common = path.dirname(results[0]?.file ?? process.cwd());\n\n for (let i = 1; i < results.length; i++) {\n const directory = path.dirname(results[i].file);\n while (common !== path.dirname(common)) {\n const relative = path.relative(common, directory);\n if (relative !== \"..\" && !relative.startsWith(`..${path.sep}`)) {\n break;\n }\n common = path.dirname(common);\n }\n }\n\n return common;\n}\n\nfunction emitCheckDeclarations(\n results: CheckedFileResult[],\n native: NativeBinding,\n options: CheckOptions,\n): EmittedDeclaration[] {\n if (!options.declaration) {\n return [];\n }\n\n if (typeof native.generateDeclaration !== \"function\") {\n throw new Error(\"The loaded native binding does not support declaration generation.\");\n }\n\n const outDir = path.resolve(process.cwd(), options.declarationDir ?? \"dist/types\");\n const sourceRoot = commonSourceDirectory(results);\n const declarations: EmittedDeclaration[] = [];\n\n for (const { file, source } of results) {\n const relative = normalizePath(path.relative(sourceRoot, file));\n const outputPath = path.join(outDir, `${relative}.d.ts`);\n mkdirSync(path.dirname(outputPath), { recursive: true });\n\n const declaration = native.generateDeclaration(source, { filename: file });\n writeFileSync(outputPath, declaration.code);\n declarations.push({\n file: displayPath(outputPath),\n path: outputPath,\n });\n }\n\n return declarations;\n}\n\nfunction lineStarts(source: string): number[] {\n const starts = [0];\n for (let i = 0; i < source.length; i++) {\n if (source.charCodeAt(i) === 10) {\n starts.push(i + 1);\n }\n }\n return starts;\n}\n\nfunction offsetToLineColumn(starts: number[], offset: number): { line: number; column: number } {\n let low = 0;\n let high = starts.length - 1;\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (starts[mid] <= offset) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n const lineIndex = Math.max(0, high);\n return {\n line: lineIndex + 1,\n column: offset - starts[lineIndex] + 1,\n };\n}\n\nfunction toNativeTypeCheckOptions(file: string, options: CheckOptions): NativeTypeCheckOptions {\n return {\n filename: file,\n strict: options.strict,\n includeVirtualTs: options.includeVirtualTs,\n include_virtual_ts: options.includeVirtualTs,\n checkProps: options.checkProps,\n check_props: options.checkProps,\n checkEmits: options.checkEmits,\n check_emits: options.checkEmits,\n checkTemplateBindings: options.checkTemplateBindings,\n check_template_bindings: options.checkTemplateBindings,\n checkReactivity: options.checkReactivity,\n check_reactivity: options.checkReactivity,\n checkSetupContext: options.checkSetupContext,\n check_setup_context: options.checkSetupContext,\n checkInvalidExports: options.checkInvalidExports,\n check_invalid_exports: options.checkInvalidExports,\n checkFallthroughAttrs: options.checkFallthroughAttrs,\n check_fallthrough_attrs: options.checkFallthroughAttrs,\n };\n}\n\nfunction renderCheckText(\n results: CheckedFileResult[],\n options: CheckOptions,\n timeMs: number,\n declarations: EmittedDeclaration[] = [],\n): void {\n let totalErrors = 0;\n let totalWarnings = 0;\n\n for (const { file, source, result } of results) {\n totalErrors += result.errorCount;\n totalWarnings += result.warningCount;\n\n if (options.includeVirtualTs && result.virtualTs) {\n process.stderr.write(\n `\\n=== ${displayPath(file)} ===\\n${sanitizeTerminalText(result.virtualTs)}\\n`,\n );\n }\n\n if (options.quiet || result.diagnostics.length === 0) {\n continue;\n }\n\n const starts = lineStarts(source);\n process.stdout.write(`\\n\\x1b[4m${displayPath(file)}\\x1b[0m\\n`);\n for (const diagnostic of result.diagnostics) {\n const color = diagnostic.severity === \"error\" ? \"\\x1b[31m\" : \"\\x1b[33m\";\n const location = offsetToLineColumn(starts, diagnostic.start);\n const code = diagnostic.code ? ` [${sanitizeTerminalText(diagnostic.code)}]` : \"\";\n process.stdout.write(\n ` ${color}${diagnostic.severity}:${location.line}:${location.column}\\x1b[0m${code} ${sanitizeTerminalText(diagnostic.message)}\\n`,\n );\n if (diagnostic.help) {\n process.stdout.write(` help: ${sanitizeTerminalText(diagnostic.help)}\\n`);\n }\n }\n }\n\n const status = totalErrors > 0 ? \"\\x1b[31mERR\\x1b[0m\" : \"\\x1b[32mOK\\x1b[0m\";\n process.stdout.write(\n `\\n${status} Type checked ${results.length} Vue files in ${timeMs.toFixed(2)}ms\\n`,\n );\n if (totalErrors > 0) {\n process.stdout.write(` \\x1b[31m${totalErrors} error(s)\\x1b[0m\\n`);\n } else {\n process.stdout.write(\" \\x1b[32mNo type errors found!\\x1b[0m\\n\");\n }\n if (totalWarnings > 0) {\n process.stdout.write(` \\x1b[33m${totalWarnings} warning(s)\\x1b[0m\\n`);\n }\n if (declarations.length > 0) {\n process.stdout.write(` \\x1b[32mEmitted ${declarations.length} declaration file(s)\\x1b[0m\\n`);\n }\n}\n\nasync function runCheck(args: string[]): Promise<void> {\n const { patterns, options, sharedConfig } = parseCheckCommand(args);\n if (options.help) {\n printCheckUsage();\n return;\n }\n\n const config = await loadConfig(process.cwd(), {\n mode: sharedConfig.configMode,\n configFile: sharedConfig.configFile,\n env: {\n mode: process.env.NODE_ENV ?? \"development\",\n command: \"check\",\n },\n });\n\n if (sharedConfig.configFile && !config) {\n throw new Error(`Could not find config file: ${sharedConfig.configFile}`);\n }\n\n if (config?.typeChecker?.enabled === false) {\n process.stderr.write(\n \"[vize] Skipping check because typeChecker.enabled is false in vize.config.\\n\",\n );\n return;\n }\n\n options.strict ??= config?.typeChecker?.strict;\n options.checkProps ??= config?.typeChecker?.checkProps;\n options.checkEmits ??= config?.typeChecker?.checkEmits;\n options.checkTemplateBindings ??= config?.typeChecker?.checkTemplateBindings;\n\n const files = collectVueFiles(patterns);\n if (files.length === 0) {\n process.stderr.write(\n `No Vue files found matching inputs: ${sanitizeTerminalText(JSON.stringify(patterns))}\\n`,\n );\n return;\n }\n\n const native = loadNative(\"check\");\n const start = performance.now();\n const retainSource = shouldRetainCheckSource(options);\n const results = files.map((file) => {\n const source = readFileSync(file, \"utf8\");\n return {\n file,\n source: retainSource ? source : \"\",\n result: native.typeCheck(source, toNativeTypeCheckOptions(file, options)),\n };\n });\n const timeMs = performance.now() - start;\n const declarations = emitCheckDeclarations(results, native, options);\n const totalErrors = results.reduce((sum, { result }) => sum + result.errorCount, 0);\n const totalWarnings = results.reduce((sum, { result }) => sum + result.warningCount, 0);\n\n if (options.format === \"json\") {\n process.stdout.write(\n `${JSON.stringify(\n {\n files: results.map(({ file, result }) => ({\n file: displayPath(file),\n diagnostics: result.diagnostics,\n virtualTs: result.virtualTs,\n })),\n errorCount: totalErrors,\n warningCount: totalWarnings,\n fileCount: results.length,\n declarations: declarations.map(({ file }) => file),\n },\n null,\n 2,\n )}\\n`,\n );\n } else {\n renderCheckText(results, options, timeMs, declarations);\n }\n\n if (totalErrors > 0) {\n process.exit(1);\n }\n\n if (options.maxWarnings !== undefined && totalWarnings > options.maxWarnings) {\n process.stderr.write(`\\nToo many warnings (${totalWarnings} > max ${options.maxWarnings})\\n`);\n process.exit(1);\n }\n}\n\nasync function runLint(args: string[]): Promise<void> {\n const { patterns, options, sharedConfig } = parseLintCommand(args);\n const config = await loadConfig(process.cwd(), {\n mode: sharedConfig.configMode,\n configFile: sharedConfig.configFile,\n env: {\n mode: process.env.NODE_ENV ?? \"development\",\n command: \"lint\",\n },\n });\n\n if (sharedConfig.configFile && !config) {\n throw new Error(`Could not find config file: ${sharedConfig.configFile}`);\n }\n\n if (config?.linter?.enabled === false) {\n process.stderr.write(\"[vize] Skipping lint because linter.enabled is false in vize.config.\\n\");\n return;\n }\n\n options.preset ??= config?.linter?.preset;\n\n if (patterns.length === 0) {\n patterns.push(\".\");\n }\n\n const native = loadNative(\"lint\");\n const result = native.lint(patterns, {\n format: options.format,\n max_warnings: options.maxWarnings,\n quiet: options.quiet,\n fix: options.fix,\n help_level: options.helpLevel,\n preset: options.preset,\n });\n\n if (result.output) {\n process.stdout.write(sanitizeTerminalText(result.output));\n if (!result.output.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n\n if (options.fix) {\n process.stderr.write(\"\\nNote: --fix is not yet implemented\\n\");\n }\n\n if (result.errorCount > 0) {\n process.exit(1);\n }\n\n if (options.maxWarnings !== undefined && result.warningCount > options.maxWarnings) {\n process.stderr.write(\n `\\nToo many warnings (${result.warningCount} > max ${options.maxWarnings})\\n`,\n );\n process.exit(1);\n }\n}\n\n// ============================================================================\n// Upgrade command\n// ============================================================================\n\ntype PackageManager = \"bun\" | \"npm\" | \"pnpm\" | \"vp\" | \"yarn\";\n\ninterface UpgradeOptions {\n packageManager?: PackageManager;\n global?: boolean;\n dryRun?: boolean;\n help?: boolean;\n}\n\nfunction parseUpgradeCommand(args: string[]): UpgradeOptions {\n const options: UpgradeOptions = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--package-manager\") {\n const packageManager = args[++i];\n if (\n packageManager === \"bun\" ||\n packageManager === \"npm\" ||\n packageManager === \"pnpm\" ||\n packageManager === \"vp\" ||\n packageManager === \"yarn\"\n ) {\n options.packageManager = packageManager;\n }\n } else if (arg === \"--global\" || arg === \"-g\") {\n options.global = true;\n } else if (arg === \"--dry-run\") {\n options.dryRun = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n }\n }\n\n return options;\n}\n\nfunction readCwdPackageJson(): {\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n} | null {\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n return JSON.parse(readFileSync(packageJsonPath, \"utf8\"));\n}\n\nfunction detectPackageManager(explicit?: PackageManager): PackageManager {\n if (explicit) {\n return explicit;\n }\n\n const userAgent = process.env.npm_config_user_agent ?? \"\";\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\";\n }\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\";\n }\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\";\n }\n if (userAgent.startsWith(\"npm\")) {\n return \"npm\";\n }\n\n const packageManager = readCwdPackageJson()?.packageManager;\n if (packageManager?.startsWith(\"pnpm\")) {\n return \"pnpm\";\n }\n if (packageManager?.startsWith(\"yarn\")) {\n return \"yarn\";\n }\n if (packageManager?.startsWith(\"bun\")) {\n return \"bun\";\n }\n return \"npm\";\n}\n\nfunction buildUpgradeCommand(\n packageManager: PackageManager,\n options: UpgradeOptions,\n): { command: string; args: string[] } {\n const packageJson = readCwdPackageJson();\n const saveDev = !packageJson?.dependencies?.vize;\n const packageSpec = \"vize@latest\";\n\n if (packageManager === \"vp\") {\n return {\n command: \"vp\",\n args: [\"install\", ...(options.global ? [\"-g\"] : saveDev ? [\"-D\"] : []), packageSpec],\n };\n }\n if (packageManager === \"pnpm\") {\n return {\n command: \"pnpm\",\n args: [\"add\", ...(options.global ? [\"-g\"] : saveDev ? [\"-D\"] : []), packageSpec],\n };\n }\n if (packageManager === \"yarn\") {\n return {\n command: \"yarn\",\n args: options.global\n ? [\"global\", \"add\", packageSpec]\n : [\"add\", ...(saveDev ? [\"-D\"] : []), packageSpec],\n };\n }\n if (packageManager === \"bun\") {\n return {\n command: \"bun\",\n args: [\"add\", ...(options.global ? [\"-g\"] : saveDev ? [\"-d\"] : []), packageSpec],\n };\n }\n return {\n command: \"npm\",\n args: [\"install\", ...(options.global ? [\"-g\"] : saveDev ? [\"-D\"] : []), packageSpec],\n };\n}\n\nfunction runUpgrade(args: string[]): void {\n const options = parseUpgradeCommand(args);\n if (options.help) {\n printUpgradeUsage();\n return;\n }\n\n const packageManager = detectPackageManager(options.packageManager);\n const command = buildUpgradeCommand(packageManager, options);\n\n if (options.dryRun) {\n process.stdout.write(`${command.command} ${command.args.join(\" \")}\\n`);\n return;\n }\n\n const result = spawnSync(command.command, command.args, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n env: process.env,\n });\n\n if (result.error) {\n throw result.error;\n }\n\n process.exit(result.status ?? 1);\n}\n\n// ============================================================================\n// Ready command\n// ============================================================================\n\ninterface ReadyOptions {\n output: string;\n ssr?: boolean;\n scriptExt: \"preserve\" | \"downcompile\";\n help?: boolean;\n}\n\ninterface ParsedReadyCommand {\n patterns: string[];\n options: ReadyOptions;\n}\n\nfunction parseReadyCommand(args: string[]): ParsedReadyCommand {\n const patterns: string[] = [];\n const options: ReadyOptions = {\n output: \"./dist\",\n scriptExt: \"downcompile\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--output\" || arg === \"-o\") {\n options.output = args[++i] ?? options.output;\n } else if (arg === \"--ssr\") {\n options.ssr = true;\n } else if (arg === \"--script-ext\") {\n const scriptExt = args[++i];\n if (scriptExt === \"preserve\" || scriptExt === \"downcompile\") {\n options.scriptExt = scriptExt;\n }\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options };\n}\n\nasync function runReady(args: string[]): Promise<void> {\n const { patterns, options } = parseReadyCommand(args);\n if (options.help) {\n printReadyUsage();\n return;\n }\n\n process.stderr.write(\"vize ready: fmt\\n\");\n await runFmt([\"--write\", ...patterns]);\n\n process.stderr.write(\"vize ready: lint\\n\");\n await runLint(patterns);\n\n process.stderr.write(\"vize ready: check\\n\");\n await runCheck(patterns);\n\n process.stderr.write(\"vize ready: build\\n\");\n await runBuild([\n \"--output\",\n options.output,\n \"--script-ext\",\n options.scriptExt,\n ...(options.ssr ? [\"--ssr\"] : []),\n ...patterns,\n ]);\n}\n\n// ============================================================================\n// Command router\n// ============================================================================\n\nconst NAPI_COMMANDS = new Set([\"build\", \"check\", \"fmt\", \"lint\"]);\nconst JS_COMMANDS = new Set([\"musea\", \"ready\", \"upgrade\"]);\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const command = args[0];\n\n if (!command || command === \"--help\" || command === \"-h\") {\n printUsage();\n process.exit(1);\n }\n\n if (NAPI_COMMANDS.has(command)) {\n const commandArgs = args.slice(1);\n switch (command) {\n case \"build\":\n await runBuild(commandArgs);\n break;\n case \"check\":\n await runCheck(commandArgs);\n break;\n case \"fmt\":\n await runFmt(commandArgs);\n break;\n case \"lint\":\n await runLint(commandArgs);\n break;\n }\n } else if (JS_COMMANDS.has(command)) {\n const commandArgs = args.slice(1);\n switch (command) {\n case \"musea\":\n runMusea(commandArgs);\n break;\n case \"ready\":\n await runReady(commandArgs);\n break;\n case \"upgrade\":\n runUpgrade(commandArgs);\n break;\n }\n } else {\n printUsage();\n console.error(`Unknown command: ${sanitizeTerminalText(command)}`);\n console.error(\n \"For commands not yet available via NAPI, install from source: cargo install vize\",\n );\n process.exit(1);\n }\n}\n\nconst isTestRuntime =\n Boolean(import.meta.vitest) || process.env.VITEST === \"true\" || process.env.NODE_ENV === \"test\";\n\nif (!isTestRuntime) {\n void main().catch((error) => {\n console.error(sanitizeTerminalText(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { spawnSync } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport { loadConfig } from \"./config.js\";\n\nconst require = createRequire(import.meta.url);\nconst WORKSPACE_BINDING_PATH = \"../../vize-native\";\nconst BUILD_BATCH_SIZE = 128;\nconst BUILD_BATCH_MAX_BYTES = 32 * 1024 * 1024;\nconst SKIPPED_VUE_FILE_DIRECTORIES = new Set([\n \"node_modules\",\n \"dist\",\n \".git\",\n \".nuxt\",\n \".output\",\n \".nitro\",\n \"coverage\",\n]);\n\n// ============================================================================\n// Native binding loader (oxlint pattern)\n// ============================================================================\n\nfunction isMusl(): boolean {\n const report = process.report?.getReport();\n if (typeof report === \"object\" && report !== null && \"header\" in report) {\n const header = (report as { header: { glibcVersionRuntime?: string } }).header;\n return !header.glibcVersionRuntime;\n }\n try {\n const lddPath = require(\"child_process\").execSync(\"which ldd\").toString().trim();\n return readFileSync(lddPath, \"utf8\").includes(\"musl\");\n } catch {\n return true;\n }\n}\n\nfunction getBindingPackageName(): string {\n const { platform, arch } = process;\n\n switch (platform) {\n case \"darwin\":\n switch (arch) {\n case \"x64\":\n return \"@vizejs/native-darwin-x64\";\n case \"arm64\":\n return \"@vizejs/native-darwin-arm64\";\n default:\n throw new Error(`Unsupported architecture on macOS: ${arch}`);\n }\n case \"win32\":\n switch (arch) {\n case \"x64\":\n return \"@vizejs/native-win32-x64-msvc\";\n case \"arm64\":\n return \"@vizejs/native-win32-arm64-msvc\";\n default:\n throw new Error(`Unsupported architecture on Windows: ${arch}`);\n }\n case \"linux\":\n switch (arch) {\n case \"x64\":\n return isMusl() ? \"@vizejs/native-linux-x64-musl\" : \"@vizejs/native-linux-x64-gnu\";\n case \"arm64\":\n return isMusl() ? \"@vizejs/native-linux-arm64-musl\" : \"@vizejs/native-linux-arm64-gnu\";\n default:\n throw new Error(`Unsupported architecture on Linux: ${arch}`);\n }\n default:\n throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`);\n }\n}\n\ninterface NativeBinding {\n compileSfcBatchWithResults: (\n files: BatchFileInput[],\n options?: NativeBuildOptions,\n ) => BatchCompileResult;\n formatSfc: (source: string, options?: NativeFormatOptions) => FormatResult;\n typeCheck: (source: string, options?: NativeTypeCheckOptions) => TypeCheckResult;\n generateDeclaration?: (source: string, options?: NativeDeclarationOptions) => DeclarationResult;\n lint: (\n patterns: string[],\n options?: {\n format?: string;\n max_warnings?: number;\n quiet?: boolean;\n fix?: boolean;\n help_level?: string;\n preset?: string;\n },\n ) => LintResult;\n}\n\ntype NativeCommand = \"build\" | \"check\" | \"fmt\" | \"lint\";\n\nconst REQUIRED_BINDINGS: Record<NativeCommand, keyof NativeBinding> = {\n build: \"compileSfcBatchWithResults\",\n check: \"typeCheck\",\n fmt: \"formatSfc\",\n lint: \"lint\",\n};\n\nfunction loadNative(command: NativeCommand): NativeBinding {\n const attemptedPackages = getAttemptedPackages();\n let lastError: unknown = null;\n const requiredBinding = REQUIRED_BINDINGS[command];\n\n for (const packageName of attemptedPackages) {\n try {\n const binding = require(packageName) as Partial<NativeBinding>;\n if (typeof binding[requiredBinding] !== \"function\") {\n throw new Error(`${packageName} does not expose the ${command} binding.`);\n }\n return binding as NativeBinding;\n } catch (error) {\n lastError = error;\n }\n }\n\n console.error(`Failed to load native binding. Tried: ${attemptedPackages.join(\", \")}`);\n console.error(\"Try reinstalling: npm install vize\");\n throw lastError instanceof Error ? lastError : new Error(\"Failed to load native binding\");\n}\n\nfunction getAttemptedPackages(): readonly string[] {\n const platformBindingPackage = getBindingPackageName();\n return shouldPreferWorkspaceBinding(resolveWorkspaceBindingPath())\n ? [WORKSPACE_BINDING_PATH, platformBindingPackage]\n : [platformBindingPackage, WORKSPACE_BINDING_PATH];\n}\n\nfunction resolveWorkspaceBindingPath(): string | null {\n try {\n return require.resolve(WORKSPACE_BINDING_PATH);\n } catch {\n return null;\n }\n}\n\nexport function shouldPreferWorkspaceBinding(resolvedPath: string | null): boolean {\n const override = process.env.VIZE_PREFER_WORKSPACE_BINDING;\n if (override === \"1\" || override === \"true\") {\n return true;\n }\n if (override === \"0\" || override === \"false\") {\n return false;\n }\n if (resolvedPath == null) {\n return false;\n }\n\n return resolvedPath.includes(`${path.sep}npm${path.sep}vize-native${path.sep}`);\n}\n\n// ============================================================================\n// Lint command\n// ============================================================================\n\ninterface LintOptions {\n format?: string;\n maxWarnings?: number;\n quiet?: boolean;\n fix?: boolean;\n helpLevel?: string;\n preset?: string;\n}\n\ninterface LintResult {\n output: string;\n errorCount: number;\n warningCount: number;\n fileCount: number;\n timeMs: number;\n}\n\ninterface SharedConfigOptions {\n configFile?: string;\n configMode: \"root\" | \"none\";\n}\n\ninterface ParsedLintCommand {\n patterns: string[];\n options: LintOptions;\n sharedConfig: SharedConfigOptions;\n}\n\nfunction printUsage(): void {\n console.error(\"Usage: vize <command> [options]\");\n console.error(\"Commands: build, fmt, check, lint, upgrade, ready, musea\");\n}\n\nfunction printBuildUsage(): void {\n console.error(\"Usage: vize build [options] [files-or-directories]\");\n console.error(\"Options:\");\n console.error(\" -o, --output <dir> Output directory\");\n console.error(\" -f, --format <js|json|stats> Output format\");\n console.error(\" --ssr Enable SSR compilation\");\n console.error(\" --script-ext <mode> preserve or downcompile\");\n console.error(\" -j, --threads <number> Worker thread count\");\n}\n\nfunction printFmtUsage(): void {\n console.error(\"Usage: vize fmt [options] [files-or-directories]\");\n console.error(\"Options:\");\n console.error(\" --check Exit with an error if files need formatting\");\n console.error(\" -w, --write Write formatted output\");\n console.error(\" --single-quote Use single quotes\");\n console.error(\" --print-width <number> Maximum line width\");\n console.error(\" --tab-width <number> Indentation width\");\n console.error(\" --use-tabs Indent with tabs\");\n console.error(\" --no-semi Omit semicolons\");\n}\n\nfunction printCheckUsage(): void {\n console.error(\"Usage: vize check [options] [files-or-directories]\");\n console.error(\"Options:\");\n console.error(\" -f, --format <text|json> Output format\");\n console.error(\" -q, --quiet Show summary only\");\n console.error(\" --strict Enable strict checks\");\n console.error(\" --show-virtual-ts Print generated Virtual TS\");\n console.error(\" --declaration Emit Vue component .d.ts files\");\n console.error(\" --declaration-dir <dir> Output directory for declarations\");\n console.error(\" --max-warnings <number> Fail when warnings exceed the limit\");\n console.error(\" -c, --config <path> Use a specific vize config file\");\n console.error(\" --no-config Disable config discovery\");\n console.error(\"\");\n console.error(\n \"Note: npm `vize check` uses the packaged NAPI checker. Install the Rust CLI for project-backed Corsa diagnostics.\",\n );\n}\n\nfunction printUpgradeUsage(): void {\n console.error(\"Usage: vize upgrade [options]\");\n console.error(\"Options:\");\n console.error(\" --package-manager <name> npm, pnpm, yarn, bun, or vp\");\n console.error(\" -g, --global Upgrade the global installation\");\n console.error(\" --dry-run Print the command without running it\");\n}\n\nfunction printReadyUsage(): void {\n console.error(\"Usage: vize ready [options] [files-or-directories]\");\n console.error(\"Runs: fmt --write -> lint -> check -> build\");\n console.error(\"Options:\");\n console.error(\" -o, --output <dir> Output directory for build\");\n console.error(\" --ssr Enable SSR compilation for build\");\n console.error(\" --script-ext <mode> preserve or downcompile\");\n}\n\nfunction resolvePackageBinaryFromCwd(packageName: string, binName: string = packageName): string {\n const cwdRequire = createRequire(pathToFileURL(path.join(process.cwd(), \"package.json\")).href);\n const packageJsonPath = cwdRequire.resolve(`${packageName}/package.json`);\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n\n const bin = typeof packageJson.bin === \"string\" ? packageJson.bin : packageJson.bin?.[binName];\n\n if (!bin) {\n throw new Error(`Could not resolve binary '${binName}' from package '${packageName}'`);\n }\n\n return path.resolve(path.dirname(packageJsonPath), bin);\n}\n\nfunction runMusea(args: string[]): void {\n const isHelp = args.includes(\"--help\") || args.includes(\"-h\");\n if (isHelp) {\n console.error(\"Usage: vize musea [--build] [...vite options]\");\n console.error(\" --build Run `vite build` instead of `vite dev`\");\n return;\n }\n\n const isBuild = args.includes(\"--build\");\n const viteArgs = args.filter((arg) => arg !== \"--build\");\n const viteCommand = isBuild ? \"build\" : \"dev\";\n const viteBin = resolvePackageBinaryFromCwd(\"vite\");\n const result = spawnSync(process.execPath, [viteBin, viteCommand, ...viteArgs], {\n stdio: \"inherit\",\n cwd: process.cwd(),\n env: process.env,\n });\n\n if (result.error) {\n throw result.error;\n }\n\n process.exit(result.status ?? 1);\n}\n\nfunction parseLintCommand(args: string[]): ParsedLintCommand {\n const patterns: string[] = [];\n const options: LintOptions = {};\n const sharedConfig: SharedConfigOptions = {\n configMode: \"root\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--format\" || arg === \"-f\") {\n options.format = args[++i];\n } else if (arg === \"--max-warnings\") {\n options.maxWarnings = Number.parseInt(args[++i], 10);\n } else if (arg === \"--quiet\" || arg === \"-q\") {\n options.quiet = true;\n } else if (arg === \"--fix\") {\n options.fix = true;\n } else if (arg === \"--help-level\") {\n options.helpLevel = args[++i];\n } else if (arg === \"--preset\") {\n options.preset = args[++i];\n } else if (arg === \"--config\" || arg === \"-c\") {\n const configFile = args[++i];\n if (!configFile) {\n throw new Error(\"Missing path after --config\");\n }\n sharedConfig.configFile = configFile;\n } else if (arg === \"--no-config\") {\n sharedConfig.configMode = \"none\";\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options, sharedConfig };\n}\n\n// ============================================================================\n// Build command\n// ============================================================================\n\ninterface NativeBuildOptions {\n ssr?: boolean;\n vapor?: boolean;\n customRenderer?: boolean;\n custom_renderer?: boolean;\n isTs?: boolean;\n is_ts?: boolean;\n threads?: number;\n}\n\ninterface BatchFileInput {\n path: string;\n source: string;\n}\n\ninterface MacroArtifact {\n kind: string;\n name: string;\n source: string;\n content: string;\n moduleCode?: string;\n start: number;\n end: number;\n}\n\ninterface BatchFileResult {\n path: string;\n code: string;\n css?: string;\n errors: string[];\n warnings: string[];\n scopeId?: string;\n scope_id?: string;\n hasScoped?: boolean;\n has_scoped?: boolean;\n macroArtifacts?: MacroArtifact[];\n macro_artifacts?: MacroArtifact[];\n}\n\ninterface BatchCompileResult {\n results: BatchFileResult[];\n successCount?: number;\n success_count?: number;\n failedCount?: number;\n failed_count?: number;\n timeMs?: number;\n time_ms?: number;\n}\n\ninterface BuildOptions {\n output: string;\n format: \"js\" | \"json\" | \"stats\";\n ssr?: boolean;\n vapor?: boolean;\n customRenderer?: boolean;\n scriptExt: \"preserve\" | \"downcompile\";\n threads?: number;\n help?: boolean;\n}\n\ninterface ParsedBuildCommand {\n patterns: string[];\n options: BuildOptions;\n sharedConfig: SharedConfigOptions;\n}\n\nfunction parseBuildCommand(args: string[]): ParsedBuildCommand {\n const patterns: string[] = [];\n const options: BuildOptions = {\n output: \"./dist\",\n format: \"js\",\n scriptExt: \"downcompile\",\n };\n const sharedConfig: SharedConfigOptions = {\n configMode: \"root\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--output\" || arg === \"-o\") {\n options.output = args[++i] ?? options.output;\n } else if (arg === \"--format\" || arg === \"-f\") {\n const format = args[++i];\n if (format === \"js\" || format === \"json\" || format === \"stats\") {\n options.format = format;\n }\n } else if (arg === \"--ssr\") {\n options.ssr = true;\n } else if (arg === \"--vapor\") {\n options.vapor = true;\n } else if (arg === \"--custom-renderer\") {\n options.customRenderer = true;\n } else if (arg === \"--script-ext\") {\n const scriptExt = args[++i];\n if (scriptExt === \"preserve\" || scriptExt === \"downcompile\") {\n options.scriptExt = scriptExt;\n }\n } else if (arg === \"--threads\" || arg === \"-j\") {\n options.threads = Number.parseInt(args[++i], 10);\n } else if (arg === \"--config\" || arg === \"-c\") {\n const configFile = args[++i];\n if (!configFile) {\n throw new Error(\"Missing path after --config\");\n }\n sharedConfig.configFile = configFile;\n } else if (arg === \"--no-config\") {\n sharedConfig.configMode = \"none\";\n } else if (arg === \"--profile\" || arg === \"--continue-on-error\") {\n // Accepted for command compatibility. The npm build path prints a compact summary.\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options, sharedConfig };\n}\n\nfunction getScriptLang(source: string): string {\n const match = source.match(/<script\\b[^>]*\\blang=[\"']([^\"']+)[\"']/i);\n return match?.[1] ?? \"js\";\n}\n\nfunction getOutputExtension(source: string, scriptExt: BuildOptions[\"scriptExt\"]): string {\n if (scriptExt === \"downcompile\") {\n return \"js\";\n }\n const lang = getScriptLang(source);\n return lang === \"ts\" || lang === \"tsx\" || lang === \"jsx\" ? lang : \"js\";\n}\n\nfunction outputFileName(file: string, extension: string): string {\n return path.basename(file).replace(/\\.vue$/i, `.${extension}`);\n}\n\nfunction toNativeBuildOptions(options: BuildOptions): NativeBuildOptions {\n const isTs = options.scriptExt === \"preserve\";\n return {\n ssr: options.ssr,\n vapor: options.vapor,\n customRenderer: options.customRenderer,\n custom_renderer: options.customRenderer,\n isTs,\n is_ts: isTs,\n threads: options.threads,\n };\n}\n\nasync function runBuild(args: string[]): Promise<void> {\n const { patterns, options, sharedConfig } = parseBuildCommand(args);\n if (options.help) {\n printBuildUsage();\n return;\n }\n\n const config = await loadConfig(process.cwd(), {\n mode: sharedConfig.configMode,\n configFile: sharedConfig.configFile,\n env: {\n mode: process.env.NODE_ENV ?? \"development\",\n command: \"build\",\n },\n });\n\n if (sharedConfig.configFile && !config) {\n throw new Error(`Could not find config file: ${sharedConfig.configFile}`);\n }\n\n options.ssr ??= config?.compiler?.ssr;\n options.vapor ??= config?.compiler?.vapor;\n options.customRenderer ??= config?.compiler?.customRenderer;\n if (config?.compiler?.scriptExt === \"ts\") {\n options.scriptExt = \"preserve\";\n } else if (config?.compiler?.scriptExt === \"js\") {\n options.scriptExt = \"downcompile\";\n }\n\n const files = collectVueFiles(patterns);\n if (files.length === 0) {\n process.stderr.write(\n `No Vue files found matching inputs: ${sanitizeTerminalText(JSON.stringify(patterns))}\\n`,\n );\n process.exit(1);\n }\n\n const native = loadNative(\"build\");\n const startedAt = performance.now();\n const batches = createBoundedFileBatches(files, {\n maxFiles: BUILD_BATCH_SIZE,\n maxBytes: BUILD_BATCH_MAX_BYTES,\n });\n\n if (options.format !== \"stats\") {\n mkdirSync(options.output, { recursive: true });\n }\n\n let nativeTimeMs = 0;\n let failed = 0;\n let success = 0;\n\n for (const batch of batches) {\n const inputs: { path: string; source: string }[] = [];\n const extensionByPath = new Map<string, string>();\n for (const file of batch) {\n const source = readFileSync(file, \"utf8\");\n extensionByPath.set(file, getOutputExtension(source, options.scriptExt));\n inputs.push({ path: file, source });\n }\n\n const chunkStartedAt = performance.now();\n const result = native.compileSfcBatchWithResults(inputs, toNativeBuildOptions(options));\n inputs.length = 0;\n nativeTimeMs += result.timeMs ?? result.time_ms ?? performance.now() - chunkStartedAt;\n const results = result.results.sort((left, right) => left.path.localeCompare(right.path));\n\n for (const fileResult of results) {\n for (const warning of fileResult.warnings) {\n process.stderr.write(\n `warning: ${displayPath(fileResult.path)} ${sanitizeTerminalText(warning)}\\n`,\n );\n }\n for (const error of fileResult.errors) {\n process.stderr.write(\n `error: ${displayPath(fileResult.path)} ${sanitizeTerminalText(error)}\\n`,\n );\n }\n\n if (fileResult.errors.length > 0 || options.format === \"stats\") {\n continue;\n }\n\n const extension =\n options.format === \"json\" ? \"json\" : (extensionByPath.get(fileResult.path) ?? \"js\");\n const outputPath = path.join(options.output, outputFileName(fileResult.path, extension));\n const content =\n options.format === \"json\" ? JSON.stringify(fileResult, null, 2) : fileResult.code;\n writeFileSync(outputPath, content);\n }\n\n const chunkFailed =\n result.failedCount ?? result.failed_count ?? results.filter((r) => r.errors.length).length;\n failed += chunkFailed;\n success += result.successCount ?? result.success_count ?? results.length - chunkFailed;\n }\n\n const timeMs = nativeTimeMs || performance.now() - startedAt;\n process.stderr.write(\n `\\x1b[32mOK\\x1b[0m Built ${success} Vue file(s) in ${timeMs.toFixed(2)}ms\\n`,\n );\n\n if (failed > 0) {\n process.stderr.write(`\\x1b[31mERR\\x1b[0m ${failed} file(s) failed\\n`);\n process.exit(1);\n }\n}\n\n// ============================================================================\n// Format command\n// ============================================================================\n\ninterface NativeFormatOptions {\n printWidth?: number;\n print_width?: number;\n tabWidth?: number;\n tab_width?: number;\n useTabs?: boolean;\n use_tabs?: boolean;\n semi?: boolean;\n singleQuote?: boolean;\n single_quote?: boolean;\n sortAttributes?: boolean;\n sort_attributes?: boolean;\n singleAttributePerLine?: boolean;\n single_attribute_per_line?: boolean;\n maxAttributesPerLine?: number;\n max_attributes_per_line?: number;\n normalizeDirectiveShorthands?: boolean;\n normalize_directive_shorthands?: boolean;\n}\n\ninterface FormatResult {\n code: string;\n changed: boolean;\n}\n\ninterface FmtOptions extends NativeFormatOptions {\n check?: boolean;\n write?: boolean;\n help?: boolean;\n}\n\ninterface ParsedFmtCommand {\n patterns: string[];\n options: FmtOptions;\n sharedConfig: SharedConfigOptions;\n}\n\nfunction parseFmtCommand(args: string[]): ParsedFmtCommand {\n const patterns: string[] = [];\n const options: FmtOptions = {};\n const sharedConfig: SharedConfigOptions = {\n configMode: \"root\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--check\") {\n options.check = true;\n } else if (arg === \"--write\" || arg === \"-w\") {\n options.write = true;\n } else if (arg === \"--single-quote\") {\n options.singleQuote = true;\n } else if (arg === \"--print-width\") {\n options.printWidth = Number.parseInt(args[++i], 10);\n } else if (arg === \"--tab-width\") {\n options.tabWidth = Number.parseInt(args[++i], 10);\n } else if (arg === \"--use-tabs\") {\n options.useTabs = true;\n } else if (arg === \"--no-semi\") {\n options.semi = false;\n } else if (arg === \"--sort-attributes\") {\n options.sortAttributes = true;\n } else if (arg === \"--single-attribute-per-line\") {\n options.singleAttributePerLine = true;\n } else if (arg === \"--max-attributes-per-line\") {\n options.maxAttributesPerLine = Number.parseInt(args[++i], 10);\n } else if (arg === \"--normalize-directive-shorthands\") {\n options.normalizeDirectiveShorthands = true;\n } else if (arg === \"--config\" || arg === \"-c\") {\n const configFile = args[++i];\n if (!configFile) {\n throw new Error(\"Missing path after --config\");\n }\n sharedConfig.configFile = configFile;\n } else if (arg === \"--no-config\") {\n sharedConfig.configMode = \"none\";\n } else if (arg === \"--profile\") {\n // Accepted for command compatibility. The npm fmt path prints a compact summary.\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options, sharedConfig };\n}\n\nfunction toNativeFormatOptions(options: FmtOptions): NativeFormatOptions {\n return {\n printWidth: options.printWidth,\n print_width: options.printWidth,\n tabWidth: options.tabWidth,\n tab_width: options.tabWidth,\n useTabs: options.useTabs,\n use_tabs: options.useTabs,\n semi: options.semi,\n singleQuote: options.singleQuote,\n single_quote: options.singleQuote,\n sortAttributes: options.sortAttributes,\n sort_attributes: options.sortAttributes,\n singleAttributePerLine: options.singleAttributePerLine,\n single_attribute_per_line: options.singleAttributePerLine,\n maxAttributesPerLine: options.maxAttributesPerLine,\n max_attributes_per_line: options.maxAttributesPerLine,\n normalizeDirectiveShorthands: options.normalizeDirectiveShorthands,\n normalize_directive_shorthands: options.normalizeDirectiveShorthands,\n };\n}\n\nasync function runFmt(args: string[]): Promise<void> {\n const { patterns, options, sharedConfig } = parseFmtCommand(args);\n if (options.help) {\n printFmtUsage();\n return;\n }\n\n const config = await loadConfig(process.cwd(), {\n mode: sharedConfig.configMode,\n configFile: sharedConfig.configFile,\n env: {\n mode: process.env.NODE_ENV ?? \"development\",\n command: \"fmt\",\n },\n });\n\n if (sharedConfig.configFile && !config) {\n throw new Error(`Could not find config file: ${sharedConfig.configFile}`);\n }\n\n options.printWidth ??= config?.formatter?.printWidth;\n options.tabWidth ??= config?.formatter?.tabWidth;\n options.useTabs ??= config?.formatter?.useTabs;\n options.semi ??= config?.formatter?.semi;\n options.singleQuote ??= config?.formatter?.singleQuote;\n\n const files = collectVueFiles(patterns);\n if (files.length === 0) {\n process.stderr.write(\n `No Vue files found matching inputs: ${sanitizeTerminalText(JSON.stringify(patterns))}\\n`,\n );\n return;\n }\n\n const native = loadNative(\"fmt\");\n let changed = 0;\n let errored = 0;\n\n for (const file of files) {\n const source = readFileSync(file, \"utf8\");\n try {\n const result = native.formatSfc(source, toNativeFormatOptions(options));\n if (!result.changed) {\n continue;\n }\n changed++;\n if (options.check) {\n process.stderr.write(`Would reformat: ${displayPath(file)}\\n`);\n } else if (options.write) {\n writeFileSync(file, result.code);\n process.stderr.write(`Reformatted: ${displayPath(file)}\\n`);\n } else {\n process.stderr.write(`Would reformat: ${displayPath(file)}\\n`);\n }\n } catch (error) {\n errored++;\n process.stderr.write(\n `Error formatting ${displayPath(file)}: ${sanitizeTerminalText(error instanceof Error ? error.message : String(error))}\\n`,\n );\n }\n }\n\n process.stderr.write(\n `\\x1b[32mOK\\x1b[0m Formatted ${files.length} Vue file(s), ${changed} changed\\n`,\n );\n\n if (errored > 0 || (options.check && changed > 0)) {\n process.exit(1);\n }\n}\n\n// ============================================================================\n// Check command\n// ============================================================================\n\ninterface NativeTypeCheckOptions {\n filename?: string;\n strict?: boolean;\n includeVirtualTs?: boolean;\n include_virtual_ts?: boolean;\n checkProps?: boolean;\n check_props?: boolean;\n checkEmits?: boolean;\n check_emits?: boolean;\n checkTemplateBindings?: boolean;\n check_template_bindings?: boolean;\n checkReactivity?: boolean;\n check_reactivity?: boolean;\n checkSetupContext?: boolean;\n check_setup_context?: boolean;\n checkInvalidExports?: boolean;\n check_invalid_exports?: boolean;\n checkFallthroughAttrs?: boolean;\n check_fallthrough_attrs?: boolean;\n}\n\ninterface NativeDeclarationOptions {\n filename?: string;\n}\n\ninterface DeclarationResult {\n code: string;\n}\n\ninterface TypeDiagnostic {\n severity: string;\n message: string;\n start: number;\n end: number;\n code?: string;\n help?: string;\n related?: Array<{\n message: string;\n start: number;\n end: number;\n filename?: string;\n }>;\n}\n\ninterface TypeCheckResult {\n diagnostics: TypeDiagnostic[];\n virtualTs?: string;\n errorCount: number;\n warningCount: number;\n analysisTimeMs?: number;\n}\n\ninterface CheckOptions {\n format?: string;\n quiet?: boolean;\n strict?: boolean;\n includeVirtualTs?: boolean;\n maxWarnings?: number;\n checkProps?: boolean;\n checkEmits?: boolean;\n checkTemplateBindings?: boolean;\n checkReactivity?: boolean;\n checkSetupContext?: boolean;\n checkInvalidExports?: boolean;\n checkFallthroughAttrs?: boolean;\n declaration?: boolean;\n declarationDir?: string;\n help?: boolean;\n}\n\ninterface ParsedCheckCommand {\n patterns: string[];\n options: CheckOptions;\n sharedConfig: SharedConfigOptions;\n}\n\ninterface EmittedDeclaration {\n file: string;\n path: string;\n}\n\nfunction parseCheckCommand(args: string[]): ParsedCheckCommand {\n const patterns: string[] = [];\n const options: CheckOptions = {};\n const sharedConfig: SharedConfigOptions = {\n configMode: \"root\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--format\" || arg === \"-f\") {\n options.format = args[++i];\n } else if (arg === \"--quiet\" || arg === \"-q\") {\n options.quiet = true;\n } else if (arg === \"--strict\") {\n options.strict = true;\n } else if (arg === \"--no-strict\") {\n options.strict = false;\n } else if (arg === \"--show-virtual-ts\" || arg === \"--include-virtual-ts\") {\n options.includeVirtualTs = true;\n } else if (arg === \"--max-warnings\") {\n options.maxWarnings = Number.parseInt(args[++i], 10);\n } else if (arg === \"--no-check-props\") {\n options.checkProps = false;\n } else if (arg === \"--no-check-emits\") {\n options.checkEmits = false;\n } else if (arg === \"--no-check-template-bindings\") {\n options.checkTemplateBindings = false;\n } else if (arg === \"--no-check-reactivity\") {\n options.checkReactivity = false;\n } else if (arg === \"--no-check-setup-context\") {\n options.checkSetupContext = false;\n } else if (arg === \"--no-check-invalid-exports\") {\n options.checkInvalidExports = false;\n } else if (arg === \"--no-check-fallthrough-attrs\") {\n options.checkFallthroughAttrs = false;\n } else if (arg === \"--declaration\") {\n options.declaration = true;\n } else if (arg === \"--declaration-dir\") {\n const declarationDir = args[++i];\n if (!declarationDir) {\n throw new Error(\"Missing path after --declaration-dir\");\n }\n options.declarationDir = declarationDir;\n } else if (arg === \"--config\" || arg === \"-c\") {\n const configFile = args[++i];\n if (!configFile) {\n throw new Error(\"Missing path after --config\");\n }\n sharedConfig.configFile = configFile;\n } else if (arg === \"--no-config\") {\n sharedConfig.configMode = \"none\";\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (arg === \"--tsconfig\" || arg === \"--corsa-path\" || arg === \"--servers\") {\n i++;\n } else if (arg === \"--socket\" || arg === \"-s\") {\n i++;\n } else if (arg === \"--profile\") {\n // Accepted for package-script compatibility with the Rust CLI.\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options, sharedConfig };\n}\n\nexport function shouldRetainCheckSource(options: {\n declaration?: boolean;\n format?: string;\n quiet?: boolean;\n}): boolean {\n return Boolean(options.declaration || (options.format !== \"json\" && !options.quiet));\n}\n\nfunction hasGlobSyntax(pattern: string): boolean {\n return pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\");\n}\n\nfunction normalizePath(filePath: string): string {\n return filePath.split(path.sep).join(\"/\");\n}\n\nexport function sanitizeTerminalText(value: unknown): string {\n const text = String(value);\n let sanitized = \"\";\n\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code === 0x1b) {\n i = skipTerminalEscapeSequence(text, i);\n continue;\n }\n if (isUnsafeTerminalControl(code)) {\n continue;\n }\n sanitized += text[i];\n }\n\n return sanitized;\n}\n\nfunction skipTerminalEscapeSequence(text: string, escapeIndex: number): number {\n const introducer = text.charCodeAt(escapeIndex + 1);\n if (introducer === 0x5b) {\n return skipUntilAnsiFinalByte(text, escapeIndex + 2);\n }\n if (introducer === 0x5d || introducer === 0x50 || introducer === 0x5e || introducer === 0x5f) {\n return skipUntilStringTerminator(text, escapeIndex + 2);\n }\n if (Number.isNaN(introducer)) {\n return escapeIndex;\n }\n return escapeIndex + 1;\n}\n\nfunction skipUntilAnsiFinalByte(text: string, index: number): number {\n for (let i = index; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code >= 0x40 && code <= 0x7e) {\n return i;\n }\n }\n return text.length - 1;\n}\n\nfunction skipUntilStringTerminator(text: string, index: number): number {\n for (let i = index; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code === 0x07) {\n return i;\n }\n if (code === 0x1b && text.charCodeAt(i + 1) === 0x5c) {\n return i + 1;\n }\n }\n return text.length - 1;\n}\n\nfunction isUnsafeTerminalControl(code: number): boolean {\n if (code === 0x09 || code === 0x0a || code === 0x0d) {\n return false;\n }\n return (code >= 0x00 && code <= 0x1f) || (code >= 0x7f && code <= 0x9f);\n}\n\nexport function displayPath(filePath: string): string {\n const relative = path.relative(process.cwd(), filePath);\n if (relative && !relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return sanitizeTerminalText(normalizePath(relative));\n }\n return sanitizeTerminalText(normalizePath(filePath));\n}\n\nfunction isVueFile(filePath: string): boolean {\n return path.extname(filePath) === \".vue\";\n}\n\nfunction collectVueFilesFromDirectory(\n directory: string,\n recursive: boolean,\n files: string[] = [],\n): string[] {\n const entries = readdirSync(directory, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n if (SKIPPED_VUE_FILE_DIRECTORIES.has(entry.name)) {\n continue;\n }\n if (recursive) {\n collectVueFilesFromDirectory(entryPath, true, files);\n }\n } else if (entry.isFile() && isVueFile(entryPath)) {\n files.push(entryPath);\n }\n }\n\n return files;\n}\n\nfunction globBase(pattern: string): string {\n const normalized = normalizePath(pattern);\n const globIndex = normalized.search(/[*?[]/);\n if (globIndex === -1) {\n return normalized;\n }\n\n const beforeGlob = normalized.slice(0, globIndex);\n const slashIndex = beforeGlob.lastIndexOf(\"/\");\n if (slashIndex === -1) {\n return \".\";\n }\n return beforeGlob.slice(0, slashIndex) || \"/\";\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n const normalized = normalizePath(pattern);\n let source = \"\";\n\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized[i];\n const next = normalized[i + 1];\n const afterNext = normalized[i + 2];\n\n if (char === \"*\" && next === \"*\" && afterNext === \"/\") {\n source += \"(?:.*/)?\";\n i += 2;\n } else if (char === \"*\" && next === \"*\") {\n source += \".*\";\n i++;\n } else if (char === \"*\") {\n source += \"[^/]*\";\n } else if (char === \"?\") {\n source += \"[^/]\";\n } else if (\"\\\\^$+?.()|{}[]\".includes(char)) {\n source += `\\\\${char}`;\n } else {\n source += char;\n }\n }\n\n return new RegExp(`^${source}$`);\n}\n\nfunction shouldRecurseGlob(pattern: string, base: string): boolean {\n const normalizedPattern = normalizePath(pattern);\n const normalizedBase = normalizePath(base);\n const rest =\n normalizedBase === \".\"\n ? normalizedPattern\n : normalizedPattern.slice(normalizedBase.length).replace(/^\\/+/, \"\");\n return rest.includes(\"/\");\n}\n\nfunction collectVueFilesFromGlob(pattern: string): string[] {\n const basePattern = globBase(pattern);\n const base = path.resolve(process.cwd(), basePattern);\n if (!existsSync(base)) {\n return [];\n }\n\n const isAbsolutePattern = path.isAbsolute(pattern);\n const normalizedPattern = normalizePath(isAbsolutePattern ? path.resolve(pattern) : pattern);\n const regex = globToRegExp(normalizedPattern);\n const candidates = collectVueFilesFromDirectory(base, shouldRecurseGlob(pattern, basePattern));\n\n return candidates.filter((file) => {\n const comparable = isAbsolutePattern\n ? normalizePath(file)\n : normalizePath(path.relative(process.cwd(), file));\n return regex.test(comparable);\n });\n}\n\nfunction collectVueFiles(patterns: string[]): string[] {\n const files = new Set<string>();\n const inputs = patterns.length === 0 ? [\".\"] : patterns;\n\n for (const input of inputs) {\n if (hasGlobSyntax(input)) {\n for (const file of collectVueFilesFromGlob(input)) {\n files.add(path.resolve(file));\n }\n continue;\n }\n\n const resolved = path.resolve(process.cwd(), input);\n if (!existsSync(resolved)) {\n continue;\n }\n\n const stats = statSync(resolved);\n if (stats.isDirectory()) {\n for (const file of collectVueFilesFromDirectory(resolved, true)) {\n files.add(path.resolve(file));\n }\n } else if (stats.isFile() && isVueFile(resolved)) {\n files.add(resolved);\n }\n }\n\n return Array.from(files).sort();\n}\n\ninterface BoundedFileBatchOptions {\n maxFiles: number;\n maxBytes: number;\n sizeOf?: (file: string) => number;\n}\n\nfunction statFileSize(file: string): number {\n try {\n return statSync(file).size;\n } catch {\n return 0;\n }\n}\n\nexport function createBoundedFileBatches(\n files: readonly string[],\n options: BoundedFileBatchOptions,\n): string[][] {\n const maxFiles = Math.max(1, Math.floor(options.maxFiles));\n const maxBytes = Math.max(1, Math.floor(options.maxBytes));\n const sizeOf = options.sizeOf ?? statFileSize;\n const batches: string[][] = [];\n let current: string[] = [];\n let currentBytes = 0;\n\n for (const file of files) {\n const fileBytes = Math.max(0, sizeOf(file));\n if (current.length > 0 && (current.length >= maxFiles || currentBytes + fileBytes > maxBytes)) {\n batches.push(current);\n current = [];\n currentBytes = 0;\n }\n\n current.push(file);\n currentBytes += fileBytes;\n }\n\n if (current.length > 0) {\n batches.push(current);\n }\n\n return batches;\n}\n\nfunction commonSourceDirectory(files: readonly string[]): string {\n let common = path.dirname(files[0] ?? process.cwd());\n\n for (let i = 1; i < files.length; i++) {\n const directory = path.dirname(files[i]!);\n while (common !== path.dirname(common)) {\n const relative = path.relative(common, directory);\n if (relative !== \"..\" && !relative.startsWith(`..${path.sep}`)) {\n break;\n }\n common = path.dirname(common);\n }\n }\n\n return common;\n}\n\nfunction emitCheckDeclaration(\n file: string,\n source: string,\n sourceRoot: string,\n native: NativeBinding,\n options: CheckOptions,\n): EmittedDeclaration {\n const outDir = path.resolve(process.cwd(), options.declarationDir ?? \"dist/types\");\n const relative = normalizePath(path.relative(sourceRoot, file));\n const outputPath = path.join(outDir, `${relative}.d.ts`);\n mkdirSync(path.dirname(outputPath), { recursive: true });\n\n const declaration = native.generateDeclaration!(source, { filename: file });\n writeFileSync(outputPath, declaration.code);\n\n return {\n file: displayPath(outputPath),\n path: outputPath,\n };\n}\n\nfunction lineStarts(source: string): number[] {\n const starts = [0];\n for (let i = 0; i < source.length; i++) {\n if (source.charCodeAt(i) === 10) {\n starts.push(i + 1);\n }\n }\n return starts;\n}\n\nfunction offsetToLineColumn(starts: number[], offset: number): { line: number; column: number } {\n let low = 0;\n let high = starts.length - 1;\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (starts[mid] <= offset) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n const lineIndex = Math.max(0, high);\n return {\n line: lineIndex + 1,\n column: offset - starts[lineIndex] + 1,\n };\n}\n\nfunction toNativeTypeCheckOptions(file: string, options: CheckOptions): NativeTypeCheckOptions {\n return {\n filename: file,\n strict: options.strict,\n includeVirtualTs: options.includeVirtualTs,\n include_virtual_ts: options.includeVirtualTs,\n checkProps: options.checkProps,\n check_props: options.checkProps,\n checkEmits: options.checkEmits,\n check_emits: options.checkEmits,\n checkTemplateBindings: options.checkTemplateBindings,\n check_template_bindings: options.checkTemplateBindings,\n checkReactivity: options.checkReactivity,\n check_reactivity: options.checkReactivity,\n checkSetupContext: options.checkSetupContext,\n check_setup_context: options.checkSetupContext,\n checkInvalidExports: options.checkInvalidExports,\n check_invalid_exports: options.checkInvalidExports,\n checkFallthroughAttrs: options.checkFallthroughAttrs,\n check_fallthrough_attrs: options.checkFallthroughAttrs,\n };\n}\n\nfunction renderCheckFileText(\n file: string,\n source: string,\n result: TypeCheckResult,\n options: CheckOptions,\n): void {\n if (options.includeVirtualTs && result.virtualTs) {\n process.stderr.write(\n `\\n=== ${displayPath(file)} ===\\n${sanitizeTerminalText(result.virtualTs)}\\n`,\n );\n }\n\n if (options.quiet || result.diagnostics.length === 0) {\n return;\n }\n\n const starts = lineStarts(source);\n process.stdout.write(`\\n\\x1b[4m${displayPath(file)}\\x1b[0m\\n`);\n for (const diagnostic of result.diagnostics) {\n const color = diagnostic.severity === \"error\" ? \"\\x1b[31m\" : \"\\x1b[33m\";\n const location = offsetToLineColumn(starts, diagnostic.start);\n const code = diagnostic.code ? ` [${sanitizeTerminalText(diagnostic.code)}]` : \"\";\n process.stdout.write(\n ` ${color}${diagnostic.severity}:${location.line}:${location.column}\\x1b[0m${code} ${sanitizeTerminalText(diagnostic.message)}\\n`,\n );\n if (diagnostic.help) {\n process.stdout.write(` help: ${sanitizeTerminalText(diagnostic.help)}\\n`);\n }\n }\n}\n\nfunction renderCheckSummary(\n totalErrors: number,\n totalWarnings: number,\n fileCount: number,\n timeMs: number,\n declarations: readonly EmittedDeclaration[],\n): void {\n const status = totalErrors > 0 ? \"\\x1b[31mERR\\x1b[0m\" : \"\\x1b[32mOK\\x1b[0m\";\n process.stdout.write(\n `\\n${status} Type checked ${fileCount} Vue files in ${timeMs.toFixed(2)}ms\\n`,\n );\n if (totalErrors > 0) {\n process.stdout.write(` \\x1b[31m${totalErrors} error(s)\\x1b[0m\\n`);\n } else {\n process.stdout.write(\" \\x1b[32mNo type errors found!\\x1b[0m\\n\");\n }\n if (totalWarnings > 0) {\n process.stdout.write(` \\x1b[33m${totalWarnings} warning(s)\\x1b[0m\\n`);\n }\n if (declarations.length > 0) {\n process.stdout.write(` \\x1b[32mEmitted ${declarations.length} declaration file(s)\\x1b[0m\\n`);\n }\n}\n\nfunction indentJson(value: unknown, spaces: number): string {\n const padding = \" \".repeat(spaces);\n return JSON.stringify(value, null, 2)\n .split(\"\\n\")\n .map((line) => `${padding}${line}`)\n .join(\"\\n\");\n}\n\nfunction writeCheckJsonFile(index: number, file: string, result: TypeCheckResult): void {\n if (index > 0) {\n process.stdout.write(\",\\n\");\n }\n process.stdout.write(\n indentJson(\n {\n file: displayPath(file),\n diagnostics: result.diagnostics,\n virtualTs: result.virtualTs,\n },\n 4,\n ),\n );\n}\n\nfunction writeCheckJsonEnd(\n totalErrors: number,\n totalWarnings: number,\n fileCount: number,\n declarations: readonly EmittedDeclaration[],\n): void {\n process.stdout.write(\"\\n ],\\n\");\n process.stdout.write(` \"errorCount\": ${totalErrors},\\n`);\n process.stdout.write(` \"warningCount\": ${totalWarnings},\\n`);\n process.stdout.write(` \"fileCount\": ${fileCount},\\n`);\n process.stdout.write(\n ` \"declarations\": ${indentJson(\n declarations.map(({ file }) => file),\n 2,\n ).trimStart()}\\n`,\n );\n process.stdout.write(\"}\\n\");\n}\n\nasync function runCheck(args: string[]): Promise<void> {\n const { patterns, options, sharedConfig } = parseCheckCommand(args);\n if (options.help) {\n printCheckUsage();\n return;\n }\n\n const config = await loadConfig(process.cwd(), {\n mode: sharedConfig.configMode,\n configFile: sharedConfig.configFile,\n env: {\n mode: process.env.NODE_ENV ?? \"development\",\n command: \"check\",\n },\n });\n\n if (sharedConfig.configFile && !config) {\n throw new Error(`Could not find config file: ${sharedConfig.configFile}`);\n }\n\n if (config?.typeChecker?.enabled === false) {\n process.stderr.write(\n \"[vize] Skipping check because typeChecker.enabled is false in vize.config.\\n\",\n );\n return;\n }\n\n options.strict ??= config?.typeChecker?.strict;\n options.checkProps ??= config?.typeChecker?.checkProps;\n options.checkEmits ??= config?.typeChecker?.checkEmits;\n options.checkTemplateBindings ??= config?.typeChecker?.checkTemplateBindings;\n\n const files = collectVueFiles(patterns);\n if (files.length === 0) {\n process.stderr.write(\n `No Vue files found matching inputs: ${sanitizeTerminalText(JSON.stringify(patterns))}\\n`,\n );\n return;\n }\n\n const native = loadNative(\"check\");\n if (options.declaration && typeof native.generateDeclaration !== \"function\") {\n throw new Error(\"The loaded native binding does not support declaration generation.\");\n }\n\n const sourceRoot = options.declaration ? commonSourceDirectory(files) : \"\";\n const checkStartedAt = performance.now();\n const retainSource = shouldRetainCheckSource(options);\n const declarations: EmittedDeclaration[] = [];\n let totalErrors = 0;\n let totalWarnings = 0;\n let checkedCount = 0;\n\n if (options.format === \"json\") {\n process.stdout.write('{\\n \"files\": [\\n');\n }\n\n for (const file of files) {\n const source = readFileSync(file, \"utf8\");\n const result = native.typeCheck(source, toNativeTypeCheckOptions(file, options));\n totalErrors += result.errorCount;\n totalWarnings += result.warningCount;\n checkedCount++;\n\n if (options.declaration) {\n declarations.push(emitCheckDeclaration(file, source, sourceRoot, native, options));\n }\n\n if (options.format === \"json\") {\n writeCheckJsonFile(checkedCount - 1, file, result);\n } else {\n renderCheckFileText(file, retainSource ? source : \"\", result, options);\n }\n }\n\n const timeMs = performance.now() - checkStartedAt;\n\n if (options.format === \"json\") {\n writeCheckJsonEnd(totalErrors, totalWarnings, checkedCount, declarations);\n } else {\n renderCheckSummary(totalErrors, totalWarnings, checkedCount, timeMs, declarations);\n }\n\n if (totalErrors > 0) {\n process.exit(1);\n }\n\n if (options.maxWarnings !== undefined && totalWarnings > options.maxWarnings) {\n process.stderr.write(`\\nToo many warnings (${totalWarnings} > max ${options.maxWarnings})\\n`);\n process.exit(1);\n }\n}\n\nasync function runLint(args: string[]): Promise<void> {\n const { patterns, options, sharedConfig } = parseLintCommand(args);\n const config = await loadConfig(process.cwd(), {\n mode: sharedConfig.configMode,\n configFile: sharedConfig.configFile,\n env: {\n mode: process.env.NODE_ENV ?? \"development\",\n command: \"lint\",\n },\n });\n\n if (sharedConfig.configFile && !config) {\n throw new Error(`Could not find config file: ${sharedConfig.configFile}`);\n }\n\n if (config?.linter?.enabled === false) {\n process.stderr.write(\"[vize] Skipping lint because linter.enabled is false in vize.config.\\n\");\n return;\n }\n\n options.preset ??= config?.linter?.preset;\n\n if (patterns.length === 0) {\n patterns.push(\".\");\n }\n\n const native = loadNative(\"lint\");\n const result = native.lint(patterns, {\n format: options.format,\n max_warnings: options.maxWarnings,\n quiet: options.quiet,\n fix: options.fix,\n help_level: options.helpLevel,\n preset: options.preset,\n });\n\n if (result.output) {\n process.stdout.write(sanitizeTerminalText(result.output));\n if (!result.output.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n\n if (options.fix) {\n process.stderr.write(\"\\nNote: --fix is not yet implemented\\n\");\n }\n\n if (result.errorCount > 0) {\n process.exit(1);\n }\n\n if (options.maxWarnings !== undefined && result.warningCount > options.maxWarnings) {\n process.stderr.write(\n `\\nToo many warnings (${result.warningCount} > max ${options.maxWarnings})\\n`,\n );\n process.exit(1);\n }\n}\n\n// ============================================================================\n// Upgrade command\n// ============================================================================\n\ntype PackageManager = \"bun\" | \"npm\" | \"pnpm\" | \"vp\" | \"yarn\";\n\ninterface UpgradeOptions {\n packageManager?: PackageManager;\n global?: boolean;\n dryRun?: boolean;\n help?: boolean;\n}\n\nfunction parseUpgradeCommand(args: string[]): UpgradeOptions {\n const options: UpgradeOptions = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--package-manager\") {\n const packageManager = args[++i];\n if (\n packageManager === \"bun\" ||\n packageManager === \"npm\" ||\n packageManager === \"pnpm\" ||\n packageManager === \"vp\" ||\n packageManager === \"yarn\"\n ) {\n options.packageManager = packageManager;\n }\n } else if (arg === \"--global\" || arg === \"-g\") {\n options.global = true;\n } else if (arg === \"--dry-run\") {\n options.dryRun = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n }\n }\n\n return options;\n}\n\nfunction readCwdPackageJson(): {\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n} | null {\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n return JSON.parse(readFileSync(packageJsonPath, \"utf8\"));\n}\n\nfunction detectPackageManager(explicit?: PackageManager): PackageManager {\n if (explicit) {\n return explicit;\n }\n\n const userAgent = process.env.npm_config_user_agent ?? \"\";\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\";\n }\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\";\n }\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\";\n }\n if (userAgent.startsWith(\"npm\")) {\n return \"npm\";\n }\n\n const packageManager = readCwdPackageJson()?.packageManager;\n if (packageManager?.startsWith(\"pnpm\")) {\n return \"pnpm\";\n }\n if (packageManager?.startsWith(\"yarn\")) {\n return \"yarn\";\n }\n if (packageManager?.startsWith(\"bun\")) {\n return \"bun\";\n }\n return \"npm\";\n}\n\nfunction buildUpgradeCommand(\n packageManager: PackageManager,\n options: UpgradeOptions,\n): { command: string; args: string[] } {\n const packageJson = readCwdPackageJson();\n const saveDev = !packageJson?.dependencies?.vize;\n const packageSpec = \"vize@latest\";\n\n if (packageManager === \"vp\") {\n return {\n command: \"vp\",\n args: [\"install\", ...(options.global ? [\"-g\"] : saveDev ? [\"-D\"] : []), packageSpec],\n };\n }\n if (packageManager === \"pnpm\") {\n return {\n command: \"pnpm\",\n args: [\"add\", ...(options.global ? [\"-g\"] : saveDev ? [\"-D\"] : []), packageSpec],\n };\n }\n if (packageManager === \"yarn\") {\n return {\n command: \"yarn\",\n args: options.global\n ? [\"global\", \"add\", packageSpec]\n : [\"add\", ...(saveDev ? [\"-D\"] : []), packageSpec],\n };\n }\n if (packageManager === \"bun\") {\n return {\n command: \"bun\",\n args: [\"add\", ...(options.global ? [\"-g\"] : saveDev ? [\"-d\"] : []), packageSpec],\n };\n }\n return {\n command: \"npm\",\n args: [\"install\", ...(options.global ? [\"-g\"] : saveDev ? [\"-D\"] : []), packageSpec],\n };\n}\n\nfunction runUpgrade(args: string[]): void {\n const options = parseUpgradeCommand(args);\n if (options.help) {\n printUpgradeUsage();\n return;\n }\n\n const packageManager = detectPackageManager(options.packageManager);\n const command = buildUpgradeCommand(packageManager, options);\n\n if (options.dryRun) {\n process.stdout.write(`${command.command} ${command.args.join(\" \")}\\n`);\n return;\n }\n\n const result = spawnSync(command.command, command.args, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n env: process.env,\n });\n\n if (result.error) {\n throw result.error;\n }\n\n process.exit(result.status ?? 1);\n}\n\n// ============================================================================\n// Ready command\n// ============================================================================\n\ninterface ReadyOptions {\n output: string;\n ssr?: boolean;\n scriptExt: \"preserve\" | \"downcompile\";\n help?: boolean;\n}\n\ninterface ParsedReadyCommand {\n patterns: string[];\n options: ReadyOptions;\n}\n\nfunction parseReadyCommand(args: string[]): ParsedReadyCommand {\n const patterns: string[] = [];\n const options: ReadyOptions = {\n output: \"./dist\",\n scriptExt: \"downcompile\",\n };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--output\" || arg === \"-o\") {\n options.output = args[++i] ?? options.output;\n } else if (arg === \"--ssr\") {\n options.ssr = true;\n } else if (arg === \"--script-ext\") {\n const scriptExt = args[++i];\n if (scriptExt === \"preserve\" || scriptExt === \"downcompile\") {\n options.scriptExt = scriptExt;\n }\n } else if (arg === \"--help\" || arg === \"-h\") {\n options.help = true;\n } else if (!arg.startsWith(\"-\")) {\n patterns.push(arg);\n }\n }\n\n return { patterns, options };\n}\n\nasync function runReady(args: string[]): Promise<void> {\n const { patterns, options } = parseReadyCommand(args);\n if (options.help) {\n printReadyUsage();\n return;\n }\n\n process.stderr.write(\"vize ready: fmt\\n\");\n await runFmt([\"--write\", ...patterns]);\n\n process.stderr.write(\"vize ready: lint\\n\");\n await runLint(patterns);\n\n process.stderr.write(\"vize ready: check\\n\");\n await runCheck(patterns);\n\n process.stderr.write(\"vize ready: build\\n\");\n await runBuild([\n \"--output\",\n options.output,\n \"--script-ext\",\n options.scriptExt,\n ...(options.ssr ? [\"--ssr\"] : []),\n ...patterns,\n ]);\n}\n\n// ============================================================================\n// Command router\n// ============================================================================\n\nconst NAPI_COMMANDS = new Set([\"build\", \"check\", \"fmt\", \"lint\"]);\nconst JS_COMMANDS = new Set([\"musea\", \"ready\", \"upgrade\"]);\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const command = args[0];\n\n if (!command || command === \"--help\" || command === \"-h\") {\n printUsage();\n process.exit(1);\n }\n\n if (NAPI_COMMANDS.has(command)) {\n const commandArgs = args.slice(1);\n switch (command) {\n case \"build\":\n await runBuild(commandArgs);\n break;\n case \"check\":\n await runCheck(commandArgs);\n break;\n case \"fmt\":\n await runFmt(commandArgs);\n break;\n case \"lint\":\n await runLint(commandArgs);\n break;\n }\n } else if (JS_COMMANDS.has(command)) {\n const commandArgs = args.slice(1);\n switch (command) {\n case \"musea\":\n runMusea(commandArgs);\n break;\n case \"ready\":\n await runReady(commandArgs);\n break;\n case \"upgrade\":\n runUpgrade(commandArgs);\n break;\n }\n } else {\n printUsage();\n console.error(`Unknown command: ${sanitizeTerminalText(command)}`);\n console.error(\n \"For commands not yet available via NAPI, install from source: cargo install vize\",\n );\n process.exit(1);\n }\n}\n\nconst isTestRuntime =\n Boolean(import.meta.vitest) || process.env.VITEST === \"true\" || process.env.NODE_ENV === \"test\";\n\nif (!isTestRuntime) {\n void main().catch((error) => {\n console.error(sanitizeTerminalText(error instanceof Error ? error.message : String(error)));\n process.exit(1);\n });\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vize",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.100.0",
|
|
4
4
|
"description": "Vize - High-performance Vue.js toolchain in Rust",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -57,14 +57,14 @@
|
|
|
57
57
|
},
|
|
58
58
|
"optionalDependencies": {
|
|
59
59
|
"@pkl-community/pkl": "0.27.2",
|
|
60
|
-
"@vizejs/native-darwin-arm64": "0.
|
|
61
|
-
"@vizejs/native-darwin-x64": "0.
|
|
62
|
-
"@vizejs/native-linux-arm64-gnu": "0.
|
|
63
|
-
"@vizejs/native-linux-arm64-musl": "0.
|
|
64
|
-
"@vizejs/native-linux-x64-gnu": "0.
|
|
65
|
-
"@vizejs/native-linux-x64-musl": "0.
|
|
66
|
-
"@vizejs/native-win32-arm64-msvc": "0.
|
|
67
|
-
"@vizejs/native-win32-x64-msvc": "0.
|
|
60
|
+
"@vizejs/native-darwin-arm64": "0.100.0",
|
|
61
|
+
"@vizejs/native-darwin-x64": "0.100.0",
|
|
62
|
+
"@vizejs/native-linux-arm64-gnu": "0.100.0",
|
|
63
|
+
"@vizejs/native-linux-arm64-musl": "0.100.0",
|
|
64
|
+
"@vizejs/native-linux-x64-gnu": "0.100.0",
|
|
65
|
+
"@vizejs/native-linux-x64-musl": "0.100.0",
|
|
66
|
+
"@vizejs/native-win32-arm64-msvc": "0.100.0",
|
|
67
|
+
"@vizejs/native-win32-x64-msvc": "0.100.0"
|
|
68
68
|
},
|
|
69
69
|
"engines": {
|
|
70
70
|
"node": ">=22"
|
package/src/cli.test.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import {
|
|
4
|
+
createBoundedFileBatches,
|
|
4
5
|
displayPath,
|
|
5
6
|
sanitizeTerminalText,
|
|
6
7
|
shouldPreferWorkspaceBinding,
|
|
@@ -49,6 +50,32 @@ describe("sanitizeTerminalText", () => {
|
|
|
49
50
|
});
|
|
50
51
|
});
|
|
51
52
|
|
|
53
|
+
describe("createBoundedFileBatches", () => {
|
|
54
|
+
it("splits batches by file count and total source bytes", () => {
|
|
55
|
+
const batches = createBoundedFileBatches(["a.vue", "b.vue", "c.vue", "d.vue"], {
|
|
56
|
+
maxFiles: 3,
|
|
57
|
+
maxBytes: 10,
|
|
58
|
+
sizeOf(file) {
|
|
59
|
+
return file === "c.vue" ? 9 : 4;
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(batches).toEqual([["a.vue", "b.vue"], ["c.vue"], ["d.vue"]]);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("keeps a single oversized file processable", () => {
|
|
67
|
+
const batches = createBoundedFileBatches(["huge.vue", "small.vue"], {
|
|
68
|
+
maxFiles: 4,
|
|
69
|
+
maxBytes: 10,
|
|
70
|
+
sizeOf(file) {
|
|
71
|
+
return file === "huge.vue" ? 100 : 1;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
expect(batches).toEqual([["huge.vue"], ["small.vue"]]);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
52
79
|
describe("shouldRetainCheckSource", () => {
|
|
53
80
|
it("drops source retention for JSON and quiet check output", () => {
|
|
54
81
|
expect(shouldRetainCheckSource({ format: "json" })).toBe(false);
|
package/src/cli.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { loadConfig } from "./config.js";
|
|
|
8
8
|
const require = createRequire(import.meta.url);
|
|
9
9
|
const WORKSPACE_BINDING_PATH = "../../vize-native";
|
|
10
10
|
const BUILD_BATCH_SIZE = 128;
|
|
11
|
+
const BUILD_BATCH_MAX_BYTES = 32 * 1024 * 1024;
|
|
11
12
|
const SKIPPED_VUE_FILE_DIRECTORIES = new Set([
|
|
12
13
|
"node_modules",
|
|
13
14
|
"dist",
|
|
@@ -518,6 +519,10 @@ async function runBuild(args: string[]): Promise<void> {
|
|
|
518
519
|
|
|
519
520
|
const native = loadNative("build");
|
|
520
521
|
const startedAt = performance.now();
|
|
522
|
+
const batches = createBoundedFileBatches(files, {
|
|
523
|
+
maxFiles: BUILD_BATCH_SIZE,
|
|
524
|
+
maxBytes: BUILD_BATCH_MAX_BYTES,
|
|
525
|
+
});
|
|
521
526
|
|
|
522
527
|
if (options.format !== "stats") {
|
|
523
528
|
mkdirSync(options.output, { recursive: true });
|
|
@@ -527,12 +532,10 @@ async function runBuild(args: string[]): Promise<void> {
|
|
|
527
532
|
let failed = 0;
|
|
528
533
|
let success = 0;
|
|
529
534
|
|
|
530
|
-
for (
|
|
531
|
-
const end = Math.min(start + BUILD_BATCH_SIZE, files.length);
|
|
535
|
+
for (const batch of batches) {
|
|
532
536
|
const inputs: { path: string; source: string }[] = [];
|
|
533
537
|
const extensionByPath = new Map<string, string>();
|
|
534
|
-
for (
|
|
535
|
-
const file = files[index]!;
|
|
538
|
+
for (const file of batch) {
|
|
536
539
|
const source = readFileSync(file, "utf8");
|
|
537
540
|
extensionByPath.set(file, getOutputExtension(source, options.scriptExt));
|
|
538
541
|
inputs.push({ path: file, source });
|
|
@@ -850,12 +853,6 @@ interface ParsedCheckCommand {
|
|
|
850
853
|
sharedConfig: SharedConfigOptions;
|
|
851
854
|
}
|
|
852
855
|
|
|
853
|
-
interface CheckedFileResult {
|
|
854
|
-
file: string;
|
|
855
|
-
source: string;
|
|
856
|
-
result: TypeCheckResult;
|
|
857
|
-
}
|
|
858
|
-
|
|
859
856
|
interface EmittedDeclaration {
|
|
860
857
|
file: string;
|
|
861
858
|
path: string;
|
|
@@ -1019,8 +1016,11 @@ function isVueFile(filePath: string): boolean {
|
|
|
1019
1016
|
return path.extname(filePath) === ".vue";
|
|
1020
1017
|
}
|
|
1021
1018
|
|
|
1022
|
-
function collectVueFilesFromDirectory(
|
|
1023
|
-
|
|
1019
|
+
function collectVueFilesFromDirectory(
|
|
1020
|
+
directory: string,
|
|
1021
|
+
recursive: boolean,
|
|
1022
|
+
files: string[] = [],
|
|
1023
|
+
): string[] {
|
|
1024
1024
|
const entries = readdirSync(directory, { withFileTypes: true });
|
|
1025
1025
|
|
|
1026
1026
|
for (const entry of entries) {
|
|
@@ -1030,7 +1030,7 @@ function collectVueFilesFromDirectory(directory: string, recursive: boolean): st
|
|
|
1030
1030
|
continue;
|
|
1031
1031
|
}
|
|
1032
1032
|
if (recursive) {
|
|
1033
|
-
|
|
1033
|
+
collectVueFilesFromDirectory(entryPath, true, files);
|
|
1034
1034
|
}
|
|
1035
1035
|
} else if (entry.isFile() && isVueFile(entryPath)) {
|
|
1036
1036
|
files.push(entryPath);
|
|
@@ -1144,11 +1144,55 @@ function collectVueFiles(patterns: string[]): string[] {
|
|
|
1144
1144
|
return Array.from(files).sort();
|
|
1145
1145
|
}
|
|
1146
1146
|
|
|
1147
|
-
|
|
1148
|
-
|
|
1147
|
+
interface BoundedFileBatchOptions {
|
|
1148
|
+
maxFiles: number;
|
|
1149
|
+
maxBytes: number;
|
|
1150
|
+
sizeOf?: (file: string) => number;
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
function statFileSize(file: string): number {
|
|
1154
|
+
try {
|
|
1155
|
+
return statSync(file).size;
|
|
1156
|
+
} catch {
|
|
1157
|
+
return 0;
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
|
|
1161
|
+
export function createBoundedFileBatches(
|
|
1162
|
+
files: readonly string[],
|
|
1163
|
+
options: BoundedFileBatchOptions,
|
|
1164
|
+
): string[][] {
|
|
1165
|
+
const maxFiles = Math.max(1, Math.floor(options.maxFiles));
|
|
1166
|
+
const maxBytes = Math.max(1, Math.floor(options.maxBytes));
|
|
1167
|
+
const sizeOf = options.sizeOf ?? statFileSize;
|
|
1168
|
+
const batches: string[][] = [];
|
|
1169
|
+
let current: string[] = [];
|
|
1170
|
+
let currentBytes = 0;
|
|
1149
1171
|
|
|
1150
|
-
for (
|
|
1151
|
-
const
|
|
1172
|
+
for (const file of files) {
|
|
1173
|
+
const fileBytes = Math.max(0, sizeOf(file));
|
|
1174
|
+
if (current.length > 0 && (current.length >= maxFiles || currentBytes + fileBytes > maxBytes)) {
|
|
1175
|
+
batches.push(current);
|
|
1176
|
+
current = [];
|
|
1177
|
+
currentBytes = 0;
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
current.push(file);
|
|
1181
|
+
currentBytes += fileBytes;
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
if (current.length > 0) {
|
|
1185
|
+
batches.push(current);
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
return batches;
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
function commonSourceDirectory(files: readonly string[]): string {
|
|
1192
|
+
let common = path.dirname(files[0] ?? process.cwd());
|
|
1193
|
+
|
|
1194
|
+
for (let i = 1; i < files.length; i++) {
|
|
1195
|
+
const directory = path.dirname(files[i]!);
|
|
1152
1196
|
while (common !== path.dirname(common)) {
|
|
1153
1197
|
const relative = path.relative(common, directory);
|
|
1154
1198
|
if (relative !== ".." && !relative.startsWith(`..${path.sep}`)) {
|
|
@@ -1161,37 +1205,25 @@ function commonSourceDirectory(results: CheckedFileResult[]): string {
|
|
|
1161
1205
|
return common;
|
|
1162
1206
|
}
|
|
1163
1207
|
|
|
1164
|
-
function
|
|
1165
|
-
|
|
1208
|
+
function emitCheckDeclaration(
|
|
1209
|
+
file: string,
|
|
1210
|
+
source: string,
|
|
1211
|
+
sourceRoot: string,
|
|
1166
1212
|
native: NativeBinding,
|
|
1167
1213
|
options: CheckOptions,
|
|
1168
|
-
): EmittedDeclaration
|
|
1169
|
-
if (!options.declaration) {
|
|
1170
|
-
return [];
|
|
1171
|
-
}
|
|
1172
|
-
|
|
1173
|
-
if (typeof native.generateDeclaration !== "function") {
|
|
1174
|
-
throw new Error("The loaded native binding does not support declaration generation.");
|
|
1175
|
-
}
|
|
1176
|
-
|
|
1214
|
+
): EmittedDeclaration {
|
|
1177
1215
|
const outDir = path.resolve(process.cwd(), options.declarationDir ?? "dist/types");
|
|
1178
|
-
const
|
|
1179
|
-
const
|
|
1180
|
-
|
|
1181
|
-
for (const { file, source } of results) {
|
|
1182
|
-
const relative = normalizePath(path.relative(sourceRoot, file));
|
|
1183
|
-
const outputPath = path.join(outDir, `${relative}.d.ts`);
|
|
1184
|
-
mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
1216
|
+
const relative = normalizePath(path.relative(sourceRoot, file));
|
|
1217
|
+
const outputPath = path.join(outDir, `${relative}.d.ts`);
|
|
1218
|
+
mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
1185
1219
|
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
declarations.push({
|
|
1189
|
-
file: displayPath(outputPath),
|
|
1190
|
-
path: outputPath,
|
|
1191
|
-
});
|
|
1192
|
-
}
|
|
1220
|
+
const declaration = native.generateDeclaration!(source, { filename: file });
|
|
1221
|
+
writeFileSync(outputPath, declaration.code);
|
|
1193
1222
|
|
|
1194
|
-
return
|
|
1223
|
+
return {
|
|
1224
|
+
file: displayPath(outputPath),
|
|
1225
|
+
path: outputPath,
|
|
1226
|
+
};
|
|
1195
1227
|
}
|
|
1196
1228
|
|
|
1197
1229
|
function lineStarts(source: string): number[] {
|
|
@@ -1246,47 +1278,47 @@ function toNativeTypeCheckOptions(file: string, options: CheckOptions): NativeTy
|
|
|
1246
1278
|
};
|
|
1247
1279
|
}
|
|
1248
1280
|
|
|
1249
|
-
function
|
|
1250
|
-
|
|
1281
|
+
function renderCheckFileText(
|
|
1282
|
+
file: string,
|
|
1283
|
+
source: string,
|
|
1284
|
+
result: TypeCheckResult,
|
|
1251
1285
|
options: CheckOptions,
|
|
1252
|
-
timeMs: number,
|
|
1253
|
-
declarations: EmittedDeclaration[] = [],
|
|
1254
1286
|
): void {
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
totalWarnings += result.warningCount;
|
|
1261
|
-
|
|
1262
|
-
if (options.includeVirtualTs && result.virtualTs) {
|
|
1263
|
-
process.stderr.write(
|
|
1264
|
-
`\n=== ${displayPath(file)} ===\n${sanitizeTerminalText(result.virtualTs)}\n`,
|
|
1265
|
-
);
|
|
1266
|
-
}
|
|
1287
|
+
if (options.includeVirtualTs && result.virtualTs) {
|
|
1288
|
+
process.stderr.write(
|
|
1289
|
+
`\n=== ${displayPath(file)} ===\n${sanitizeTerminalText(result.virtualTs)}\n`,
|
|
1290
|
+
);
|
|
1291
|
+
}
|
|
1267
1292
|
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1293
|
+
if (options.quiet || result.diagnostics.length === 0) {
|
|
1294
|
+
return;
|
|
1295
|
+
}
|
|
1271
1296
|
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
}
|
|
1297
|
+
const starts = lineStarts(source);
|
|
1298
|
+
process.stdout.write(`\n\x1b[4m${displayPath(file)}\x1b[0m\n`);
|
|
1299
|
+
for (const diagnostic of result.diagnostics) {
|
|
1300
|
+
const color = diagnostic.severity === "error" ? "\x1b[31m" : "\x1b[33m";
|
|
1301
|
+
const location = offsetToLineColumn(starts, diagnostic.start);
|
|
1302
|
+
const code = diagnostic.code ? ` [${sanitizeTerminalText(diagnostic.code)}]` : "";
|
|
1303
|
+
process.stdout.write(
|
|
1304
|
+
` ${color}${diagnostic.severity}:${location.line}:${location.column}\x1b[0m${code} ${sanitizeTerminalText(diagnostic.message)}\n`,
|
|
1305
|
+
);
|
|
1306
|
+
if (diagnostic.help) {
|
|
1307
|
+
process.stdout.write(` help: ${sanitizeTerminalText(diagnostic.help)}\n`);
|
|
1284
1308
|
}
|
|
1285
1309
|
}
|
|
1310
|
+
}
|
|
1286
1311
|
|
|
1312
|
+
function renderCheckSummary(
|
|
1313
|
+
totalErrors: number,
|
|
1314
|
+
totalWarnings: number,
|
|
1315
|
+
fileCount: number,
|
|
1316
|
+
timeMs: number,
|
|
1317
|
+
declarations: readonly EmittedDeclaration[],
|
|
1318
|
+
): void {
|
|
1287
1319
|
const status = totalErrors > 0 ? "\x1b[31mERR\x1b[0m" : "\x1b[32mOK\x1b[0m";
|
|
1288
1320
|
process.stdout.write(
|
|
1289
|
-
`\n${status} Type checked ${
|
|
1321
|
+
`\n${status} Type checked ${fileCount} Vue files in ${timeMs.toFixed(2)}ms\n`,
|
|
1290
1322
|
);
|
|
1291
1323
|
if (totalErrors > 0) {
|
|
1292
1324
|
process.stdout.write(` \x1b[31m${totalErrors} error(s)\x1b[0m\n`);
|
|
@@ -1301,6 +1333,49 @@ function renderCheckText(
|
|
|
1301
1333
|
}
|
|
1302
1334
|
}
|
|
1303
1335
|
|
|
1336
|
+
function indentJson(value: unknown, spaces: number): string {
|
|
1337
|
+
const padding = " ".repeat(spaces);
|
|
1338
|
+
return JSON.stringify(value, null, 2)
|
|
1339
|
+
.split("\n")
|
|
1340
|
+
.map((line) => `${padding}${line}`)
|
|
1341
|
+
.join("\n");
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
function writeCheckJsonFile(index: number, file: string, result: TypeCheckResult): void {
|
|
1345
|
+
if (index > 0) {
|
|
1346
|
+
process.stdout.write(",\n");
|
|
1347
|
+
}
|
|
1348
|
+
process.stdout.write(
|
|
1349
|
+
indentJson(
|
|
1350
|
+
{
|
|
1351
|
+
file: displayPath(file),
|
|
1352
|
+
diagnostics: result.diagnostics,
|
|
1353
|
+
virtualTs: result.virtualTs,
|
|
1354
|
+
},
|
|
1355
|
+
4,
|
|
1356
|
+
),
|
|
1357
|
+
);
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
function writeCheckJsonEnd(
|
|
1361
|
+
totalErrors: number,
|
|
1362
|
+
totalWarnings: number,
|
|
1363
|
+
fileCount: number,
|
|
1364
|
+
declarations: readonly EmittedDeclaration[],
|
|
1365
|
+
): void {
|
|
1366
|
+
process.stdout.write("\n ],\n");
|
|
1367
|
+
process.stdout.write(` "errorCount": ${totalErrors},\n`);
|
|
1368
|
+
process.stdout.write(` "warningCount": ${totalWarnings},\n`);
|
|
1369
|
+
process.stdout.write(` "fileCount": ${fileCount},\n`);
|
|
1370
|
+
process.stdout.write(
|
|
1371
|
+
` "declarations": ${indentJson(
|
|
1372
|
+
declarations.map(({ file }) => file),
|
|
1373
|
+
2,
|
|
1374
|
+
).trimStart()}\n`,
|
|
1375
|
+
);
|
|
1376
|
+
process.stdout.write("}\n");
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1304
1379
|
async function runCheck(args: string[]): Promise<void> {
|
|
1305
1380
|
const { patterns, options, sharedConfig } = parseCheckCommand(args);
|
|
1306
1381
|
if (options.help) {
|
|
@@ -1342,41 +1417,46 @@ async function runCheck(args: string[]): Promise<void> {
|
|
|
1342
1417
|
}
|
|
1343
1418
|
|
|
1344
1419
|
const native = loadNative("check");
|
|
1345
|
-
|
|
1420
|
+
if (options.declaration && typeof native.generateDeclaration !== "function") {
|
|
1421
|
+
throw new Error("The loaded native binding does not support declaration generation.");
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
const sourceRoot = options.declaration ? commonSourceDirectory(files) : "";
|
|
1425
|
+
const checkStartedAt = performance.now();
|
|
1346
1426
|
const retainSource = shouldRetainCheckSource(options);
|
|
1347
|
-
const
|
|
1427
|
+
const declarations: EmittedDeclaration[] = [];
|
|
1428
|
+
let totalErrors = 0;
|
|
1429
|
+
let totalWarnings = 0;
|
|
1430
|
+
let checkedCount = 0;
|
|
1431
|
+
|
|
1432
|
+
if (options.format === "json") {
|
|
1433
|
+
process.stdout.write('{\n "files": [\n');
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
for (const file of files) {
|
|
1348
1437
|
const source = readFileSync(file, "utf8");
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1438
|
+
const result = native.typeCheck(source, toNativeTypeCheckOptions(file, options));
|
|
1439
|
+
totalErrors += result.errorCount;
|
|
1440
|
+
totalWarnings += result.warningCount;
|
|
1441
|
+
checkedCount++;
|
|
1442
|
+
|
|
1443
|
+
if (options.declaration) {
|
|
1444
|
+
declarations.push(emitCheckDeclaration(file, source, sourceRoot, native, options));
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1447
|
+
if (options.format === "json") {
|
|
1448
|
+
writeCheckJsonFile(checkedCount - 1, file, result);
|
|
1449
|
+
} else {
|
|
1450
|
+
renderCheckFileText(file, retainSource ? source : "", result, options);
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
const timeMs = performance.now() - checkStartedAt;
|
|
1359
1455
|
|
|
1360
1456
|
if (options.format === "json") {
|
|
1361
|
-
|
|
1362
|
-
`${JSON.stringify(
|
|
1363
|
-
{
|
|
1364
|
-
files: results.map(({ file, result }) => ({
|
|
1365
|
-
file: displayPath(file),
|
|
1366
|
-
diagnostics: result.diagnostics,
|
|
1367
|
-
virtualTs: result.virtualTs,
|
|
1368
|
-
})),
|
|
1369
|
-
errorCount: totalErrors,
|
|
1370
|
-
warningCount: totalWarnings,
|
|
1371
|
-
fileCount: results.length,
|
|
1372
|
-
declarations: declarations.map(({ file }) => file),
|
|
1373
|
-
},
|
|
1374
|
-
null,
|
|
1375
|
-
2,
|
|
1376
|
-
)}\n`,
|
|
1377
|
-
);
|
|
1457
|
+
writeCheckJsonEnd(totalErrors, totalWarnings, checkedCount, declarations);
|
|
1378
1458
|
} else {
|
|
1379
|
-
|
|
1459
|
+
renderCheckSummary(totalErrors, totalWarnings, checkedCount, timeMs, declarations);
|
|
1380
1460
|
}
|
|
1381
1461
|
|
|
1382
1462
|
if (totalErrors > 0) {
|