zod-aot 0.0.3 → 0.0.5

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.
Files changed (70) hide show
  1. package/README.md +102 -54
  2. package/dist/cli/commands/check.d.ts +6 -0
  3. package/dist/cli/commands/check.d.ts.map +1 -0
  4. package/dist/cli/commands/check.js +97 -0
  5. package/dist/cli/commands/check.js.map +1 -0
  6. package/dist/cli/commands/generate.d.ts +7 -0
  7. package/dist/cli/commands/generate.d.ts.map +1 -0
  8. package/dist/cli/commands/generate.js +99 -0
  9. package/dist/cli/commands/generate.js.map +1 -0
  10. package/dist/cli/discovery.d.ts +11 -0
  11. package/dist/cli/discovery.d.ts.map +1 -0
  12. package/dist/cli/discovery.js +17 -0
  13. package/dist/cli/discovery.js.map +1 -0
  14. package/dist/cli/emitter.d.ts +19 -0
  15. package/dist/cli/emitter.d.ts.map +1 -0
  16. package/dist/cli/emitter.js +77 -0
  17. package/dist/cli/emitter.js.map +1 -0
  18. package/dist/cli/index.d.ts +3 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +111 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/loader.d.ts +11 -0
  23. package/dist/cli/loader.d.ts.map +1 -0
  24. package/dist/cli/loader.js +52 -0
  25. package/dist/cli/loader.js.map +1 -0
  26. package/dist/cli/logger.d.ts +8 -0
  27. package/dist/cli/logger.d.ts.map +1 -0
  28. package/dist/cli/logger.js +33 -0
  29. package/dist/cli/logger.js.map +1 -0
  30. package/dist/codegen/context.d.ts +5 -0
  31. package/dist/codegen/context.d.ts.map +1 -1
  32. package/dist/codegen/context.js +11 -0
  33. package/dist/codegen/context.js.map +1 -1
  34. package/dist/compile.d.ts +14 -0
  35. package/dist/compile.d.ts.map +1 -0
  36. package/dist/compile.js +21 -0
  37. package/dist/compile.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/unplugin/esbuild.d.ts +3 -0
  43. package/dist/unplugin/esbuild.d.ts.map +1 -0
  44. package/dist/unplugin/esbuild.js +3 -0
  45. package/dist/unplugin/esbuild.js.map +1 -0
  46. package/dist/unplugin/index.d.ts +4 -0
  47. package/dist/unplugin/index.d.ts.map +1 -0
  48. package/dist/unplugin/index.js +19 -0
  49. package/dist/unplugin/index.js.map +1 -0
  50. package/dist/unplugin/rollup.d.ts +3 -0
  51. package/dist/unplugin/rollup.d.ts.map +1 -0
  52. package/dist/unplugin/rollup.js +3 -0
  53. package/dist/unplugin/rollup.js.map +1 -0
  54. package/dist/unplugin/transform.d.ts +26 -0
  55. package/dist/unplugin/transform.d.ts.map +1 -0
  56. package/dist/unplugin/transform.js +134 -0
  57. package/dist/unplugin/transform.js.map +1 -0
  58. package/dist/unplugin/types.d.ts +7 -0
  59. package/dist/unplugin/types.d.ts.map +1 -0
  60. package/dist/unplugin/types.js +2 -0
  61. package/dist/unplugin/types.js.map +1 -0
  62. package/dist/unplugin/vite.d.ts +3 -0
  63. package/dist/unplugin/vite.d.ts.map +1 -0
  64. package/dist/unplugin/vite.js +3 -0
  65. package/dist/unplugin/vite.js.map +1 -0
  66. package/dist/unplugin/webpack.d.ts +3 -0
  67. package/dist/unplugin/webpack.d.ts.map +1 -0
  68. package/dist/unplugin/webpack.js +3 -0
  69. package/dist/unplugin/webpack.js.map +1 -0
  70. package/package.json +39 -4
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env node
2
+ import process from "node:process";
3
+ import { logger } from "./logger.js";
4
+ const VERSION = "0.0.3";
5
+ function printUsage() {
6
+ // biome-ignore lint/suspicious/noConsole: CLI output
7
+ console.log(`
8
+ zod-aot v${VERSION} — Compile Zod schemas into zero-overhead validation functions
9
+
10
+ Usage:
11
+ zod-aot generate <files...> [-o <output>]
12
+ zod-aot check <files...>
13
+
14
+ Commands:
15
+ generate Generate optimized validation code from compile() calls
16
+ check Check if schemas are compilable (dry-run)
17
+
18
+ Options:
19
+ -o, --output <path> Output file or directory
20
+ -h, --help Show this help message
21
+ -v, --version Show version number
22
+
23
+ Examples:
24
+ zod-aot generate src/schemas.ts
25
+ zod-aot generate src/schemas.ts -o src/schemas.compiled.ts
26
+ zod-aot generate src/
27
+ zod-aot check src/schemas.ts
28
+ `.trim());
29
+ }
30
+ function parseArgs(argv) {
31
+ const args = argv.slice(2);
32
+ if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
33
+ return { kind: "help" };
34
+ }
35
+ if (args.includes("--version") || args.includes("-v")) {
36
+ return { kind: "version" };
37
+ }
38
+ const command = args[0];
39
+ const rest = args.slice(1);
40
+ if (command === "generate") {
41
+ const inputs = [];
42
+ let output;
43
+ for (let i = 0; i < rest.length; i++) {
44
+ const arg = rest[i];
45
+ if (arg === "-o" || arg === "--output") {
46
+ i++;
47
+ const val = rest[i];
48
+ if (!val) {
49
+ logger.error("Missing value for --output");
50
+ process.exit(1);
51
+ }
52
+ output = val;
53
+ }
54
+ else if (arg.startsWith("-")) {
55
+ logger.error(`Unknown option: ${arg}`);
56
+ process.exit(1);
57
+ }
58
+ else {
59
+ inputs.push(arg);
60
+ }
61
+ }
62
+ if (inputs.length === 0) {
63
+ logger.error("No input files specified. Run 'zod-aot --help' for usage.");
64
+ process.exit(1);
65
+ }
66
+ return { kind: "generate", options: { inputs, output } };
67
+ }
68
+ if (command === "check") {
69
+ const inputs = rest.filter((arg) => {
70
+ if (arg.startsWith("-")) {
71
+ logger.error(`Unknown option: ${arg}`);
72
+ process.exit(1);
73
+ }
74
+ return true;
75
+ });
76
+ if (inputs.length === 0) {
77
+ logger.error("No input files specified. Run 'zod-aot --help' for usage.");
78
+ process.exit(1);
79
+ }
80
+ return { kind: "check", options: { inputs } };
81
+ }
82
+ logger.error(`Unknown command: ${command}. Run 'zod-aot --help' for usage.`);
83
+ process.exit(1);
84
+ }
85
+ async function main() {
86
+ const command = parseArgs(process.argv);
87
+ switch (command.kind) {
88
+ case "help":
89
+ printUsage();
90
+ break;
91
+ case "version":
92
+ // biome-ignore lint/suspicious/noConsole: CLI output
93
+ console.log(VERSION);
94
+ break;
95
+ case "generate": {
96
+ const { runGenerate } = await import("./commands/generate.js");
97
+ await runGenerate(command.options);
98
+ break;
99
+ }
100
+ case "check": {
101
+ const { runCheck } = await import("./commands/check.js");
102
+ await runCheck(command.options);
103
+ break;
104
+ }
105
+ }
106
+ }
107
+ void main().catch((err) => {
108
+ logger.error(err instanceof Error ? err.message : String(err));
109
+ process.exit(1);
110
+ });
111
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,GAAG,OAAO,CAAC;AAiBxB,SAAS,UAAU;IACjB,qDAAqD;IACrD,OAAO,CAAC,GAAG,CACT;WACO,OAAO;;;;;;;;;;;;;;;;;;;;CAoBjB,CAAC,IAAI,EAAE,CACL,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,MAA0B,CAAC;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;YAC9B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBACvC,CAAC,EAAE,CAAC;gBACJ,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,GAAG,GAAG,CAAC;YACf,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,mCAAmC,CAAC,CAAC;IAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,UAAU,EAAE,CAAC;YACb,MAAM;QACR,KAAK,SAAS;YACZ,qDAAqD;YACrD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAC/D,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACzD,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACjC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface LoadOptions {
2
+ /** Append a cache-busting query parameter to bypass Node.js module cache (useful for HMR). */
3
+ cacheBust?: boolean;
4
+ }
5
+ /**
6
+ * Dynamically import a source file (.ts or .js).
7
+ * - Bun/Deno: native TypeScript support, direct import
8
+ * - Node.js: uses tsx's register API for TypeScript files
9
+ */
10
+ export declare function loadSourceFile(filePath: string, options?: LoadOptions): Promise<Record<string, unknown>>;
11
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/cli/loader.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,8FAA8F;IAC9F,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkBlC"}
@@ -0,0 +1,52 @@
1
+ import path from "node:path";
2
+ import { pathToFileURL } from "node:url";
3
+ function detectRuntime() {
4
+ if ("Bun" in globalThis)
5
+ return "bun";
6
+ if ("Deno" in globalThis)
7
+ return "deno";
8
+ return "node";
9
+ }
10
+ /**
11
+ * Dynamically import a source file (.ts or .js).
12
+ * - Bun/Deno: native TypeScript support, direct import
13
+ * - Node.js: uses tsx's register API for TypeScript files
14
+ */
15
+ export async function loadSourceFile(filePath, options) {
16
+ const absPath = path.resolve(filePath);
17
+ const ext = path.extname(absPath);
18
+ const runtime = detectRuntime();
19
+ const suffix = options?.cacheBust ? `?t=${Date.now()}` : "";
20
+ // Bun and Deno can import TypeScript natively
21
+ if (runtime === "bun" || runtime === "deno") {
22
+ return (await import(pathToFileURL(absPath).href + suffix));
23
+ }
24
+ // Node.js: TypeScript files need tsx
25
+ if (ext === ".ts" || ext === ".tsx" || ext === ".mts") {
26
+ return loadTypeScriptFileWithTsx(absPath, suffix);
27
+ }
28
+ // Node.js: .js / .mjs — direct import
29
+ return (await import(pathToFileURL(absPath).href + suffix));
30
+ }
31
+ async function loadTypeScriptFileWithTsx(absPath, suffix = "") {
32
+ let tsxModule;
33
+ try {
34
+ // Dynamic import — tsx may or may not be installed
35
+ // Use variable to prevent TypeScript from resolving the module statically
36
+ const tsxSpecifier = "tsx/esm/api";
37
+ tsxModule = (await import(tsxSpecifier));
38
+ }
39
+ catch {
40
+ throw new Error(`Cannot load TypeScript file without tsx.\n` +
41
+ `Install it: npm install -D tsx\n` +
42
+ `File: ${absPath}`);
43
+ }
44
+ const unregister = tsxModule.register();
45
+ try {
46
+ return (await import(pathToFileURL(absPath).href + suffix));
47
+ }
48
+ finally {
49
+ unregister();
50
+ }
51
+ }
52
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/cli/loader.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,SAAS,aAAa;IACpB,IAAI,KAAK,IAAI,UAAU;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,MAAM,IAAI,UAAU;QAAE,OAAO,MAAM,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,OAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5D,8CAA8C;IAC9C,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAA4B,CAAC;IACzF,CAAC;IAED,qCAAqC;IACrC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACtD,OAAO,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,sCAAsC;IACtC,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAA4B,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,OAAe,EACf,MAAM,GAAG,EAAE;IAEX,IAAI,SAAyC,CAAC;IAC9C,IAAI,CAAC;QACH,mDAAmD;QACnD,0EAA0E;QAC1E,MAAM,YAAY,GAAG,aAAa,CAAC;QACnC,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAqB,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,4CAA4C;YAC1C,kCAAkC;YAClC,SAAS,OAAO,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAA4B,CAAC;IACzF,CAAC;YAAS,CAAC;QACT,UAAU,EAAE,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const logger: {
2
+ info(msg: string): void;
3
+ success(msg: string): void;
4
+ warn(msg: string): void;
5
+ error(msg: string): void;
6
+ dim(msg: string): void;
7
+ };
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/cli/logger.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,MAAM;cACP,MAAM,GAAG,IAAI;iBAGV,MAAM,GAAG,IAAI;cAGhB,MAAM,GAAG,IAAI;eAGZ,MAAM,GAAG,IAAI;aAGf,MAAM,GAAG,IAAI;CAGvB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import process from "node:process";
2
+ const isTTY = process.stdout.isTTY === true;
3
+ const colors = {
4
+ reset: isTTY ? "\x1b[0m" : "",
5
+ red: isTTY ? "\x1b[31m" : "",
6
+ green: isTTY ? "\x1b[32m" : "",
7
+ yellow: isTTY ? "\x1b[33m" : "",
8
+ cyan: isTTY ? "\x1b[36m" : "",
9
+ dim: isTTY ? "\x1b[2m" : "",
10
+ bold: isTTY ? "\x1b[1m" : "",
11
+ };
12
+ // biome-ignore lint/suspicious/noConsole: CLI output
13
+ const log = console.log;
14
+ // biome-ignore lint/suspicious/noConsole: CLI output
15
+ const logError = console.error;
16
+ export const logger = {
17
+ info(msg) {
18
+ log(`${colors.cyan}info${colors.reset} ${msg}`);
19
+ },
20
+ success(msg) {
21
+ log(`${colors.green}done${colors.reset} ${msg}`);
22
+ },
23
+ warn(msg) {
24
+ logError(`${colors.yellow}warn${colors.reset} ${msg}`);
25
+ },
26
+ error(msg) {
27
+ logError(`${colors.red}error${colors.reset} ${msg}`);
28
+ },
29
+ dim(msg) {
30
+ log(`${colors.dim}${msg}${colors.reset}`);
31
+ },
32
+ };
33
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/cli/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AAE5C,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAC7B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC5B,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC9B,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC/B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IAC7B,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAC3B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;CAC7B,CAAC;AAEF,qDAAqD;AACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;AACxB,qDAAqD;AACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;AAE/B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,CAAC,GAAW;QACd,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,GAAW;QACjB,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,GAAW;QACd,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,CAAC,GAAW;QACf,QAAQ,CAAC,GAAG,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,GAAG,CAAC,GAAW;QACb,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC"}
@@ -10,4 +10,9 @@ export interface CodeGenContext {
10
10
  export type GenerateValidationFn = (ir: SchemaIR, inputExpr: string, pathExpr: string, issuesVar: string, ctx: CodeGenContext) => string;
11
11
  export declare const EMAIL_REGEX_SOURCE: string;
12
12
  export declare function escapeString(s: string): string;
13
+ /**
14
+ * Extract the function name from a generated function definition string.
15
+ * e.g. "function safeParse_User(input){..." -> "safeParse_User"
16
+ */
17
+ export declare function extractFunctionName(functionDef: string): string;
13
18
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/codegen/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,cAAc,KAChB,MAAM,CAAC;AAGZ,eAAO,MAAM,kBAAkB,QAA+G,CAAC;AAE/I,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/codegen/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,cAAc,KAChB,MAAM,CAAC;AAGZ,eAAO,MAAM,kBAAkB,QAA+G,CAAC;AAE/I,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM/D"}
@@ -3,4 +3,15 @@ export const EMAIL_REGEX_SOURCE = String.raw `^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\
3
3
  export function escapeString(s) {
4
4
  return JSON.stringify(s);
5
5
  }
6
+ /**
7
+ * Extract the function name from a generated function definition string.
8
+ * e.g. "function safeParse_User(input){..." -> "safeParse_User"
9
+ */
10
+ export function extractFunctionName(functionDef) {
11
+ const match = /^function\s+(\w+)\s*\(/.exec(functionDef);
12
+ if (!match?.[1]) {
13
+ throw new Error("Cannot extract function name from generated code");
14
+ }
15
+ return match[1];
16
+ }
6
17
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/codegen/context.ts"],"names":[],"mappings":"AAoBA,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAA,kGAAkG,CAAC;AAE/I,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/codegen/context.ts"],"names":[],"mappings":"AAoBA,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAA,kGAAkG,CAAC;AAE/I,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { CompiledSchema } from "./types.js";
2
+ /**
3
+ * Compile a Zod schema into an optimized validator.
4
+ *
5
+ * At dev-time, falls back to Zod's runtime validation.
6
+ * After `npx zod-aot generate`, import from the `.compiled.ts` file instead.
7
+ */
8
+ export declare function compile<T>(zodSchema: unknown): CompiledSchema<T>;
9
+ /**
10
+ * Check if a value is a CompiledSchema created by compile().
11
+ * Used by the CLI to discover schemas in source files.
12
+ */
13
+ export declare function isCompiledSchema(value: unknown): value is CompiledSchema<unknown>;
14
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAIhE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAEjF"}
@@ -0,0 +1,21 @@
1
+ import { createFallback } from "./runtime.js";
2
+ const COMPILED_MARKER = Symbol.for("zod-aot:compiled");
3
+ /**
4
+ * Compile a Zod schema into an optimized validator.
5
+ *
6
+ * At dev-time, falls back to Zod's runtime validation.
7
+ * After `npx zod-aot generate`, import from the `.compiled.ts` file instead.
8
+ */
9
+ export function compile(zodSchema) {
10
+ const result = createFallback(zodSchema);
11
+ Object.defineProperty(result, COMPILED_MARKER, { value: true, enumerable: false });
12
+ return result;
13
+ }
14
+ /**
15
+ * Check if a value is a CompiledSchema created by compile().
16
+ * Used by the CLI to discover schemas in source files.
17
+ */
18
+ export function isCompiledSchema(value) {
19
+ return typeof value === "object" && value !== null && COMPILED_MARKER in value;
20
+ }
21
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAI,SAAkB;IAC3C,MAAM,MAAM,GAAG,cAAc,CAAI,SAAS,CAAC,CAAC;IAC5C,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,eAAe,IAAI,KAAK,CAAC;AACjF,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export type { CodeGenResult } from "./codegen/index.js";
2
2
  export { generateValidator } from "./codegen/index.js";
3
+ export { compile, isCompiledSchema } from "./compile.js";
3
4
  export { extractSchema } from "./extractor/index.js";
4
5
  export { createFallback } from "./runtime.js";
5
6
  export type { CheckIR, CompiledSchema, DateCheckIR, SafeParseError, SafeParseResult, SafeParseSuccess, SchemaIR, ZodErrorLike, ZodIssueLike, } from "./types.js";
7
+ export { unplugin } from "./unplugin/index.js";
8
+ export type { ZodAotPluginOptions } from "./unplugin/types.js";
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export { generateValidator } from "./codegen/index.js";
2
+ export { compile, isCompiledSchema } from "./compile.js";
2
3
  export { extractSchema } from "./extractor/index.js";
3
4
  export { createFallback } from "./runtime.js";
5
+ export { unplugin } from "./unplugin/index.js";
4
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAY9C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: (options?: import("./types.js").ZodAotPluginOptions | undefined) => import("unplugin").EsbuildPlugin;
2
+ export default _default;
3
+ //# sourceMappingURL=esbuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esbuild.d.ts","sourceRoot":"","sources":["../../src/unplugin/esbuild.ts"],"names":[],"mappings":";AAEA,wBAAgC"}
@@ -0,0 +1,3 @@
1
+ import { unplugin } from "./index.js";
2
+ export default unplugin.esbuild;
3
+ //# sourceMappingURL=esbuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esbuild.js","sourceRoot":"","sources":["../../src/unplugin/esbuild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,eAAe,QAAQ,CAAC,OAAO,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ZodAotPluginOptions } from "./types.js";
2
+ export declare const unplugin: import("unplugin").UnpluginInstance<ZodAotPluginOptions | undefined, boolean>;
3
+ export type { ZodAotPluginOptions } from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/unplugin/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,QAAQ,+EAgBlB,CAAC;AAEJ,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { createUnplugin } from "unplugin";
2
+ import { shouldTransform, transformCode } from "./transform.js";
3
+ export const unplugin = createUnplugin((options) => ({
4
+ name: "zod-aot",
5
+ enforce: "pre",
6
+ transformInclude(id) {
7
+ return shouldTransform(id, options);
8
+ },
9
+ async transform(code, id) {
10
+ // Quick bail-out before doing any work
11
+ if (!code.includes("zod-aot") || !code.includes("compile"))
12
+ return;
13
+ const result = await transformCode(code, id);
14
+ if (!result)
15
+ return;
16
+ return { code: result, map: null };
17
+ },
18
+ }));
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/unplugin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGhE,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,OAA6B,EAAE,EAAE,CAAC,CAAC;IACzE,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAc;IAEvB,gBAAgB,CAAC,EAAU;QACzB,OAAO,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,EAAU;QACtC,uCAAuC;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO;QAEnE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;CACF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: (options?: import("./types.js").ZodAotPluginOptions | undefined) => import("rollup").Plugin<any> | import("rollup").Plugin<any>[];
2
+ export default _default;
3
+ //# sourceMappingURL=rollup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollup.d.ts","sourceRoot":"","sources":["../../src/unplugin/rollup.ts"],"names":[],"mappings":";AAEA,wBAA+B"}
@@ -0,0 +1,3 @@
1
+ import { unplugin } from "./index.js";
2
+ export default unplugin.rollup;
3
+ //# sourceMappingURL=rollup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollup.js","sourceRoot":"","sources":["../../src/unplugin/rollup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,eAAe,QAAQ,CAAC,MAAM,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { CodeGenResult } from "../codegen/context.js";
2
+ import type { ZodAotPluginOptions } from "./types.js";
3
+ interface CompiledSchemaInfo {
4
+ exportName: string;
5
+ codegenResult: CodeGenResult;
6
+ }
7
+ /**
8
+ * Check if a file should be transformed by the plugin.
9
+ */
10
+ export declare function shouldTransform(id: string, options?: ZodAotPluginOptions): boolean;
11
+ /**
12
+ * Transform source code by replacing compile() calls with optimized validators.
13
+ * Returns the transformed code or null if no transformation was needed.
14
+ */
15
+ export declare function transformCode(code: string, id: string): Promise<string | null>;
16
+ /**
17
+ * Rewrite source code by replacing compile() calls with IIFE-wrapped optimized validators.
18
+ */
19
+ export declare function rewriteSource(code: string, schemas: CompiledSchemaInfo[]): string;
20
+ /**
21
+ * Remove the `compile` binding from `import { compile, ... } from "zod-aot"` statements.
22
+ * If `compile` is the only import, the entire import line is removed.
23
+ */
24
+ export declare function removeCompileImport(code: string): string;
25
+ export {};
26
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/unplugin/transform.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAUlF;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBpF;AA4CD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAyBjF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAaxD"}
@@ -0,0 +1,134 @@
1
+ import { discoverSchemas } from "../cli/discovery.js";
2
+ import { extractFunctionName } from "../codegen/context.js";
3
+ import { generateValidator } from "../codegen/index.js";
4
+ import { extractSchema } from "../extractor/index.js";
5
+ /**
6
+ * Check if a file should be transformed by the plugin.
7
+ */
8
+ export function shouldTransform(id, options) {
9
+ if (!/\.[cm]?[jt]sx?$/.test(id))
10
+ return false;
11
+ if (id.includes("node_modules"))
12
+ return false;
13
+ if (id.endsWith(".d.ts"))
14
+ return false;
15
+ if (id.endsWith(".compiled.ts") || id.endsWith(".compiled.js"))
16
+ return false;
17
+ if (options?.exclude?.some((pattern) => id.includes(pattern)))
18
+ return false;
19
+ if (options?.include && !options.include.some((pattern) => id.includes(pattern)))
20
+ return false;
21
+ return true;
22
+ }
23
+ /**
24
+ * Transform source code by replacing compile() calls with optimized validators.
25
+ * Returns the transformed code or null if no transformation was needed.
26
+ */
27
+ export async function transformCode(code, id) {
28
+ // Quick check: source must reference both "zod-aot" and "compile"
29
+ if (!code.includes("zod-aot") || !code.includes("compile"))
30
+ return null;
31
+ // Discover compiled schemas by executing the file (with cache busting for HMR)
32
+ let schemas;
33
+ try {
34
+ schemas = await discoverSchemas(id, { cacheBust: true });
35
+ }
36
+ catch (e) {
37
+ const msg = e instanceof Error ? e.message : String(e);
38
+ throw new Error(`[zod-aot] Failed to load schemas from ${id}: ${msg}`);
39
+ }
40
+ if (schemas.length === 0)
41
+ return null;
42
+ // For each schema, run the compilation pipeline
43
+ const compiled = [];
44
+ for (const s of schemas) {
45
+ const ir = extractSchema(s.schema);
46
+ const result = generateValidator(ir, s.exportName);
47
+ compiled.push({ exportName: s.exportName, codegenResult: result });
48
+ }
49
+ return rewriteSource(code, compiled);
50
+ }
51
+ /**
52
+ * Generate an IIFE that replaces a compile() call with inline optimized code.
53
+ */
54
+ function generateInlineReplacement(schemaArgName, codegenResult) {
55
+ const fnName = extractFunctionName(codegenResult.functionName);
56
+ // Collect preamble lines (skip empty and marker)
57
+ const preambleLines = codegenResult.code
58
+ .split("\n")
59
+ .filter((l) => l.trim() !== "" && l.trim() !== "/* zod-aot */");
60
+ const preambleStr = preambleLines.length > 0 ? `${preambleLines.join("\n")}\n` : "";
61
+ return [
62
+ "/* @__PURE__ */ (() => {",
63
+ preambleStr + codegenResult.functionName,
64
+ "return {",
65
+ `parse(input){const r=${fnName}(input);if(r.success)return r.data;throw Object.assign(new Error("Validation failed"),r.error);},`,
66
+ `safeParse:${fnName},`,
67
+ `is(input){return ${fnName}(input).success;},`,
68
+ `schema:${schemaArgName},`,
69
+ "};",
70
+ "})()",
71
+ ].join("\n");
72
+ }
73
+ /**
74
+ * Find the matching closing parenthesis for a compile() call,
75
+ * handling nested parentheses like compile(z.object({...})).
76
+ * Returns the index of the closing ')' or -1 if not found.
77
+ */
78
+ function findMatchingParen(code, openIndex) {
79
+ let depth = 1;
80
+ for (let i = openIndex + 1; i < code.length; i++) {
81
+ if (code[i] === "(")
82
+ depth++;
83
+ else if (code[i] === ")") {
84
+ depth--;
85
+ if (depth === 0)
86
+ return i;
87
+ }
88
+ }
89
+ return -1;
90
+ }
91
+ /**
92
+ * Rewrite source code by replacing compile() calls with IIFE-wrapped optimized validators.
93
+ */
94
+ export function rewriteSource(code, schemas) {
95
+ let result = code;
96
+ for (const schema of schemas) {
97
+ // Match: <exportName> = compile<...>( with word boundary to prevent substring matches
98
+ const prefixPattern = new RegExp(`(\\b${schema.exportName}\\s*=\\s*)compile\\s*(?:<[^>]*(?:<[^>]*>[^>]*)?>)?\\s*\\(`);
99
+ const match = prefixPattern.exec(result);
100
+ if (!match)
101
+ continue;
102
+ // Find the matching closing paren (handles nested parens)
103
+ const openParenIndex = match.index + match[0].length - 1;
104
+ const closeParenIndex = findMatchingParen(result, openParenIndex);
105
+ if (closeParenIndex === -1)
106
+ continue;
107
+ const schemaArgName = result.slice(openParenIndex + 1, closeParenIndex).trim();
108
+ const prefix = match[1] ?? "";
109
+ const fullMatch = result.slice(match.index, closeParenIndex + 1);
110
+ const replacement = prefix + generateInlineReplacement(schemaArgName, schema.codegenResult);
111
+ result = result.replace(fullMatch, replacement);
112
+ }
113
+ result = removeCompileImport(result);
114
+ return result;
115
+ }
116
+ /**
117
+ * Remove the `compile` binding from `import { compile, ... } from "zod-aot"` statements.
118
+ * If `compile` is the only import, the entire import line is removed.
119
+ */
120
+ export function removeCompileImport(code) {
121
+ // Match: import { ... } from "zod-aot" or 'zod-aot'
122
+ const importPattern = /import\s*\{([^}]*)\}\s*from\s*["']zod-aot["'];?/g;
123
+ return code.replace(importPattern, (_match, imports) => {
124
+ const names = imports
125
+ .split(",")
126
+ .map((n) => n.trim())
127
+ .filter(Boolean);
128
+ const remaining = names.filter((n) => n !== "compile");
129
+ if (remaining.length === 0)
130
+ return "";
131
+ return `import { ${remaining.join(", ")} } from "zod-aot";`;
132
+ });
133
+ }
134
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/unplugin/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ZodAotPluginOptions {
2
+ /** Glob patterns to include (default: ["**\/*.ts", "**\/*.tsx"]) */
3
+ include?: string[];
4
+ /** Glob patterns to exclude (default: ["node_modules/**", "**\/*.d.ts"]) */
5
+ exclude?: string[];
6
+ }
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/unplugin/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/unplugin/types.ts"],"names":[],"mappings":""}