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.
- package/README.md +477 -28
- package/bin/zinfer +2 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +486 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/brand-detector.d.ts +32 -0
- package/dist/core/brand-detector.d.ts.map +1 -0
- package/dist/core/brand-detector.js +121 -0
- package/dist/core/brand-detector.js.map +1 -0
- package/dist/core/config-loader.d.ts +87 -0
- package/dist/core/config-loader.d.ts.map +1 -0
- package/dist/core/config-loader.js +105 -0
- package/dist/core/config-loader.js.map +1 -0
- package/dist/core/description-extractor.d.ts +54 -0
- package/dist/core/description-extractor.d.ts.map +1 -0
- package/dist/core/description-extractor.js +180 -0
- package/dist/core/description-extractor.js.map +1 -0
- package/dist/core/errors.d.ts +35 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +96 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/extractor.d.ts +121 -0
- package/dist/core/extractor.d.ts.map +1 -0
- package/dist/core/extractor.js +504 -0
- package/dist/core/extractor.js.map +1 -0
- package/dist/core/file-resolver.d.ts +41 -0
- package/dist/core/file-resolver.d.ts.map +1 -0
- package/dist/core/file-resolver.js +95 -0
- package/dist/core/file-resolver.js.map +1 -0
- package/dist/core/getter-resolver.d.ts +67 -0
- package/dist/core/getter-resolver.d.ts.map +1 -0
- package/dist/core/getter-resolver.js +234 -0
- package/dist/core/getter-resolver.js.map +1 -0
- package/dist/core/import-resolver.d.ts +51 -0
- package/dist/core/import-resolver.d.ts.map +1 -0
- package/dist/core/import-resolver.js +158 -0
- package/dist/core/import-resolver.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +20 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +36 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/name-mapper.d.ts +45 -0
- package/dist/core/name-mapper.d.ts.map +1 -0
- package/dist/core/name-mapper.js +82 -0
- package/dist/core/name-mapper.js.map +1 -0
- package/dist/core/normalizer.d.ts +24 -0
- package/dist/core/normalizer.d.ts.map +1 -0
- package/dist/core/normalizer.js +50 -0
- package/dist/core/normalizer.js.map +1 -0
- package/dist/core/schema-detector.d.ts +49 -0
- package/dist/core/schema-detector.d.ts.map +1 -0
- package/dist/core/schema-detector.js +272 -0
- package/dist/core/schema-detector.js.map +1 -0
- package/dist/core/schema-reference-analyzer.d.ts +77 -0
- package/dist/core/schema-reference-analyzer.d.ts.map +1 -0
- package/dist/core/schema-reference-analyzer.js +269 -0
- package/dist/core/schema-reference-analyzer.js.map +1 -0
- package/dist/core/test-generator.d.ts +97 -0
- package/dist/core/test-generator.d.ts.map +1 -0
- package/dist/core/test-generator.js +177 -0
- package/dist/core/test-generator.js.map +1 -0
- package/dist/core/type-printer.d.ts +46 -0
- package/dist/core/type-printer.d.ts.map +1 -0
- package/dist/core/type-printer.js +519 -0
- package/dist/core/type-printer.js.map +1 -0
- package/dist/core/types.d.ts +124 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -7
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { ExtractResult, FileExtractResult } from "./types.js";
|
|
2
|
+
export type { ExtractResult } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Options for type extraction.
|
|
5
|
+
*/
|
|
6
|
+
export interface ExtractOptions {
|
|
7
|
+
/** Absolute or relative path to the TypeScript file containing the Zod schema */
|
|
8
|
+
filePath: string;
|
|
9
|
+
/** Name of the exported Zod schema (e.g., "UserSchema") */
|
|
10
|
+
schemaName: string;
|
|
11
|
+
/** Optional path to tsconfig.json for project configuration */
|
|
12
|
+
tsconfigPath?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Extracts input and output types from Zod schemas using TypeScript Compiler API.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ZodTypeExtractor {
|
|
18
|
+
private project;
|
|
19
|
+
private schemaDetector;
|
|
20
|
+
private getterResolver;
|
|
21
|
+
private referenceAnalyzer;
|
|
22
|
+
private importResolver;
|
|
23
|
+
private brandDetector;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new ZodTypeExtractor instance.
|
|
26
|
+
*
|
|
27
|
+
* @param tsconfigPath - Optional path to tsconfig.json. If not provided,
|
|
28
|
+
* default compiler options will be used.
|
|
29
|
+
*/
|
|
30
|
+
constructor(tsconfigPath?: string);
|
|
31
|
+
/**
|
|
32
|
+
* Extracts input and output types from a Zod schema.
|
|
33
|
+
*
|
|
34
|
+
* @param options - Extraction options including file path and schema name
|
|
35
|
+
* @returns The extracted input and output types as strings
|
|
36
|
+
*/
|
|
37
|
+
extract(options: ExtractOptions): ExtractResult;
|
|
38
|
+
/**
|
|
39
|
+
* Extracts types from all exported Zod schemas in a file.
|
|
40
|
+
*
|
|
41
|
+
* @param filePath - Path to the TypeScript file
|
|
42
|
+
* @returns Array of extraction results for each schema
|
|
43
|
+
*/
|
|
44
|
+
extractAll(filePath: string): ExtractResult[];
|
|
45
|
+
/**
|
|
46
|
+
* Extracts types from specific schemas in a file.
|
|
47
|
+
*
|
|
48
|
+
* @param filePath - Path to the TypeScript file
|
|
49
|
+
* @param schemaNames - Names of schemas to extract
|
|
50
|
+
* @returns Array of extraction results
|
|
51
|
+
*/
|
|
52
|
+
extractMultiple(filePath: string, schemaNames: string[]): ExtractResult[];
|
|
53
|
+
/**
|
|
54
|
+
* Extracts types from all exported schemas and returns file-level result.
|
|
55
|
+
*
|
|
56
|
+
* @param filePath - Path to the TypeScript file
|
|
57
|
+
* @returns File extraction result with all schemas
|
|
58
|
+
*/
|
|
59
|
+
extractFile(filePath: string): FileExtractResult;
|
|
60
|
+
/**
|
|
61
|
+
* Gets the list of detected schema names in a file.
|
|
62
|
+
*
|
|
63
|
+
* @param filePath - Path to the TypeScript file
|
|
64
|
+
* @returns Array of schema names
|
|
65
|
+
*/
|
|
66
|
+
getSchemaNames(filePath: string): string[];
|
|
67
|
+
/**
|
|
68
|
+
* Gets or adds a source file to the project.
|
|
69
|
+
*/
|
|
70
|
+
private getOrAddSourceFile;
|
|
71
|
+
/**
|
|
72
|
+
* Internal method to extract multiple schemas from a source file.
|
|
73
|
+
*/
|
|
74
|
+
private extractMultipleFromSourceFile;
|
|
75
|
+
/**
|
|
76
|
+
* Replaces an inline schema reference with a type name.
|
|
77
|
+
*/
|
|
78
|
+
private replaceSchemaReference;
|
|
79
|
+
/**
|
|
80
|
+
* Injects temporary type for explicit type (without normalization for circular refs).
|
|
81
|
+
*/
|
|
82
|
+
private injectExplicitType;
|
|
83
|
+
/**
|
|
84
|
+
* Cleans up explicit type temporaries.
|
|
85
|
+
*/
|
|
86
|
+
private cleanupExplicitType;
|
|
87
|
+
/**
|
|
88
|
+
* Creates a ts-morph Project with appropriate compiler options.
|
|
89
|
+
*/
|
|
90
|
+
private createProject;
|
|
91
|
+
/**
|
|
92
|
+
* Injects the Normalize type and temporary type aliases into the source file.
|
|
93
|
+
* These are added in-memory only and never saved to disk.
|
|
94
|
+
*/
|
|
95
|
+
private injectTemporaryTypes;
|
|
96
|
+
/**
|
|
97
|
+
* Resolves a type alias and returns its fully expanded string representation.
|
|
98
|
+
*/
|
|
99
|
+
private resolveType;
|
|
100
|
+
/**
|
|
101
|
+
* Simplifies Zod internal function types to Function.
|
|
102
|
+
* Replaces patterns like z.core.$InferInnerFunctionType<...> with Function.
|
|
103
|
+
* Handles nested type parameters properly.
|
|
104
|
+
*/
|
|
105
|
+
private simplifyZodFunctionTypes;
|
|
106
|
+
/**
|
|
107
|
+
* Removes the temporary types that were injected during extraction.
|
|
108
|
+
* This ensures the original file remains unmodified.
|
|
109
|
+
*/
|
|
110
|
+
private cleanupTemporaryTypes;
|
|
111
|
+
/**
|
|
112
|
+
* Escapes special characters in a string for use in a RegExp.
|
|
113
|
+
*/
|
|
114
|
+
private escapeRegExp;
|
|
115
|
+
/**
|
|
116
|
+
* Checks if a string is a valid TypeScript identifier.
|
|
117
|
+
* Used to determine if a type name can be safely used in regex replacement.
|
|
118
|
+
*/
|
|
119
|
+
private isValidIdentifier;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAkB,MAAM,YAAY,CAAC;AAGnF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAgB;IAErC;;;;;OAKG;gBACS,YAAY,CAAC,EAAE,MAAM;IASjC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa;IAa/C;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAO7C;;;;;;OAMG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE;IAWzE;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB;IAOhD;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAI1C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA+MrC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA8E9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAgDnB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA8ChC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}
|
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import { Project, TypeFormatFlags, ts } from "ts-morph";
|
|
2
|
+
import { NORMALIZE_TYPE_DEFINITION, createTempTypeAlias, TEMP_TYPE_NAMES } from "./normalizer.js";
|
|
3
|
+
import { SchemaDetector } from "./schema-detector.js";
|
|
4
|
+
import { GetterResolver } from "./getter-resolver.js";
|
|
5
|
+
import { SchemaReferenceAnalyzer } from "./schema-reference-analyzer.js";
|
|
6
|
+
import { ImportResolver } from "./import-resolver.js";
|
|
7
|
+
import { BrandDetector } from "./brand-detector.js";
|
|
8
|
+
import { logDebugError } from "./logger.js";
|
|
9
|
+
/**
|
|
10
|
+
* Extracts input and output types from Zod schemas using TypeScript Compiler API.
|
|
11
|
+
*/
|
|
12
|
+
export class ZodTypeExtractor {
|
|
13
|
+
project;
|
|
14
|
+
schemaDetector;
|
|
15
|
+
getterResolver;
|
|
16
|
+
referenceAnalyzer;
|
|
17
|
+
importResolver;
|
|
18
|
+
brandDetector;
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new ZodTypeExtractor instance.
|
|
21
|
+
*
|
|
22
|
+
* @param tsconfigPath - Optional path to tsconfig.json. If not provided,
|
|
23
|
+
* default compiler options will be used.
|
|
24
|
+
*/
|
|
25
|
+
constructor(tsconfigPath) {
|
|
26
|
+
this.project = this.createProject(tsconfigPath);
|
|
27
|
+
this.schemaDetector = new SchemaDetector();
|
|
28
|
+
this.getterResolver = new GetterResolver();
|
|
29
|
+
this.referenceAnalyzer = new SchemaReferenceAnalyzer();
|
|
30
|
+
this.importResolver = new ImportResolver();
|
|
31
|
+
this.brandDetector = new BrandDetector();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extracts input and output types from a Zod schema.
|
|
35
|
+
*
|
|
36
|
+
* @param options - Extraction options including file path and schema name
|
|
37
|
+
* @returns The extracted input and output types as strings
|
|
38
|
+
*/
|
|
39
|
+
extract(options) {
|
|
40
|
+
const { filePath, schemaName } = options;
|
|
41
|
+
// Use extractMultiple to handle explicit type annotations properly
|
|
42
|
+
const results = this.extractMultiple(filePath, [schemaName]);
|
|
43
|
+
if (results.length === 0) {
|
|
44
|
+
throw new Error(`Schema "${schemaName}" not found in ${filePath}`);
|
|
45
|
+
}
|
|
46
|
+
return results[0];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extracts types from all exported Zod schemas in a file.
|
|
50
|
+
*
|
|
51
|
+
* @param filePath - Path to the TypeScript file
|
|
52
|
+
* @returns Array of extraction results for each schema
|
|
53
|
+
*/
|
|
54
|
+
extractAll(filePath) {
|
|
55
|
+
const sourceFile = this.getOrAddSourceFile(filePath);
|
|
56
|
+
const schemas = this.schemaDetector.detectExportedSchemas(sourceFile);
|
|
57
|
+
return this.extractMultipleFromSourceFile(sourceFile, schemas);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extracts types from specific schemas in a file.
|
|
61
|
+
*
|
|
62
|
+
* @param filePath - Path to the TypeScript file
|
|
63
|
+
* @param schemaNames - Names of schemas to extract
|
|
64
|
+
* @returns Array of extraction results
|
|
65
|
+
*/
|
|
66
|
+
extractMultiple(filePath, schemaNames) {
|
|
67
|
+
const sourceFile = this.getOrAddSourceFile(filePath);
|
|
68
|
+
const allSchemas = this.schemaDetector.detectExportedSchemas(sourceFile);
|
|
69
|
+
const schemas = schemaNames.map((name) => {
|
|
70
|
+
const found = allSchemas.find((s) => s.name === name);
|
|
71
|
+
return found || { name, isExported: true, line: 0 };
|
|
72
|
+
});
|
|
73
|
+
return this.extractMultipleFromSourceFile(sourceFile, schemas);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extracts types from all exported schemas and returns file-level result.
|
|
77
|
+
*
|
|
78
|
+
* @param filePath - Path to the TypeScript file
|
|
79
|
+
* @returns File extraction result with all schemas
|
|
80
|
+
*/
|
|
81
|
+
extractFile(filePath) {
|
|
82
|
+
return {
|
|
83
|
+
filePath,
|
|
84
|
+
schemas: this.extractAll(filePath),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Gets the list of detected schema names in a file.
|
|
89
|
+
*
|
|
90
|
+
* @param filePath - Path to the TypeScript file
|
|
91
|
+
* @returns Array of schema names
|
|
92
|
+
*/
|
|
93
|
+
getSchemaNames(filePath) {
|
|
94
|
+
return this.schemaDetector.getSchemaNames(this.getOrAddSourceFile(filePath));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Gets or adds a source file to the project.
|
|
98
|
+
*/
|
|
99
|
+
getOrAddSourceFile(filePath) {
|
|
100
|
+
return this.project.getSourceFile(filePath) ?? this.project.addSourceFileAtPath(filePath);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Internal method to extract multiple schemas from a source file.
|
|
104
|
+
*/
|
|
105
|
+
extractMultipleFromSourceFile(sourceFile, schemas) {
|
|
106
|
+
const results = [];
|
|
107
|
+
// Find and resolve imported schemas
|
|
108
|
+
const importedSchemas = this.importResolver.findImportedSchemas(sourceFile, this.project);
|
|
109
|
+
// Analyze getter fields for all schemas
|
|
110
|
+
const getterFieldMap = this.getterResolver.analyzeGetterFields(sourceFile);
|
|
111
|
+
// Build schema names set including imports
|
|
112
|
+
const schemaNames = new Set(schemas.map((s) => s.name));
|
|
113
|
+
for (const localName of importedSchemas.keys()) {
|
|
114
|
+
schemaNames.add(localName);
|
|
115
|
+
}
|
|
116
|
+
// Analyze cross-schema references
|
|
117
|
+
const referenceMap = this.referenceAnalyzer.analyzeReferences(sourceFile, schemaNames);
|
|
118
|
+
// Analyze union schema references
|
|
119
|
+
const unionReferenceMap = this.referenceAnalyzer.analyzeUnionReferences(sourceFile, schemaNames);
|
|
120
|
+
// Detect branded types
|
|
121
|
+
const brandMap = this.brandDetector.detectBrands(sourceFile, schemaNames);
|
|
122
|
+
// First pass: extract raw types for all schemas
|
|
123
|
+
const rawTypes = new Map();
|
|
124
|
+
// Extract types from imported schemas first
|
|
125
|
+
for (const [localName, importInfo] of importedSchemas) {
|
|
126
|
+
if (!importInfo.resolved)
|
|
127
|
+
continue;
|
|
128
|
+
const importedSourceFile = this.project.getSourceFile(importInfo.sourceFilePath);
|
|
129
|
+
if (!importedSourceFile)
|
|
130
|
+
continue;
|
|
131
|
+
try {
|
|
132
|
+
this.injectTemporaryTypes(importedSourceFile, importInfo.originalName);
|
|
133
|
+
const inputType = this.resolveType(importedSourceFile, "__TempInput");
|
|
134
|
+
const outputType = this.resolveType(importedSourceFile, "__TempOutput");
|
|
135
|
+
// Use local name as the key (how it's referenced in current file)
|
|
136
|
+
rawTypes.set(localName, {
|
|
137
|
+
input: inputType,
|
|
138
|
+
output: outputType,
|
|
139
|
+
isExported: false, // Imported schemas won't be re-exported
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
logDebugError(`Failed to extract imported schema "${localName}"`, error);
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
this.cleanupTemporaryTypes(importedSourceFile);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Extract types from local schemas
|
|
150
|
+
for (const schema of schemas) {
|
|
151
|
+
const { name: schemaName, explicitType, isExported } = schema;
|
|
152
|
+
if (explicitType) {
|
|
153
|
+
this.injectExplicitType(sourceFile, explicitType);
|
|
154
|
+
try {
|
|
155
|
+
const resolvedType = this.resolveType(sourceFile, "__TempExplicit");
|
|
156
|
+
rawTypes.set(schemaName, {
|
|
157
|
+
input: resolvedType,
|
|
158
|
+
output: resolvedType,
|
|
159
|
+
isExported,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
this.cleanupExplicitType(sourceFile);
|
|
164
|
+
}
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
this.injectTemporaryTypes(sourceFile, schemaName);
|
|
168
|
+
try {
|
|
169
|
+
let inputType = this.resolveType(sourceFile, "__TempInput");
|
|
170
|
+
let outputType = this.resolveType(sourceFile, "__TempOutput");
|
|
171
|
+
// Resolve getter-based self-references
|
|
172
|
+
const getterFields = getterFieldMap.get(schemaName);
|
|
173
|
+
if (getterFields && this.getterResolver.hasSelfReferences(getterFields)) {
|
|
174
|
+
const inputTypeName = `${schemaName}Input`;
|
|
175
|
+
const outputTypeName = `${schemaName}Output`;
|
|
176
|
+
const originalInputType = inputType;
|
|
177
|
+
inputType = this.getterResolver.resolveAnyTypes(inputType, getterFields, inputTypeName);
|
|
178
|
+
if (outputType === "any") {
|
|
179
|
+
outputType = this.getterResolver.resolveAnyTypes(originalInputType, getterFields, outputTypeName);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
outputType = this.getterResolver.resolveAnyTypes(outputType, getterFields, outputTypeName);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
rawTypes.set(schemaName, { input: inputType, output: outputType, isExported });
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
this.cleanupTemporaryTypes(sourceFile);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Add imported schemas to results first (so they're defined before use)
|
|
192
|
+
for (const [localName] of importedSchemas) {
|
|
193
|
+
const raw = rawTypes.get(localName);
|
|
194
|
+
if (!raw)
|
|
195
|
+
continue;
|
|
196
|
+
results.push({
|
|
197
|
+
schemaName: localName,
|
|
198
|
+
input: raw.input,
|
|
199
|
+
output: raw.output,
|
|
200
|
+
isExported: false, // Imported schemas are not re-exported
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Second pass: replace cross-schema references with type names
|
|
204
|
+
for (const schema of schemas) {
|
|
205
|
+
const schemaName = schema.name;
|
|
206
|
+
const raw = rawTypes.get(schemaName);
|
|
207
|
+
if (!raw)
|
|
208
|
+
continue;
|
|
209
|
+
// Get brand information for this schema
|
|
210
|
+
const brands = brandMap.get(schemaName);
|
|
211
|
+
// Check if this schema is a union with member references
|
|
212
|
+
const unionRef = unionReferenceMap.get(schemaName);
|
|
213
|
+
if (unionRef && unionRef.memberSchemas.length > 0) {
|
|
214
|
+
// Only use named references for exported members; inline non-exported ones
|
|
215
|
+
const exportedMembers = unionRef.memberSchemas.filter((member) => {
|
|
216
|
+
const memberRaw = rawTypes.get(member);
|
|
217
|
+
return memberRaw?.isExported;
|
|
218
|
+
});
|
|
219
|
+
if (exportedMembers.length === unionRef.memberSchemas.length) {
|
|
220
|
+
// All members are exported, use named references
|
|
221
|
+
const inputMembers = unionRef.memberSchemas.map((member) => `${member}Input`).join(" | ");
|
|
222
|
+
const outputMembers = unionRef.memberSchemas
|
|
223
|
+
.map((member) => `${member}Output`)
|
|
224
|
+
.join(" | ");
|
|
225
|
+
results.push({
|
|
226
|
+
schemaName,
|
|
227
|
+
input: inputMembers,
|
|
228
|
+
output: outputMembers,
|
|
229
|
+
isExported: raw.isExported,
|
|
230
|
+
brands,
|
|
231
|
+
});
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
// Some members are non-exported; fall through to inline extraction
|
|
235
|
+
}
|
|
236
|
+
let { input, output } = raw;
|
|
237
|
+
const refs = referenceMap.get(schemaName) || [];
|
|
238
|
+
// Replace references to other schemas with type names
|
|
239
|
+
// Only replace references to exported schemas
|
|
240
|
+
for (const ref of refs) {
|
|
241
|
+
const refRaw = rawTypes.get(ref.refSchema);
|
|
242
|
+
if (!refRaw)
|
|
243
|
+
continue;
|
|
244
|
+
// Skip replacement if the referenced schema is not exported
|
|
245
|
+
// Non-exported schemas should remain inlined
|
|
246
|
+
if (!refRaw.isExported)
|
|
247
|
+
continue;
|
|
248
|
+
input = this.replaceSchemaReference(input, ref, refRaw.input, `${ref.refSchema}Input`);
|
|
249
|
+
output = this.replaceSchemaReference(output, ref, refRaw.output, `${ref.refSchema}Output`);
|
|
250
|
+
}
|
|
251
|
+
// For explicit types, replace self-references with typed names
|
|
252
|
+
if (schema.explicitType) {
|
|
253
|
+
// schema.explicitType already contains just the type name (e.g., "JsonValue")
|
|
254
|
+
const typeName = schema.explicitType;
|
|
255
|
+
// Only replace if the type name is a valid identifier (not a complex type)
|
|
256
|
+
if (this.isValidIdentifier(typeName)) {
|
|
257
|
+
// Escape special regex characters in the type name
|
|
258
|
+
const escapedTypeName = this.escapeRegExp(typeName);
|
|
259
|
+
// Replace type name with self-referencing Input/Output types
|
|
260
|
+
const typeNamePattern = new RegExp(`\\b${escapedTypeName}\\b`, "g");
|
|
261
|
+
input = input.replace(typeNamePattern, `${schemaName}Input`);
|
|
262
|
+
output = output.replace(typeNamePattern, `${schemaName}Output`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
results.push({
|
|
266
|
+
schemaName,
|
|
267
|
+
input,
|
|
268
|
+
output,
|
|
269
|
+
isExported: raw.isExported,
|
|
270
|
+
brands,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return results;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Replaces an inline schema reference with a type name.
|
|
277
|
+
*/
|
|
278
|
+
replaceSchemaReference(typeStr, ref, refTypeStr, refTypeName) {
|
|
279
|
+
const { fieldPath, isArray, isRecord } = ref;
|
|
280
|
+
// Build the replacement type
|
|
281
|
+
let replacement = refTypeName;
|
|
282
|
+
if (isArray) {
|
|
283
|
+
replacement = `${refTypeName}[]`;
|
|
284
|
+
}
|
|
285
|
+
// Find the field and replace its value
|
|
286
|
+
const fieldPatterns = [`${fieldPath}: `, `${fieldPath}?: `];
|
|
287
|
+
for (const pattern of fieldPatterns) {
|
|
288
|
+
const idx = typeStr.indexOf(pattern);
|
|
289
|
+
if (idx === -1)
|
|
290
|
+
continue;
|
|
291
|
+
const valueStart = idx + pattern.length;
|
|
292
|
+
// Find the end of the field value by tracking braces/brackets
|
|
293
|
+
let depth = 0;
|
|
294
|
+
let endIdx = valueStart;
|
|
295
|
+
let inString = false;
|
|
296
|
+
while (endIdx < typeStr.length) {
|
|
297
|
+
const char = typeStr[endIdx];
|
|
298
|
+
if (char === '"' || char === "'") {
|
|
299
|
+
inString = !inString;
|
|
300
|
+
}
|
|
301
|
+
else if (!inString) {
|
|
302
|
+
if (char === "{" || char === "[" || char === "(") {
|
|
303
|
+
depth++;
|
|
304
|
+
}
|
|
305
|
+
else if (char === "}" || char === "]" || char === ")") {
|
|
306
|
+
if (depth === 0)
|
|
307
|
+
break;
|
|
308
|
+
depth--;
|
|
309
|
+
}
|
|
310
|
+
else if (char === ";" && depth === 0) {
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
endIdx++;
|
|
315
|
+
}
|
|
316
|
+
// Extract the current value
|
|
317
|
+
const currentValue = typeStr.substring(valueStart, endIdx).trim();
|
|
318
|
+
// Check if this looks like an expanded type that should be replaced
|
|
319
|
+
// Handle: { ... }, readonly { ... }[], SomeType, etc.
|
|
320
|
+
const valueToCheck = currentValue
|
|
321
|
+
.replace(/^readonly\s+/, "")
|
|
322
|
+
.replace(/\[\]$/, "")
|
|
323
|
+
.trim();
|
|
324
|
+
if (valueToCheck.startsWith("{") ||
|
|
325
|
+
valueToCheck === refTypeStr ||
|
|
326
|
+
currentValue.includes("[x: string]:")) {
|
|
327
|
+
// Handle record type
|
|
328
|
+
if (isRecord) {
|
|
329
|
+
replacement = `{ [x: string]: ${refTypeName} }`;
|
|
330
|
+
}
|
|
331
|
+
// Preserve readonly prefix for arrays
|
|
332
|
+
if (isArray && currentValue.startsWith("readonly ")) {
|
|
333
|
+
replacement = `readonly ${replacement}`;
|
|
334
|
+
}
|
|
335
|
+
return typeStr.substring(0, valueStart) + replacement + typeStr.substring(endIdx);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return typeStr;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Injects temporary type for explicit type (without normalization for circular refs).
|
|
342
|
+
*/
|
|
343
|
+
injectExplicitType(sourceFile, explicitType) {
|
|
344
|
+
// Don't normalize - use the type directly to preserve circular references
|
|
345
|
+
sourceFile.addStatements([`type __TempExplicit = ${explicitType};`]);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Cleans up explicit type temporaries.
|
|
349
|
+
*/
|
|
350
|
+
cleanupExplicitType(sourceFile) {
|
|
351
|
+
const typeAlias = sourceFile.getTypeAlias("__TempExplicit");
|
|
352
|
+
if (typeAlias) {
|
|
353
|
+
typeAlias.remove();
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Creates a ts-morph Project with appropriate compiler options.
|
|
358
|
+
*/
|
|
359
|
+
createProject(tsconfigPath) {
|
|
360
|
+
if (tsconfigPath) {
|
|
361
|
+
return new Project({
|
|
362
|
+
tsConfigFilePath: tsconfigPath,
|
|
363
|
+
skipAddingFilesFromTsConfig: true,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
return new Project({
|
|
367
|
+
compilerOptions: {
|
|
368
|
+
strict: true,
|
|
369
|
+
target: ts.ScriptTarget.ESNext,
|
|
370
|
+
module: ts.ModuleKind.ESNext,
|
|
371
|
+
moduleResolution: ts.ModuleResolutionKind.Bundler,
|
|
372
|
+
esModuleInterop: true,
|
|
373
|
+
skipLibCheck: true,
|
|
374
|
+
},
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Injects the Normalize type and temporary type aliases into the source file.
|
|
379
|
+
* These are added in-memory only and never saved to disk.
|
|
380
|
+
*/
|
|
381
|
+
injectTemporaryTypes(sourceFile, schemaName) {
|
|
382
|
+
// Add the Normalize type definition and temporary type aliases at the end of the file
|
|
383
|
+
sourceFile.addStatements([
|
|
384
|
+
NORMALIZE_TYPE_DEFINITION,
|
|
385
|
+
createTempTypeAlias(schemaName, "input"),
|
|
386
|
+
createTempTypeAlias(schemaName, "output"),
|
|
387
|
+
]);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Resolves a type alias and returns its fully expanded string representation.
|
|
391
|
+
*/
|
|
392
|
+
resolveType(sourceFile, typeName) {
|
|
393
|
+
const typeAlias = sourceFile.getTypeAlias(typeName);
|
|
394
|
+
if (!typeAlias) {
|
|
395
|
+
throw new Error(`Failed to find type alias: ${typeName}`);
|
|
396
|
+
}
|
|
397
|
+
const type = typeAlias.getType();
|
|
398
|
+
// Use TypeFormatFlags to get the fully expanded type without truncation
|
|
399
|
+
// Don't use UseAliasDefinedOutsideCurrentScope to expand enum types
|
|
400
|
+
const formatFlags = TypeFormatFlags.NoTruncation | TypeFormatFlags.InTypeAlias;
|
|
401
|
+
let rawType = type.getText(typeAlias, formatFlags);
|
|
402
|
+
// Remove trailing spaces from each line (ts-morph 27+ may add them)
|
|
403
|
+
rawType = rawType
|
|
404
|
+
.split("\n")
|
|
405
|
+
.map((line) => line.trimEnd())
|
|
406
|
+
.join("\n");
|
|
407
|
+
// Expand enum types: if the type is a single identifier, check if it's an enum
|
|
408
|
+
if (/^[A-Z][a-zA-Z0-9]*$/.test(rawType)) {
|
|
409
|
+
const enumDecl = sourceFile.getEnum(rawType);
|
|
410
|
+
if (enumDecl) {
|
|
411
|
+
// Extract enum values
|
|
412
|
+
const members = enumDecl.getMembers();
|
|
413
|
+
const values = members
|
|
414
|
+
.map((member) => {
|
|
415
|
+
const value = member.getValue();
|
|
416
|
+
if (typeof value === "string") {
|
|
417
|
+
return `"${value}"`;
|
|
418
|
+
}
|
|
419
|
+
else if (typeof value === "number") {
|
|
420
|
+
return value.toString();
|
|
421
|
+
}
|
|
422
|
+
return null;
|
|
423
|
+
})
|
|
424
|
+
.filter(Boolean);
|
|
425
|
+
if (values.length > 0) {
|
|
426
|
+
rawType = values.join(" | ");
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
// Post-process to simplify Zod internal function types
|
|
431
|
+
return this.simplifyZodFunctionTypes(rawType);
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Simplifies Zod internal function types to Function.
|
|
435
|
+
* Replaces patterns like z.core.$InferInnerFunctionType<...> with Function.
|
|
436
|
+
* Handles nested type parameters properly.
|
|
437
|
+
*/
|
|
438
|
+
simplifyZodFunctionTypes(typeStr) {
|
|
439
|
+
// Pattern prefixes for Zod internal function types
|
|
440
|
+
const zodFunctionPrefixes = [
|
|
441
|
+
"z.core.$InferInnerFunctionType<",
|
|
442
|
+
"z.core.$InferOuterFunctionType<",
|
|
443
|
+
];
|
|
444
|
+
let result = typeStr;
|
|
445
|
+
let modified = true;
|
|
446
|
+
// Loop until no more replacements are made (handles nested cases)
|
|
447
|
+
while (modified) {
|
|
448
|
+
modified = false;
|
|
449
|
+
for (const prefix of zodFunctionPrefixes) {
|
|
450
|
+
const idx = result.indexOf(prefix);
|
|
451
|
+
if (idx === -1)
|
|
452
|
+
continue;
|
|
453
|
+
// Find the matching closing bracket using bracket counting
|
|
454
|
+
const startIdx = idx + prefix.length;
|
|
455
|
+
let depth = 1;
|
|
456
|
+
let endIdx = startIdx;
|
|
457
|
+
while (endIdx < result.length && depth > 0) {
|
|
458
|
+
const char = result[endIdx];
|
|
459
|
+
if (char === "<") {
|
|
460
|
+
depth++;
|
|
461
|
+
}
|
|
462
|
+
else if (char === ">") {
|
|
463
|
+
depth--;
|
|
464
|
+
}
|
|
465
|
+
endIdx++;
|
|
466
|
+
}
|
|
467
|
+
if (depth === 0) {
|
|
468
|
+
// Replace the entire pattern with "Function"
|
|
469
|
+
result = result.substring(0, idx) + "Function" + result.substring(endIdx);
|
|
470
|
+
modified = true;
|
|
471
|
+
break; // Start over to handle any new matches
|
|
472
|
+
}
|
|
473
|
+
// If depth > 0, the bracket is unbalanced - skip this match
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
return result;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Removes the temporary types that were injected during extraction.
|
|
480
|
+
* This ensures the original file remains unmodified.
|
|
481
|
+
*/
|
|
482
|
+
cleanupTemporaryTypes(sourceFile) {
|
|
483
|
+
for (const name of TEMP_TYPE_NAMES) {
|
|
484
|
+
const typeAlias = sourceFile.getTypeAlias(name);
|
|
485
|
+
if (typeAlias) {
|
|
486
|
+
typeAlias.remove();
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Escapes special characters in a string for use in a RegExp.
|
|
492
|
+
*/
|
|
493
|
+
escapeRegExp(str) {
|
|
494
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Checks if a string is a valid TypeScript identifier.
|
|
498
|
+
* Used to determine if a type name can be safely used in regex replacement.
|
|
499
|
+
*/
|
|
500
|
+
isValidIdentifier(str) {
|
|
501
|
+
return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(str);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"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"}
|