zinfer 0.0.1 → 0.1.2

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 (79) hide show
  1. package/README.md +477 -28
  2. package/bin/zinfer +2 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +486 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/brand-detector.d.ts +32 -0
  8. package/dist/core/brand-detector.d.ts.map +1 -0
  9. package/dist/core/brand-detector.js +121 -0
  10. package/dist/core/brand-detector.js.map +1 -0
  11. package/dist/core/config-loader.d.ts +87 -0
  12. package/dist/core/config-loader.d.ts.map +1 -0
  13. package/dist/core/config-loader.js +105 -0
  14. package/dist/core/config-loader.js.map +1 -0
  15. package/dist/core/description-extractor.d.ts +54 -0
  16. package/dist/core/description-extractor.d.ts.map +1 -0
  17. package/dist/core/description-extractor.js +180 -0
  18. package/dist/core/description-extractor.js.map +1 -0
  19. package/dist/core/errors.d.ts +35 -0
  20. package/dist/core/errors.d.ts.map +1 -0
  21. package/dist/core/errors.js +96 -0
  22. package/dist/core/errors.js.map +1 -0
  23. package/dist/core/extractor.d.ts +121 -0
  24. package/dist/core/extractor.d.ts.map +1 -0
  25. package/dist/core/extractor.js +504 -0
  26. package/dist/core/extractor.js.map +1 -0
  27. package/dist/core/file-resolver.d.ts +41 -0
  28. package/dist/core/file-resolver.d.ts.map +1 -0
  29. package/dist/core/file-resolver.js +95 -0
  30. package/dist/core/file-resolver.js.map +1 -0
  31. package/dist/core/getter-resolver.d.ts +67 -0
  32. package/dist/core/getter-resolver.d.ts.map +1 -0
  33. package/dist/core/getter-resolver.js +234 -0
  34. package/dist/core/getter-resolver.js.map +1 -0
  35. package/dist/core/import-resolver.d.ts +51 -0
  36. package/dist/core/import-resolver.d.ts.map +1 -0
  37. package/dist/core/import-resolver.js +158 -0
  38. package/dist/core/import-resolver.js.map +1 -0
  39. package/dist/core/index.d.ts +14 -0
  40. package/dist/core/index.d.ts.map +1 -0
  41. package/dist/core/index.js +13 -0
  42. package/dist/core/index.js.map +1 -0
  43. package/dist/core/logger.d.ts +20 -0
  44. package/dist/core/logger.d.ts.map +1 -0
  45. package/dist/core/logger.js +36 -0
  46. package/dist/core/logger.js.map +1 -0
  47. package/dist/core/name-mapper.d.ts +45 -0
  48. package/dist/core/name-mapper.d.ts.map +1 -0
  49. package/dist/core/name-mapper.js +82 -0
  50. package/dist/core/name-mapper.js.map +1 -0
  51. package/dist/core/normalizer.d.ts +24 -0
  52. package/dist/core/normalizer.d.ts.map +1 -0
  53. package/dist/core/normalizer.js +50 -0
  54. package/dist/core/normalizer.js.map +1 -0
  55. package/dist/core/schema-detector.d.ts +49 -0
  56. package/dist/core/schema-detector.d.ts.map +1 -0
  57. package/dist/core/schema-detector.js +272 -0
  58. package/dist/core/schema-detector.js.map +1 -0
  59. package/dist/core/schema-reference-analyzer.d.ts +77 -0
  60. package/dist/core/schema-reference-analyzer.d.ts.map +1 -0
  61. package/dist/core/schema-reference-analyzer.js +269 -0
  62. package/dist/core/schema-reference-analyzer.js.map +1 -0
  63. package/dist/core/test-generator.d.ts +97 -0
  64. package/dist/core/test-generator.d.ts.map +1 -0
  65. package/dist/core/test-generator.js +177 -0
  66. package/dist/core/test-generator.js.map +1 -0
  67. package/dist/core/type-printer.d.ts +46 -0
  68. package/dist/core/type-printer.d.ts.map +1 -0
  69. package/dist/core/type-printer.js +519 -0
  70. package/dist/core/type-printer.js.map +1 -0
  71. package/dist/core/types.d.ts +124 -0
  72. package/dist/core/types.d.ts.map +1 -0
  73. package/dist/core/types.js +5 -0
  74. package/dist/core/types.js.map +1 -0
  75. package/dist/index.d.ts +66 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +79 -0
  78. package/dist/index.js.map +1 -0
  79. package/package.json +63 -7
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Detects Zod schemas in TypeScript source files.
3
+ */
4
+ export class SchemaDetector {
5
+ /**
6
+ * Detects all Zod schemas in a source file.
7
+ *
8
+ * @param sourceFile - The ts-morph SourceFile to analyze
9
+ * @returns Array of detected schema information (including non-exported schemas)
10
+ */
11
+ detectExportedSchemas(sourceFile) {
12
+ const schemas = [];
13
+ // Find all variable declarations
14
+ const variableStatements = sourceFile.getVariableStatements();
15
+ for (const statement of variableStatements) {
16
+ const isExported = statement.isExported();
17
+ for (const declaration of statement.getDeclarations()) {
18
+ if (this.isZodSchema(declaration)) {
19
+ schemas.push({
20
+ name: declaration.getName(),
21
+ isExported,
22
+ line: declaration.getStartLineNumber(),
23
+ explicitType: this.extractExplicitType(declaration),
24
+ });
25
+ }
26
+ }
27
+ }
28
+ // Also check for re-exports: export { X as Y }
29
+ const exportDeclarations = sourceFile.getExportDeclarations();
30
+ for (const exportDecl of exportDeclarations) {
31
+ const namedExports = exportDecl.getNamedExports();
32
+ for (const namedExport of namedExports) {
33
+ const aliasNode = namedExport.getAliasNode();
34
+ const exportedName = aliasNode ? aliasNode.getText() : namedExport.getName();
35
+ // Check if the original variable is a Zod schema
36
+ const originalName = namedExport.getName();
37
+ const originalDecl = sourceFile.getVariableDeclaration(originalName);
38
+ if (originalDecl && this.isZodSchema(originalDecl)) {
39
+ // If the exported name is different from original (alias), add new entry
40
+ if (exportedName !== originalName) {
41
+ if (!schemas.some((s) => s.name === exportedName)) {
42
+ schemas.push({
43
+ name: exportedName,
44
+ isExported: true,
45
+ line: namedExport.getStartLineNumber(),
46
+ });
47
+ }
48
+ }
49
+ else {
50
+ // Same name re-export: update existing schema to mark as exported
51
+ const existing = schemas.find((s) => s.name === originalName);
52
+ if (existing) {
53
+ existing.isExported = true;
54
+ }
55
+ else {
56
+ schemas.push({
57
+ name: exportedName,
58
+ isExported: true,
59
+ line: namedExport.getStartLineNumber(),
60
+ });
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ // Return all schemas (both exported and non-exported)
67
+ // The isExported flag is used by the type printer to control export keyword
68
+ return schemas;
69
+ }
70
+ /**
71
+ * Known Zod schema builder functions that follow the z. prefix.
72
+ */
73
+ static ZOD_SCHEMA_BUILDERS = new Set([
74
+ "object",
75
+ "string",
76
+ "number",
77
+ "boolean",
78
+ "array",
79
+ "tuple",
80
+ "record",
81
+ "map",
82
+ "set",
83
+ "union",
84
+ "intersection",
85
+ "literal",
86
+ "enum",
87
+ "nativeEnum",
88
+ "nullable",
89
+ "optional",
90
+ "any",
91
+ "unknown",
92
+ "never",
93
+ "void",
94
+ "null",
95
+ "undefined",
96
+ "bigint",
97
+ "date",
98
+ "symbol",
99
+ "function",
100
+ "lazy",
101
+ "promise",
102
+ "instanceof",
103
+ "discriminatedUnion",
104
+ "preprocess",
105
+ "pipeline",
106
+ "custom",
107
+ "coerce",
108
+ "transformer",
109
+ "effect",
110
+ "brand",
111
+ "strictObject",
112
+ "looseObject",
113
+ ]);
114
+ /**
115
+ * Checks if a variable declaration is a Zod schema.
116
+ *
117
+ * @param declaration - The variable declaration to check
118
+ * @returns true if the declaration is a Zod schema
119
+ */
120
+ isZodSchema(declaration) {
121
+ // Check for explicit Zod type annotation (z.ZodType<T>, z.ZodSchema<T>, etc.)
122
+ const typeNode = declaration.getTypeNode();
123
+ if (typeNode) {
124
+ const typeText = typeNode.getText();
125
+ if (typeText.includes("ZodType") ||
126
+ typeText.includes("ZodSchema") ||
127
+ typeText.includes("ZodEffects")) {
128
+ return true;
129
+ }
130
+ }
131
+ const initializer = declaration.getInitializer();
132
+ if (!initializer) {
133
+ return false;
134
+ }
135
+ const initText = initializer.getText();
136
+ // Check if it starts with z. followed by a known Zod schema builder
137
+ if (initText.startsWith("z.")) {
138
+ // Extract the method name after "z."
139
+ const afterZ = initText.substring(2);
140
+ // Find where the method name ends (at '(' or '.')
141
+ const endIdx = Math.min(afterZ.indexOf("(") !== -1 ? afterZ.indexOf("(") : afterZ.length, afterZ.indexOf(".") !== -1 ? afterZ.indexOf(".") : afterZ.length);
142
+ const methodName = afterZ.substring(0, endIdx);
143
+ if (SchemaDetector.ZOD_SCHEMA_BUILDERS.has(methodName)) {
144
+ return true;
145
+ }
146
+ }
147
+ // Check if it's a method chain on another schema variable
148
+ // e.g., SomeSchema.pick({...}), SomeSchema.merge(...)
149
+ const zodMethods = [
150
+ ".pick(",
151
+ ".omit(",
152
+ ".partial(",
153
+ ".required(",
154
+ ".extend(",
155
+ ".merge(",
156
+ ".and(",
157
+ ".or(",
158
+ ".transform(",
159
+ ".refine(",
160
+ ".superRefine(",
161
+ ".default(",
162
+ ".optional(",
163
+ ".nullable(",
164
+ ".array(",
165
+ ".brand(",
166
+ ".deepPartial(",
167
+ ];
168
+ for (const method of zodMethods) {
169
+ if (initText.includes(method)) {
170
+ return true;
171
+ }
172
+ }
173
+ // Check for z.lazy() pattern (recursive schemas)
174
+ if (initText.includes("z.lazy(")) {
175
+ return true;
176
+ }
177
+ return false;
178
+ }
179
+ /**
180
+ * Gets all schema names from a source file.
181
+ *
182
+ * @param sourceFile - The ts-morph SourceFile to analyze
183
+ * @returns Array of schema names
184
+ */
185
+ getSchemaNames(sourceFile) {
186
+ return this.detectExportedSchemas(sourceFile).map((s) => s.name);
187
+ }
188
+ /**
189
+ * Extracts explicit type annotation from z.ZodType<T> or z.ZodSchema<T>.
190
+ *
191
+ * @param declaration - The variable declaration to check
192
+ * @returns The explicit type string if found, undefined otherwise
193
+ */
194
+ extractExplicitType(declaration) {
195
+ const typeNode = declaration.getTypeNode();
196
+ if (!typeNode) {
197
+ return undefined;
198
+ }
199
+ const typeText = typeNode.getText();
200
+ // Check if it matches Zod type patterns
201
+ const zodTypePatterns = [
202
+ "z.ZodType<",
203
+ "z.ZodSchema<",
204
+ "z.ZodEffects<",
205
+ "ZodType<",
206
+ "ZodSchema<",
207
+ "ZodEffects<",
208
+ ];
209
+ let matchedPattern;
210
+ for (const pattern of zodTypePatterns) {
211
+ if (typeText.startsWith(pattern)) {
212
+ matchedPattern = pattern;
213
+ break;
214
+ }
215
+ }
216
+ if (!matchedPattern) {
217
+ return undefined;
218
+ }
219
+ // Extract the first type parameter using bracket counting
220
+ const startIdx = matchedPattern.length;
221
+ return this.extractFirstTypeParameter(typeText, startIdx);
222
+ }
223
+ /**
224
+ * Extracts the first type parameter from a generic type string.
225
+ * Handles nested brackets properly.
226
+ *
227
+ * @param typeText - The full type text (e.g., "ZodType<{ a: string }, ZodTypeDef>")
228
+ * @param startIdx - The index after the opening "<"
229
+ * @returns The first type parameter, or undefined if parsing fails
230
+ */
231
+ extractFirstTypeParameter(typeText, startIdx) {
232
+ let depth = 1;
233
+ let endIdx = startIdx;
234
+ let inString = false;
235
+ let stringChar = "";
236
+ while (endIdx < typeText.length && depth > 0) {
237
+ const char = typeText[endIdx];
238
+ const prevChar = typeText[endIdx - 1];
239
+ // Track string literals
240
+ if ((char === '"' || char === "'" || char === "`") && prevChar !== "\\") {
241
+ if (!inString) {
242
+ inString = true;
243
+ stringChar = char;
244
+ }
245
+ else if (char === stringChar) {
246
+ inString = false;
247
+ stringChar = "";
248
+ }
249
+ }
250
+ if (!inString) {
251
+ if (char === "<" || char === "{" || char === "[" || char === "(") {
252
+ depth++;
253
+ }
254
+ else if (char === ">" || char === "}" || char === "]" || char === ")") {
255
+ depth--;
256
+ if (depth === 0)
257
+ break;
258
+ }
259
+ else if (char === "," && depth === 1) {
260
+ // Found the comma separating type parameters at depth 1
261
+ break;
262
+ }
263
+ }
264
+ endIdx++;
265
+ }
266
+ if (endIdx > startIdx) {
267
+ return typeText.substring(startIdx, endIdx).trim();
268
+ }
269
+ return undefined;
270
+ }
271
+ }
272
+ //# sourceMappingURL=schema-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-detector.js","sourceRoot":"","sources":["../../src/core/schema-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { SourceFile } from "ts-morph";
2
+ /**
3
+ * Information about a schema reference within another schema.
4
+ */
5
+ export interface SchemaReferenceInfo {
6
+ /** The field path where the reference occurs (e.g., "output", "input") */
7
+ fieldPath: string;
8
+ /** The referenced schema name */
9
+ refSchema: string;
10
+ /** Whether wrapped in z.array() */
11
+ isArray: boolean;
12
+ /** Whether wrapped in z.record() */
13
+ isRecord: boolean;
14
+ /** Whether optional */
15
+ isOptional: boolean;
16
+ }
17
+ /**
18
+ * Information about union member references.
19
+ */
20
+ export interface UnionReferenceInfo {
21
+ /** The referenced schema names (members of the union) */
22
+ memberSchemas: string[];
23
+ /** Whether this is a discriminated union */
24
+ isDiscriminated: boolean;
25
+ /** The discriminator key for discriminated unions */
26
+ discriminatorKey?: string;
27
+ }
28
+ /**
29
+ * Map of schema name to its references to other schemas.
30
+ */
31
+ export type SchemaReferenceMap = Map<string, SchemaReferenceInfo[]>;
32
+ /**
33
+ * Map of schema name to its union member references.
34
+ */
35
+ export type UnionReferenceMap = Map<string, UnionReferenceInfo>;
36
+ /**
37
+ * Analyzes schema references to detect cross-schema dependencies.
38
+ */
39
+ export declare class SchemaReferenceAnalyzer {
40
+ /**
41
+ * Analyzes a source file to find all schema references.
42
+ */
43
+ analyzeReferences(sourceFile: SourceFile, schemaNames: Set<string>): SchemaReferenceMap;
44
+ /**
45
+ * Analyzes a source file to find union schema references.
46
+ */
47
+ analyzeUnionReferences(sourceFile: SourceFile, schemaNames: Set<string>): UnionReferenceMap;
48
+ /**
49
+ * Finds union references in a schema definition.
50
+ */
51
+ private findUnionReference;
52
+ /**
53
+ * Parses a z.discriminatedUnion() call.
54
+ */
55
+ private parseDiscriminatedUnion;
56
+ /**
57
+ * Parses a z.union() call.
58
+ */
59
+ private parseUnion;
60
+ /**
61
+ * Extracts schema names from an array expression.
62
+ */
63
+ private extractSchemaArrayMembers;
64
+ /**
65
+ * Finds all references to other schemas within a schema definition.
66
+ */
67
+ private findSchemaReferences;
68
+ /**
69
+ * Finds all z.object() calls in a node (including the node itself).
70
+ */
71
+ private findZodObjectCalls;
72
+ /**
73
+ * Analyzes a field value to detect schema references.
74
+ */
75
+ private analyzeFieldValue;
76
+ }
77
+ //# sourceMappingURL=schema-reference-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-reference-analyzer.d.ts","sourceRoot":"","sources":["../../src/core/schema-reference-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwB,MAAM,UAAU,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,uBAAuB;IACvB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,4CAA4C;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAEhE;;GAEG;AACH,qBAAa,uBAAuB;IAClC;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,kBAAkB;IAsBvF;;OAEG;IACH,sBAAsB,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB;IAsB3F;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiC1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgC/B;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAsBjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAwC5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAwF1B"}
@@ -0,0 +1,269 @@
1
+ import { Node } from "ts-morph";
2
+ /**
3
+ * Analyzes schema references to detect cross-schema dependencies.
4
+ */
5
+ export class SchemaReferenceAnalyzer {
6
+ /**
7
+ * Analyzes a source file to find all schema references.
8
+ */
9
+ analyzeReferences(sourceFile, schemaNames) {
10
+ const result = new Map();
11
+ const statements = sourceFile.getVariableStatements();
12
+ for (const stmt of statements) {
13
+ for (const decl of stmt.getDeclarations()) {
14
+ const schemaName = decl.getName();
15
+ if (!schemaNames.has(schemaName))
16
+ continue;
17
+ const init = decl.getInitializer();
18
+ if (!init)
19
+ continue;
20
+ const refs = this.findSchemaReferences(init, schemaNames, schemaName);
21
+ if (refs.length > 0) {
22
+ result.set(schemaName, refs);
23
+ }
24
+ }
25
+ }
26
+ return result;
27
+ }
28
+ /**
29
+ * Analyzes a source file to find union schema references.
30
+ */
31
+ analyzeUnionReferences(sourceFile, schemaNames) {
32
+ const result = new Map();
33
+ const statements = sourceFile.getVariableStatements();
34
+ for (const stmt of statements) {
35
+ for (const decl of stmt.getDeclarations()) {
36
+ const schemaName = decl.getName();
37
+ if (!schemaNames.has(schemaName))
38
+ continue;
39
+ const init = decl.getInitializer();
40
+ if (!init)
41
+ continue;
42
+ const unionRef = this.findUnionReference(init, schemaNames, schemaName);
43
+ if (unionRef) {
44
+ result.set(schemaName, unionRef);
45
+ }
46
+ }
47
+ }
48
+ return result;
49
+ }
50
+ /**
51
+ * Finds union references in a schema definition.
52
+ */
53
+ findUnionReference(node, schemaNames, currentSchema) {
54
+ // Check if this is a z.discriminatedUnion() or z.union() call
55
+ if (!Node.isCallExpression(node)) {
56
+ return undefined;
57
+ }
58
+ const expr = node.getExpression();
59
+ if (!Node.isPropertyAccessExpression(expr)) {
60
+ return undefined;
61
+ }
62
+ const obj = expr.getExpression();
63
+ const method = expr.getName();
64
+ if (!Node.isIdentifier(obj) || obj.getText() !== "z") {
65
+ return undefined;
66
+ }
67
+ if (method === "discriminatedUnion") {
68
+ return this.parseDiscriminatedUnion(node, schemaNames, currentSchema);
69
+ }
70
+ if (method === "union") {
71
+ return this.parseUnion(node, schemaNames, currentSchema);
72
+ }
73
+ return undefined;
74
+ }
75
+ /**
76
+ * Parses a z.discriminatedUnion() call.
77
+ */
78
+ parseDiscriminatedUnion(node, schemaNames, currentSchema) {
79
+ const args = node.getArguments();
80
+ if (args.length < 2) {
81
+ return undefined;
82
+ }
83
+ // First arg is the discriminator key
84
+ const discriminatorArg = args[0];
85
+ let discriminatorKey;
86
+ if (Node.isStringLiteral(discriminatorArg)) {
87
+ discriminatorKey = discriminatorArg.getLiteralText();
88
+ }
89
+ // Second arg is the array of schemas
90
+ const schemasArg = args[1];
91
+ const memberSchemas = this.extractSchemaArrayMembers(schemasArg, schemaNames, currentSchema);
92
+ if (memberSchemas.length === 0) {
93
+ return undefined;
94
+ }
95
+ return {
96
+ memberSchemas,
97
+ isDiscriminated: true,
98
+ discriminatorKey,
99
+ };
100
+ }
101
+ /**
102
+ * Parses a z.union() call.
103
+ */
104
+ parseUnion(node, schemaNames, currentSchema) {
105
+ const args = node.getArguments();
106
+ if (args.length < 1) {
107
+ return undefined;
108
+ }
109
+ // First arg is the array of schemas
110
+ const schemasArg = args[0];
111
+ const memberSchemas = this.extractSchemaArrayMembers(schemasArg, schemaNames, currentSchema);
112
+ if (memberSchemas.length === 0) {
113
+ return undefined;
114
+ }
115
+ return {
116
+ memberSchemas,
117
+ isDiscriminated: false,
118
+ };
119
+ }
120
+ /**
121
+ * Extracts schema names from an array expression.
122
+ */
123
+ extractSchemaArrayMembers(node, schemaNames, currentSchema) {
124
+ if (!Node.isArrayLiteralExpression(node)) {
125
+ return [];
126
+ }
127
+ const members = [];
128
+ for (const element of node.getElements()) {
129
+ if (Node.isIdentifier(element)) {
130
+ const name = element.getText();
131
+ if (schemaNames.has(name) && name !== currentSchema) {
132
+ members.push(name);
133
+ }
134
+ }
135
+ }
136
+ return members;
137
+ }
138
+ /**
139
+ * Finds all references to other schemas within a schema definition.
140
+ */
141
+ findSchemaReferences(node, schemaNames, currentSchema) {
142
+ const refs = [];
143
+ // Find z.object() call
144
+ const objectCalls = this.findZodObjectCalls(node);
145
+ for (const objectCall of objectCalls) {
146
+ const args = objectCall.getArguments();
147
+ if (args.length === 0)
148
+ continue;
149
+ const objectLiteral = args[0];
150
+ if (!Node.isObjectLiteralExpression(objectLiteral))
151
+ continue;
152
+ // Analyze each property
153
+ for (const prop of objectLiteral.getProperties()) {
154
+ if (Node.isPropertyAssignment(prop)) {
155
+ const fieldName = prop.getName();
156
+ const initializer = prop.getInitializer();
157
+ if (!initializer)
158
+ continue;
159
+ const refInfo = this.analyzeFieldValue(initializer, fieldName, schemaNames, currentSchema);
160
+ if (refInfo) {
161
+ refs.push(refInfo);
162
+ }
163
+ }
164
+ }
165
+ }
166
+ return refs;
167
+ }
168
+ /**
169
+ * Finds all z.object() calls in a node (including the node itself).
170
+ */
171
+ findZodObjectCalls(node) {
172
+ const calls = [];
173
+ // Check the node itself
174
+ const checkNode = (n) => {
175
+ if (Node.isCallExpression(n)) {
176
+ const expr = n.getExpression();
177
+ if (Node.isPropertyAccessExpression(expr)) {
178
+ const obj = expr.getExpression();
179
+ const method = expr.getName();
180
+ if (Node.isIdentifier(obj) && obj.getText() === "z" && method === "object") {
181
+ calls.push(n);
182
+ }
183
+ }
184
+ }
185
+ };
186
+ checkNode(node);
187
+ node.forEachDescendant(checkNode);
188
+ return calls;
189
+ }
190
+ /**
191
+ * Analyzes a field value to detect schema references.
192
+ */
193
+ analyzeFieldValue(node, fieldPath, schemaNames, currentSchema) {
194
+ let isArray = false;
195
+ let isRecord = false;
196
+ let isOptional = false;
197
+ let refSchema = null;
198
+ // Unwrap method chains
199
+ let current = node;
200
+ while (Node.isCallExpression(current)) {
201
+ const expr = current.getExpression();
202
+ if (Node.isPropertyAccessExpression(expr)) {
203
+ const method = expr.getName();
204
+ const base = expr.getExpression();
205
+ if (method === "optional" || method === "nullable") {
206
+ isOptional = true;
207
+ current = base;
208
+ continue;
209
+ }
210
+ if (method === "array") {
211
+ if (Node.isIdentifier(base) && base.getText() !== "z") {
212
+ // SchemaName.array()
213
+ const name = base.getText();
214
+ if (schemaNames.has(name) && name !== currentSchema) {
215
+ isArray = true;
216
+ refSchema = name;
217
+ break;
218
+ }
219
+ }
220
+ else if (Node.isIdentifier(base) && base.getText() === "z") {
221
+ // z.array(SchemaName)
222
+ const args = current.getArguments();
223
+ if (args.length > 0 && Node.isIdentifier(args[0])) {
224
+ const name = args[0].getText();
225
+ if (schemaNames.has(name) && name !== currentSchema) {
226
+ isArray = true;
227
+ refSchema = name;
228
+ break;
229
+ }
230
+ }
231
+ }
232
+ current = base;
233
+ continue;
234
+ }
235
+ if (method === "record" && Node.isIdentifier(base) && base.getText() === "z") {
236
+ // z.record(key, SchemaName)
237
+ const args = current.getArguments();
238
+ if (args.length >= 2 && Node.isIdentifier(args[1])) {
239
+ const name = args[1].getText();
240
+ if (schemaNames.has(name) && name !== currentSchema) {
241
+ isRecord = true;
242
+ refSchema = name;
243
+ break;
244
+ }
245
+ }
246
+ }
247
+ }
248
+ break;
249
+ }
250
+ // Check if current is a direct identifier reference
251
+ if (!refSchema && Node.isIdentifier(current)) {
252
+ const name = current.getText();
253
+ if (schemaNames.has(name) && name !== currentSchema) {
254
+ refSchema = name;
255
+ }
256
+ }
257
+ if (!refSchema) {
258
+ return null;
259
+ }
260
+ return {
261
+ fieldPath,
262
+ refSchema,
263
+ isArray,
264
+ isRecord,
265
+ isOptional,
266
+ };
267
+ }
268
+ }
269
+ //# sourceMappingURL=schema-reference-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-reference-analyzer.js","sourceRoot":"","sources":["../../src/core/schema-reference-analyzer.ts"],"names":[],"mappings":"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"}