zod-aot 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/dist/cli/commands/generate.d.ts +25 -2
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +58 -31
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/watch.d.ts +23 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +149 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.js +16 -5
- package/dist/cli/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -116,6 +116,9 @@ npx zod-aot generate src/schemas.ts -o src/schemas.compiled.ts
|
|
|
116
116
|
# Generate from a directory
|
|
117
117
|
npx zod-aot generate src/ -o src/compiled/
|
|
118
118
|
|
|
119
|
+
# Watch mode — regenerate on file changes
|
|
120
|
+
npx zod-aot generate src/ --watch
|
|
121
|
+
|
|
119
122
|
# Check if schemas are compilable (without generating)
|
|
120
123
|
npx zod-aot check src/schemas.ts
|
|
121
124
|
```
|
|
@@ -435,7 +438,7 @@ When a schema contains a mix of compilable and non-compilable parts (e.g., an ob
|
|
|
435
438
|
- [x] CLI (`npx zod-aot generate` / `npx zod-aot check`)
|
|
436
439
|
- [x] Partial fallback (objects with some transform properties)
|
|
437
440
|
- [x] unplugin integration (Vite / webpack / esbuild / Rollup)
|
|
438
|
-
- [
|
|
441
|
+
- [x] Watch mode (`--watch` / `-w`)
|
|
439
442
|
|
|
440
443
|
### Phase 3: Ecosystem
|
|
441
444
|
|
|
@@ -1,7 +1,30 @@
|
|
|
1
|
-
interface GenerateOptions {
|
|
1
|
+
export interface GenerateOptions {
|
|
2
2
|
inputs: string[];
|
|
3
3
|
output: string | undefined;
|
|
4
4
|
}
|
|
5
|
+
export interface GenerateFileResult {
|
|
6
|
+
filePath: string;
|
|
7
|
+
outputPath: string;
|
|
8
|
+
schemaCount: number;
|
|
9
|
+
schemaNames: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if a filename is a schema file candidate.
|
|
13
|
+
* Shared filter logic used by both findSchemaFiles and isWatchTarget.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isSchemaFile(fileName: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve input paths to a list of source files.
|
|
18
|
+
* If a path is a directory, find all .ts files (excluding .compiled.ts, .test.ts, node_modules).
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveInputFiles(inputs: string[]): Promise<string[]>;
|
|
21
|
+
export declare function findSchemaFiles(dir: string): Promise<string[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Generate compiled output for a single source file.
|
|
24
|
+
* Returns null if no compile() calls are found.
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateFile(filePath: string, outputFlag: string | undefined, options?: {
|
|
27
|
+
cacheBust?: boolean;
|
|
28
|
+
}): Promise<GenerateFileResult | null>;
|
|
5
29
|
export declare function runGenerate(options: GenerateOptions): Promise<void>;
|
|
6
|
-
export {};
|
|
7
30
|
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAWA,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqB3E;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBpE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAqCpC;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCzE"}
|
|
@@ -6,11 +6,23 @@ import { extractSchema } from "#src/core/extractor.js";
|
|
|
6
6
|
import { discoverSchemas } from "#src/discovery.js";
|
|
7
7
|
import { generateCompiledFileContent, resolveOutputPath, writeCompiledFile } from "../emitter.js";
|
|
8
8
|
import { logger } from "../logger.js";
|
|
9
|
+
/**
|
|
10
|
+
* Check if a filename is a schema file candidate.
|
|
11
|
+
* Shared filter logic used by both findSchemaFiles and isWatchTarget.
|
|
12
|
+
*/
|
|
13
|
+
export function isSchemaFile(fileName) {
|
|
14
|
+
return (/\.(?:ts|mts|js|mjs)$/.test(fileName) &&
|
|
15
|
+
!fileName.endsWith(".compiled.ts") &&
|
|
16
|
+
!fileName.endsWith(".compiled.js") &&
|
|
17
|
+
!fileName.endsWith(".test.ts") &&
|
|
18
|
+
!fileName.endsWith(".test.js") &&
|
|
19
|
+
!fileName.endsWith(".d.ts"));
|
|
20
|
+
}
|
|
9
21
|
/**
|
|
10
22
|
* Resolve input paths to a list of source files.
|
|
11
23
|
* If a path is a directory, find all .ts files (excluding .compiled.ts, .test.ts, node_modules).
|
|
12
24
|
*/
|
|
13
|
-
async function resolveInputFiles(inputs) {
|
|
25
|
+
export async function resolveInputFiles(inputs) {
|
|
14
26
|
const files = [];
|
|
15
27
|
for (const input of inputs) {
|
|
16
28
|
const absPath = path.resolve(input);
|
|
@@ -29,7 +41,7 @@ async function resolveInputFiles(inputs) {
|
|
|
29
41
|
}
|
|
30
42
|
return files;
|
|
31
43
|
}
|
|
32
|
-
async function findSchemaFiles(dir) {
|
|
44
|
+
export async function findSchemaFiles(dir) {
|
|
33
45
|
const results = [];
|
|
34
46
|
const entries = await fs.promises.readdir(dir, { withFileTypes: true });
|
|
35
47
|
for (const entry of entries) {
|
|
@@ -41,18 +53,47 @@ async function findSchemaFiles(dir) {
|
|
|
41
53
|
const nested = await findSchemaFiles(fullPath);
|
|
42
54
|
results.push(...nested);
|
|
43
55
|
}
|
|
44
|
-
else if (entry.isFile() &&
|
|
45
|
-
/\.(?:ts|mts|js|mjs)$/.test(entry.name) &&
|
|
46
|
-
!entry.name.endsWith(".compiled.ts") &&
|
|
47
|
-
!entry.name.endsWith(".compiled.js") &&
|
|
48
|
-
!entry.name.endsWith(".test.ts") &&
|
|
49
|
-
!entry.name.endsWith(".test.js") &&
|
|
50
|
-
!entry.name.endsWith(".d.ts")) {
|
|
56
|
+
else if (entry.isFile() && isSchemaFile(entry.name)) {
|
|
51
57
|
results.push(fullPath);
|
|
52
58
|
}
|
|
53
59
|
}
|
|
54
60
|
return results;
|
|
55
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate compiled output for a single source file.
|
|
64
|
+
* Returns null if no compile() calls are found.
|
|
65
|
+
*/
|
|
66
|
+
export async function generateFile(filePath, outputFlag, options) {
|
|
67
|
+
const relPath = path.relative(process.cwd(), filePath);
|
|
68
|
+
let schemas;
|
|
69
|
+
try {
|
|
70
|
+
schemas = await discoverSchemas(filePath, options?.cacheBust ? { cacheBust: true } : undefined);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
throw new Error(`Failed to load ${relPath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
74
|
+
}
|
|
75
|
+
if (schemas.length === 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const codegenResults = schemas.map((s) => {
|
|
79
|
+
const fallbackEntries = [];
|
|
80
|
+
const ir = extractSchema(s.schema, fallbackEntries);
|
|
81
|
+
const result = generateValidator(ir, s.exportName, {
|
|
82
|
+
fallbackCount: fallbackEntries.length,
|
|
83
|
+
});
|
|
84
|
+
return { exportName: s.exportName, codegenResult: result, fallbackEntries };
|
|
85
|
+
});
|
|
86
|
+
const outputPath = resolveOutputPath(filePath, outputFlag);
|
|
87
|
+
const sourceRelPath = path.relative(path.dirname(outputPath), filePath);
|
|
88
|
+
const content = generateCompiledFileContent(codegenResults, sourceRelPath);
|
|
89
|
+
await writeCompiledFile(outputPath, content);
|
|
90
|
+
return {
|
|
91
|
+
filePath,
|
|
92
|
+
outputPath,
|
|
93
|
+
schemaCount: schemas.length,
|
|
94
|
+
schemaNames: schemas.map((s) => s.exportName),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
56
97
|
export async function runGenerate(options) {
|
|
57
98
|
const files = await resolveInputFiles(options.inputs);
|
|
58
99
|
if (files.length === 0) {
|
|
@@ -62,34 +103,20 @@ export async function runGenerate(options) {
|
|
|
62
103
|
let totalSchemas = 0;
|
|
63
104
|
let totalFiles = 0;
|
|
64
105
|
for (const filePath of files) {
|
|
65
|
-
|
|
66
|
-
let schemas;
|
|
106
|
+
let result;
|
|
67
107
|
try {
|
|
68
|
-
|
|
108
|
+
result = await generateFile(filePath, options.output);
|
|
69
109
|
}
|
|
70
110
|
catch (err) {
|
|
71
|
-
logger.error(
|
|
111
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
72
112
|
process.exit(1);
|
|
73
113
|
}
|
|
74
|
-
if (
|
|
114
|
+
if (!result)
|
|
75
115
|
continue;
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const result = generateValidator(ir, s.exportName, {
|
|
81
|
-
fallbackCount: fallbackEntries.length,
|
|
82
|
-
});
|
|
83
|
-
return { exportName: s.exportName, codegenResult: result, fallbackEntries };
|
|
84
|
-
});
|
|
85
|
-
const outputPath = resolveOutputPath(filePath, options.output);
|
|
86
|
-
const outputRelPath = path.relative(process.cwd(), outputPath);
|
|
87
|
-
const sourceRelPath = path.relative(path.dirname(outputPath), filePath);
|
|
88
|
-
const content = generateCompiledFileContent(codegenResults, sourceRelPath);
|
|
89
|
-
await writeCompiledFile(outputPath, content);
|
|
90
|
-
const schemaNames = schemas.map((s) => s.exportName).join(", ");
|
|
91
|
-
logger.success(`${relPath} -> ${outputRelPath} (${schemaNames})`);
|
|
92
|
-
totalSchemas += schemas.length;
|
|
116
|
+
const relPath = path.relative(process.cwd(), result.filePath);
|
|
117
|
+
const outputRelPath = path.relative(process.cwd(), result.outputPath);
|
|
118
|
+
logger.success(`${relPath} -> ${outputRelPath} (${result.schemaNames.join(", ")})`);
|
|
119
|
+
totalSchemas += result.schemaCount;
|
|
93
120
|
totalFiles++;
|
|
94
121
|
}
|
|
95
122
|
if (totalFiles === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface WatchOptions {
|
|
2
|
+
inputs: string[];
|
|
3
|
+
output: string | undefined;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Check if a file path should trigger regeneration.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isWatchTarget(filePath: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Resolve which directories to watch from input paths.
|
|
11
|
+
* Files are mapped to their parent directory; subdirectories are deduplicated.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveWatchDirs(inputs: string[]): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Create a debounced version of a function.
|
|
16
|
+
*/
|
|
17
|
+
export declare function debounce<T extends (...args: never[]) => void>(fn: T, delayMs: number): T;
|
|
18
|
+
/**
|
|
19
|
+
* Run the watch mode: initial generate + fs.watch for changes.
|
|
20
|
+
*/
|
|
21
|
+
export declare function runWatch(options: WatchOptions): Promise<void>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAWA,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAwB3D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CASxF;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGnE"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { logger } from "../logger.js";
|
|
5
|
+
import { generateFile, isSchemaFile, resolveInputFiles, } from "./generate.js";
|
|
6
|
+
/**
|
|
7
|
+
* Check if a file path should trigger regeneration.
|
|
8
|
+
*/
|
|
9
|
+
export function isWatchTarget(filePath) {
|
|
10
|
+
if (filePath.includes("node_modules"))
|
|
11
|
+
return false;
|
|
12
|
+
return isSchemaFile(filePath);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve which directories to watch from input paths.
|
|
16
|
+
* Files are mapped to their parent directory; subdirectories are deduplicated.
|
|
17
|
+
*/
|
|
18
|
+
export function resolveWatchDirs(inputs) {
|
|
19
|
+
const dirs = [];
|
|
20
|
+
for (const input of inputs) {
|
|
21
|
+
const abs = path.resolve(input);
|
|
22
|
+
try {
|
|
23
|
+
const stat = fs.statSync(abs);
|
|
24
|
+
dirs.push(stat.isDirectory() ? abs : path.dirname(abs));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
dirs.push(path.dirname(abs));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Deduplicate: remove dirs that are subdirectories of another watched dir
|
|
31
|
+
const sorted = [...new Set(dirs)].sort();
|
|
32
|
+
const result = [];
|
|
33
|
+
for (const dir of sorted) {
|
|
34
|
+
const isSubdir = result.some((parent) => dir.startsWith(parent + path.sep));
|
|
35
|
+
if (!isSubdir) {
|
|
36
|
+
result.push(dir);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create a debounced version of a function.
|
|
43
|
+
*/
|
|
44
|
+
export function debounce(fn, delayMs) {
|
|
45
|
+
let timer;
|
|
46
|
+
return ((...args) => {
|
|
47
|
+
if (timer !== undefined)
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
timer = setTimeout(() => {
|
|
50
|
+
timer = undefined;
|
|
51
|
+
fn(...args);
|
|
52
|
+
}, delayMs);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Run the watch mode: initial generate + fs.watch for changes.
|
|
57
|
+
*/
|
|
58
|
+
export async function runWatch(options) {
|
|
59
|
+
const files = await resolveInputFiles(options.inputs);
|
|
60
|
+
if (files.length === 0) {
|
|
61
|
+
logger.warn("No source files found.");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Initial generation
|
|
65
|
+
let totalSchemas = 0;
|
|
66
|
+
let totalFiles = 0;
|
|
67
|
+
for (const filePath of files) {
|
|
68
|
+
try {
|
|
69
|
+
const result = await generateFile(filePath, options.output);
|
|
70
|
+
if (result) {
|
|
71
|
+
logResult(result);
|
|
72
|
+
totalSchemas += result.schemaCount;
|
|
73
|
+
totalFiles++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (totalFiles > 0) {
|
|
81
|
+
logger.info(`Generated ${totalSchemas} schema${totalSchemas > 1 ? "s" : ""} from ${totalFiles} file${totalFiles > 1 ? "s" : ""}.`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
logger.warn("No compile() calls found in any source file.");
|
|
85
|
+
}
|
|
86
|
+
// Set up file watching
|
|
87
|
+
const watchDirs = resolveWatchDirs(options.inputs);
|
|
88
|
+
const ac = new AbortController();
|
|
89
|
+
const pendingFiles = new Set();
|
|
90
|
+
const flush = debounce(async () => {
|
|
91
|
+
const batch = [...pendingFiles];
|
|
92
|
+
pendingFiles.clear();
|
|
93
|
+
for (const filePath of batch) {
|
|
94
|
+
try {
|
|
95
|
+
const result = await generateFile(filePath, options.output, { cacheBust: true });
|
|
96
|
+
if (result) {
|
|
97
|
+
logResult(result);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}, 150);
|
|
105
|
+
const watchers = [];
|
|
106
|
+
for (const dir of watchDirs) {
|
|
107
|
+
try {
|
|
108
|
+
const watcher = fs.watch(dir, { recursive: true, signal: ac.signal }, (_event, filename) => {
|
|
109
|
+
if (!filename)
|
|
110
|
+
return;
|
|
111
|
+
const fullPath = path.resolve(dir, filename);
|
|
112
|
+
if (isWatchTarget(fullPath)) {
|
|
113
|
+
pendingFiles.add(fullPath);
|
|
114
|
+
void flush();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
watchers.push(watcher);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
logger.error(`Failed to watch ${dir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (watchers.length === 0) {
|
|
124
|
+
logger.error("No directories could be watched.");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
logger.info(`Watching ${watchDirs.length} director${watchDirs.length > 1 ? "ies" : "y"} for changes... (Ctrl+C to stop)`);
|
|
128
|
+
// Graceful shutdown
|
|
129
|
+
const shutdown = () => {
|
|
130
|
+
logger.dim("\nStopping watch mode...");
|
|
131
|
+
ac.abort();
|
|
132
|
+
};
|
|
133
|
+
process.on("SIGINT", shutdown);
|
|
134
|
+
process.on("SIGTERM", shutdown);
|
|
135
|
+
// Keep process alive until aborted
|
|
136
|
+
await new Promise((resolve) => {
|
|
137
|
+
ac.signal.addEventListener("abort", () => {
|
|
138
|
+
process.removeListener("SIGINT", shutdown);
|
|
139
|
+
process.removeListener("SIGTERM", shutdown);
|
|
140
|
+
resolve();
|
|
141
|
+
}, { once: true });
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function logResult(result) {
|
|
145
|
+
const relPath = path.relative(process.cwd(), result.filePath);
|
|
146
|
+
const outputRelPath = path.relative(process.cwd(), result.outputPath);
|
|
147
|
+
logger.success(`${relPath} -> ${outputRelPath} (${result.schemaNames.join(", ")})`);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -10,7 +10,7 @@ function printUsage() {
|
|
|
10
10
|
zod-aot v${VERSION} — Compile Zod schemas into zero-overhead validation functions
|
|
11
11
|
|
|
12
12
|
Usage:
|
|
13
|
-
zod-aot generate <files...> [-o <output>]
|
|
13
|
+
zod-aot generate <files...> [-o <output>] [-w]
|
|
14
14
|
zod-aot check <files...>
|
|
15
15
|
|
|
16
16
|
Commands:
|
|
@@ -19,13 +19,14 @@ Commands:
|
|
|
19
19
|
|
|
20
20
|
Options:
|
|
21
21
|
-o, --output <path> Output file or directory
|
|
22
|
+
-w, --watch Watch for changes and regenerate
|
|
22
23
|
-h, --help Show this help message
|
|
23
24
|
-v, --version Show version number
|
|
24
25
|
|
|
25
26
|
Examples:
|
|
26
27
|
zod-aot generate src/schemas.ts
|
|
27
28
|
zod-aot generate src/schemas.ts -o src/schemas.compiled.ts
|
|
28
|
-
zod-aot generate src/
|
|
29
|
+
zod-aot generate src/ --watch
|
|
29
30
|
zod-aot check src/schemas.ts
|
|
30
31
|
`.trim());
|
|
31
32
|
}
|
|
@@ -42,6 +43,7 @@ function parseArgs(argv) {
|
|
|
42
43
|
if (command === "generate") {
|
|
43
44
|
const inputs = [];
|
|
44
45
|
let output;
|
|
46
|
+
let watch = false;
|
|
45
47
|
for (let i = 0; i < rest.length; i++) {
|
|
46
48
|
const arg = rest[i];
|
|
47
49
|
if (arg === "-o" || arg === "--output") {
|
|
@@ -53,6 +55,9 @@ function parseArgs(argv) {
|
|
|
53
55
|
}
|
|
54
56
|
output = val;
|
|
55
57
|
}
|
|
58
|
+
else if (arg === "-w" || arg === "--watch") {
|
|
59
|
+
watch = true;
|
|
60
|
+
}
|
|
56
61
|
else if (arg.startsWith("-")) {
|
|
57
62
|
logger.error(`Unknown option: ${arg}`);
|
|
58
63
|
process.exit(1);
|
|
@@ -65,7 +70,7 @@ function parseArgs(argv) {
|
|
|
65
70
|
logger.error("No input files specified. Run 'zod-aot --help' for usage.");
|
|
66
71
|
process.exit(1);
|
|
67
72
|
}
|
|
68
|
-
return { kind: "generate", options: { inputs, output } };
|
|
73
|
+
return { kind: "generate", options: { inputs, output, watch } };
|
|
69
74
|
}
|
|
70
75
|
if (command === "check") {
|
|
71
76
|
const inputs = rest.filter((arg) => {
|
|
@@ -95,8 +100,14 @@ async function main() {
|
|
|
95
100
|
console.log(VERSION);
|
|
96
101
|
break;
|
|
97
102
|
case "generate": {
|
|
98
|
-
|
|
99
|
-
|
|
103
|
+
if (command.options.watch) {
|
|
104
|
+
const { runWatch } = await import("./commands/watch.js");
|
|
105
|
+
await runWatch(command.options);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const { runGenerate } = await import("./commands/generate.js");
|
|
109
|
+
await runGenerate(command.options);
|
|
110
|
+
}
|
|
100
111
|
break;
|
|
101
112
|
}
|
|
102
113
|
case "check": {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,OAAO,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|