driftdetect-core 0.1.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boundaries/boundary-store.d.ts +92 -0
- package/dist/boundaries/boundary-store.d.ts.map +1 -0
- package/dist/boundaries/boundary-store.js +458 -0
- package/dist/boundaries/boundary-store.js.map +1 -0
- package/dist/boundaries/index.d.ts +8 -0
- package/dist/boundaries/index.d.ts.map +1 -0
- package/dist/boundaries/index.js +8 -0
- package/dist/boundaries/index.js.map +1 -0
- package/dist/boundaries/types.d.ts +237 -0
- package/dist/boundaries/types.d.ts.map +1 -0
- package/dist/boundaries/types.js +8 -0
- package/dist/boundaries/types.js.map +1 -0
- package/dist/dna/ai-context.d.ts +10 -0
- package/dist/dna/ai-context.d.ts.map +1 -0
- package/dist/dna/ai-context.js +46 -0
- package/dist/dna/ai-context.js.map +1 -0
- package/dist/dna/dna-analyzer.d.ts +34 -0
- package/dist/dna/dna-analyzer.d.ts.map +1 -0
- package/dist/dna/dna-analyzer.js +110 -0
- package/dist/dna/dna-analyzer.js.map +1 -0
- package/dist/dna/dna-store.d.ts +13 -0
- package/dist/dna/dna-store.d.ts.map +1 -0
- package/dist/dna/dna-store.js +43 -0
- package/dist/dna/dna-store.js.map +1 -0
- package/dist/dna/gene-extractors/animation-approach.d.ts +15 -0
- package/dist/dna/gene-extractors/animation-approach.d.ts.map +1 -0
- package/dist/dna/gene-extractors/animation-approach.js +97 -0
- package/dist/dna/gene-extractors/animation-approach.js.map +1 -0
- package/dist/dna/gene-extractors/base-extractor.d.ts +53 -0
- package/dist/dna/gene-extractors/base-extractor.d.ts.map +1 -0
- package/dist/dna/gene-extractors/base-extractor.js +76 -0
- package/dist/dna/gene-extractors/base-extractor.js.map +1 -0
- package/dist/dna/gene-extractors/index.d.ts +16 -0
- package/dist/dna/gene-extractors/index.d.ts.map +1 -0
- package/dist/dna/gene-extractors/index.js +38 -0
- package/dist/dna/gene-extractors/index.js.map +1 -0
- package/dist/dna/gene-extractors/responsive-approach.d.ts +10 -0
- package/dist/dna/gene-extractors/responsive-approach.d.ts.map +1 -0
- package/dist/dna/gene-extractors/responsive-approach.js +30 -0
- package/dist/dna/gene-extractors/responsive-approach.js.map +1 -0
- package/dist/dna/gene-extractors/spacing-philosophy.d.ts +10 -0
- package/dist/dna/gene-extractors/spacing-philosophy.d.ts.map +1 -0
- package/dist/dna/gene-extractors/spacing-philosophy.js +30 -0
- package/dist/dna/gene-extractors/spacing-philosophy.js.map +1 -0
- package/dist/dna/gene-extractors/state-styling.d.ts +10 -0
- package/dist/dna/gene-extractors/state-styling.d.ts.map +1 -0
- package/dist/dna/gene-extractors/state-styling.js +29 -0
- package/dist/dna/gene-extractors/state-styling.js.map +1 -0
- package/dist/dna/gene-extractors/theming.d.ts +10 -0
- package/dist/dna/gene-extractors/theming.d.ts.map +1 -0
- package/dist/dna/gene-extractors/theming.js +30 -0
- package/dist/dna/gene-extractors/theming.js.map +1 -0
- package/dist/dna/gene-extractors/variant-handling.d.ts +13 -0
- package/dist/dna/gene-extractors/variant-handling.d.ts.map +1 -0
- package/dist/dna/gene-extractors/variant-handling.js +38 -0
- package/dist/dna/gene-extractors/variant-handling.js.map +1 -0
- package/dist/dna/health-calculator.d.ts +21 -0
- package/dist/dna/health-calculator.d.ts.map +1 -0
- package/dist/dna/health-calculator.js +113 -0
- package/dist/dna/health-calculator.js.map +1 -0
- package/dist/dna/index.d.ts +21 -0
- package/dist/dna/index.d.ts.map +1 -0
- package/dist/dna/index.js +19 -0
- package/dist/dna/index.js.map +1 -0
- package/dist/dna/mutation-detector.d.ts +10 -0
- package/dist/dna/mutation-detector.d.ts.map +1 -0
- package/dist/dna/mutation-detector.js +39 -0
- package/dist/dna/mutation-detector.js.map +1 -0
- package/dist/dna/playbook-generator.d.ts +6 -0
- package/dist/dna/playbook-generator.d.ts.map +1 -0
- package/dist/dna/playbook-generator.js +53 -0
- package/dist/dna/playbook-generator.js.map +1 -0
- package/dist/dna/types.d.ts +95 -0
- package/dist/dna/types.d.ts.map +1 -0
- package/dist/dna/types.js +8 -0
- package/dist/dna/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/parsers/parser-manager.d.ts.map +1 -1
- package/dist/parsers/parser-manager.js +2 -0
- package/dist/parsers/parser-manager.js.map +1 -1
- package/dist/parsers/tree-sitter/config.d.ts +82 -0
- package/dist/parsers/tree-sitter/config.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/config.js +200 -0
- package/dist/parsers/tree-sitter/config.js.map +1 -0
- package/dist/parsers/tree-sitter/csharp-ast-converter.d.ts +64 -0
- package/dist/parsers/tree-sitter/csharp-ast-converter.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/csharp-ast-converter.js +271 -0
- package/dist/parsers/tree-sitter/csharp-ast-converter.js.map +1 -0
- package/dist/parsers/tree-sitter/csharp-loader.d.ts +43 -0
- package/dist/parsers/tree-sitter/csharp-loader.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/csharp-loader.js +146 -0
- package/dist/parsers/tree-sitter/csharp-loader.js.map +1 -0
- package/dist/parsers/tree-sitter/index.d.ts +26 -0
- package/dist/parsers/tree-sitter/index.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/index.js +47 -0
- package/dist/parsers/tree-sitter/index.js.map +1 -0
- package/dist/parsers/tree-sitter/java/annotation-extractor.d.ts +79 -0
- package/dist/parsers/tree-sitter/java/annotation-extractor.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/java/annotation-extractor.js +540 -0
- package/dist/parsers/tree-sitter/java/annotation-extractor.js.map +1 -0
- package/dist/parsers/tree-sitter/java/class-extractor.d.ts +40 -0
- package/dist/parsers/tree-sitter/java/class-extractor.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/java/class-extractor.js +770 -0
- package/dist/parsers/tree-sitter/java/class-extractor.js.map +1 -0
- package/dist/parsers/tree-sitter/java/index.d.ts +14 -0
- package/dist/parsers/tree-sitter/java/index.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/java/index.js +25 -0
- package/dist/parsers/tree-sitter/java/index.js.map +1 -0
- package/dist/parsers/tree-sitter/java/method-extractor.d.ts +88 -0
- package/dist/parsers/tree-sitter/java/method-extractor.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/java/method-extractor.js +551 -0
- package/dist/parsers/tree-sitter/java/method-extractor.js.map +1 -0
- package/dist/parsers/tree-sitter/java/types.d.ts +545 -0
- package/dist/parsers/tree-sitter/java/types.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/java/types.js +81 -0
- package/dist/parsers/tree-sitter/java/types.js.map +1 -0
- package/dist/parsers/tree-sitter/loader.d.ts +50 -0
- package/dist/parsers/tree-sitter/loader.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/loader.js +156 -0
- package/dist/parsers/tree-sitter/loader.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/config-extractor.d.ts +78 -0
- package/dist/parsers/tree-sitter/pydantic/config-extractor.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/config-extractor.js +278 -0
- package/dist/parsers/tree-sitter/pydantic/config-extractor.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/constraint-parser.d.ts +84 -0
- package/dist/parsers/tree-sitter/pydantic/constraint-parser.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/constraint-parser.js +321 -0
- package/dist/parsers/tree-sitter/pydantic/constraint-parser.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/field-extractor.d.ts +74 -0
- package/dist/parsers/tree-sitter/pydantic/field-extractor.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/field-extractor.js +285 -0
- package/dist/parsers/tree-sitter/pydantic/field-extractor.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/index.d.ts +18 -0
- package/dist/parsers/tree-sitter/pydantic/index.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/index.js +23 -0
- package/dist/parsers/tree-sitter/pydantic/index.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/inheritance-resolver.d.ts +70 -0
- package/dist/parsers/tree-sitter/pydantic/inheritance-resolver.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/inheritance-resolver.js +251 -0
- package/dist/parsers/tree-sitter/pydantic/inheritance-resolver.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/pydantic-extractor.d.ts +102 -0
- package/dist/parsers/tree-sitter/pydantic/pydantic-extractor.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/pydantic-extractor.js +399 -0
- package/dist/parsers/tree-sitter/pydantic/pydantic-extractor.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/type-resolver.d.ts +89 -0
- package/dist/parsers/tree-sitter/pydantic/type-resolver.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/type-resolver.js +426 -0
- package/dist/parsers/tree-sitter/pydantic/type-resolver.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/types.d.ts +177 -0
- package/dist/parsers/tree-sitter/pydantic/types.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/types.js +139 -0
- package/dist/parsers/tree-sitter/pydantic/types.js.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/validator-extractor.d.ts +88 -0
- package/dist/parsers/tree-sitter/pydantic/validator-extractor.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/pydantic/validator-extractor.js +315 -0
- package/dist/parsers/tree-sitter/pydantic/validator-extractor.js.map +1 -0
- package/dist/parsers/tree-sitter/python-ast-converter.d.ts +140 -0
- package/dist/parsers/tree-sitter/python-ast-converter.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/python-ast-converter.js +360 -0
- package/dist/parsers/tree-sitter/python-ast-converter.js.map +1 -0
- package/dist/parsers/tree-sitter/tree-sitter-csharp-parser.d.ts +465 -0
- package/dist/parsers/tree-sitter/tree-sitter-csharp-parser.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/tree-sitter-csharp-parser.js +1146 -0
- package/dist/parsers/tree-sitter/tree-sitter-csharp-parser.js.map +1 -0
- package/dist/parsers/tree-sitter/tree-sitter-python-parser.d.ts +86 -0
- package/dist/parsers/tree-sitter/tree-sitter-python-parser.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/tree-sitter-python-parser.js +177 -0
- package/dist/parsers/tree-sitter/tree-sitter-python-parser.js.map +1 -0
- package/dist/parsers/tree-sitter/types.d.ts +399 -0
- package/dist/parsers/tree-sitter/types.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/types.js +20 -0
- package/dist/parsers/tree-sitter/types.js.map +1 -0
- package/dist/parsers/types.d.ts +1 -1
- package/dist/parsers/types.d.ts.map +1 -1
- package/dist/scanner/file-walker.d.ts.map +1 -1
- package/dist/scanner/file-walker.js +5 -0
- package/dist/scanner/file-walker.js.map +1 -1
- package/dist/store/history-store.d.ts +85 -269
- package/dist/store/history-store.d.ts.map +1 -1
- package/dist/store/history-store.js +272 -624
- package/dist/store/history-store.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/java-type-mapping.d.ts +79 -0
- package/dist/types/java-type-mapping.d.ts.map +1 -0
- package/dist/types/java-type-mapping.js +290 -0
- package/dist/types/java-type-mapping.js.map +1 -0
- package/package.json +8 -3
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pydantic Field Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts field definitions from Pydantic model class bodies.
|
|
5
|
+
* Handles annotated assignments, Field() calls, and default values.
|
|
6
|
+
*
|
|
7
|
+
* @module pydantic/field-extractor
|
|
8
|
+
*/
|
|
9
|
+
import { extractPositionRange } from './types.js';
|
|
10
|
+
import { TypeResolver } from './type-resolver.js';
|
|
11
|
+
import { ConstraintParser } from './constraint-parser.js';
|
|
12
|
+
// ============================================
|
|
13
|
+
// Field Extractor Class
|
|
14
|
+
// ============================================
|
|
15
|
+
/**
|
|
16
|
+
* Extracts Pydantic field definitions from class bodies.
|
|
17
|
+
*
|
|
18
|
+
* Handles:
|
|
19
|
+
* - Simple annotations: `name: str`
|
|
20
|
+
* - Annotations with defaults: `name: str = "default"`
|
|
21
|
+
* - Field() calls: `name: str = Field(default="value", min_length=1)`
|
|
22
|
+
* - Optional fields: `name: Optional[str] = None`
|
|
23
|
+
*/
|
|
24
|
+
export class FieldExtractor {
|
|
25
|
+
typeResolver;
|
|
26
|
+
constraintParser;
|
|
27
|
+
constructor() {
|
|
28
|
+
this.typeResolver = new TypeResolver();
|
|
29
|
+
this.constraintParser = new ConstraintParser();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Extract all fields from a class body node.
|
|
33
|
+
*
|
|
34
|
+
* @param bodyNode - The class body (block) node
|
|
35
|
+
* @param context - Extraction context
|
|
36
|
+
* @returns Array of extracted field information
|
|
37
|
+
*/
|
|
38
|
+
extractFields(bodyNode, context) {
|
|
39
|
+
const fields = [];
|
|
40
|
+
for (const child of bodyNode.namedChildren) {
|
|
41
|
+
const field = this.extractField(child, context);
|
|
42
|
+
if (field) {
|
|
43
|
+
fields.push(field);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return fields;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extract a single field from an AST node.
|
|
50
|
+
*
|
|
51
|
+
* @param node - AST node (expression_statement or typed_assignment)
|
|
52
|
+
* @param context - Extraction context
|
|
53
|
+
* @returns Field info or null if not a field
|
|
54
|
+
*/
|
|
55
|
+
extractField(node, context) {
|
|
56
|
+
// Handle expression_statement wrapper
|
|
57
|
+
if (node.type === 'expression_statement') {
|
|
58
|
+
const inner = node.namedChildren[0];
|
|
59
|
+
if (!inner)
|
|
60
|
+
return null;
|
|
61
|
+
return this.extractField(inner, context);
|
|
62
|
+
}
|
|
63
|
+
// Must be an assignment with type annotation
|
|
64
|
+
if (node.type !== 'assignment') {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const rawData = this.extractRawFieldData(node);
|
|
68
|
+
if (!rawData) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return this.processRawField(rawData, context);
|
|
72
|
+
}
|
|
73
|
+
// ============================================
|
|
74
|
+
// Raw Data Extraction
|
|
75
|
+
// ============================================
|
|
76
|
+
/**
|
|
77
|
+
* Extract raw field data from an assignment node.
|
|
78
|
+
*/
|
|
79
|
+
extractRawFieldData(node) {
|
|
80
|
+
// Get the left side (should be identifier with type annotation)
|
|
81
|
+
const left = node.childForFieldName('left');
|
|
82
|
+
if (!left)
|
|
83
|
+
return null;
|
|
84
|
+
// Check for type annotation
|
|
85
|
+
const typeNode = node.childForFieldName('type');
|
|
86
|
+
// Get field name
|
|
87
|
+
let name;
|
|
88
|
+
if (left.type === 'identifier') {
|
|
89
|
+
name = left.text;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
return null; // Not a simple field assignment
|
|
93
|
+
}
|
|
94
|
+
// Skip private/dunder fields
|
|
95
|
+
if (name.startsWith('_')) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Get type annotation
|
|
99
|
+
const typeAnnotation = typeNode?.text ?? null;
|
|
100
|
+
// Get right side (default value)
|
|
101
|
+
const right = node.childForFieldName('right');
|
|
102
|
+
const defaultValue = right?.text ?? null;
|
|
103
|
+
// Check if Field() is used
|
|
104
|
+
const { usesField, fieldArguments } = this.parseFieldCall(right);
|
|
105
|
+
return {
|
|
106
|
+
name,
|
|
107
|
+
typeAnnotation,
|
|
108
|
+
defaultValue,
|
|
109
|
+
usesField,
|
|
110
|
+
fieldArguments,
|
|
111
|
+
node,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Parse a Field() call and extract arguments.
|
|
116
|
+
*/
|
|
117
|
+
parseFieldCall(node) {
|
|
118
|
+
if (!node) {
|
|
119
|
+
return { usesField: false, fieldArguments: [] };
|
|
120
|
+
}
|
|
121
|
+
// Check if this is a call to Field
|
|
122
|
+
if (node.type !== 'call') {
|
|
123
|
+
return { usesField: false, fieldArguments: [] };
|
|
124
|
+
}
|
|
125
|
+
const funcNode = node.childForFieldName('function');
|
|
126
|
+
if (!funcNode) {
|
|
127
|
+
return { usesField: false, fieldArguments: [] };
|
|
128
|
+
}
|
|
129
|
+
// Check function name
|
|
130
|
+
const funcName = funcNode.text;
|
|
131
|
+
if (funcName !== 'Field' && !funcName.endsWith('.Field')) {
|
|
132
|
+
return { usesField: false, fieldArguments: [] };
|
|
133
|
+
}
|
|
134
|
+
// Extract arguments
|
|
135
|
+
const argsNode = node.childForFieldName('arguments');
|
|
136
|
+
const fieldArguments = this.extractCallArguments(argsNode);
|
|
137
|
+
return { usesField: true, fieldArguments };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Extract arguments from a call's argument_list.
|
|
141
|
+
*/
|
|
142
|
+
extractCallArguments(argsNode) {
|
|
143
|
+
if (!argsNode)
|
|
144
|
+
return [];
|
|
145
|
+
const args = [];
|
|
146
|
+
for (const child of argsNode.namedChildren) {
|
|
147
|
+
if (child.type === 'keyword_argument') {
|
|
148
|
+
const nameNode = child.childForFieldName('name');
|
|
149
|
+
const valueNode = child.childForFieldName('value');
|
|
150
|
+
if (nameNode && valueNode) {
|
|
151
|
+
args.push({
|
|
152
|
+
name: nameNode.text,
|
|
153
|
+
value: valueNode.text,
|
|
154
|
+
isKeyword: true,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Positional argument
|
|
160
|
+
args.push({
|
|
161
|
+
name: null,
|
|
162
|
+
value: child.text,
|
|
163
|
+
isKeyword: false,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return args;
|
|
168
|
+
}
|
|
169
|
+
// ============================================
|
|
170
|
+
// Field Processing
|
|
171
|
+
// ============================================
|
|
172
|
+
/**
|
|
173
|
+
* Process raw field data into PydanticFieldInfo.
|
|
174
|
+
*/
|
|
175
|
+
processRawField(raw, context) {
|
|
176
|
+
// Resolve type
|
|
177
|
+
const typeInfo = raw.typeAnnotation
|
|
178
|
+
? this.typeResolver.resolve(raw.typeAnnotation, context)
|
|
179
|
+
: this.typeResolver.createUnknownType();
|
|
180
|
+
// Parse constraints from Field() arguments
|
|
181
|
+
const constraints = raw.usesField
|
|
182
|
+
? this.constraintParser.parseConstraints(raw.fieldArguments)
|
|
183
|
+
: this.createEmptyConstraints();
|
|
184
|
+
// Determine if field is required
|
|
185
|
+
const required = this.isFieldRequired(raw, typeInfo.isOptional);
|
|
186
|
+
// Extract alias and description from constraints
|
|
187
|
+
const alias = this.extractStringConstraint(raw.fieldArguments, 'alias');
|
|
188
|
+
const description = this.extractStringConstraint(raw.fieldArguments, 'description');
|
|
189
|
+
// Get default value (excluding Field() call)
|
|
190
|
+
const defaultValue = this.extractDefaultValue(raw);
|
|
191
|
+
// Build position info
|
|
192
|
+
const positions = context.includePositions
|
|
193
|
+
? extractPositionRange(raw.node)
|
|
194
|
+
: { startPosition: { row: 0, column: 0 }, endPosition: { row: 0, column: 0 } };
|
|
195
|
+
return {
|
|
196
|
+
name: raw.name,
|
|
197
|
+
type: typeInfo,
|
|
198
|
+
defaultValue,
|
|
199
|
+
hasDefault: raw.defaultValue !== null,
|
|
200
|
+
usesField: raw.usesField,
|
|
201
|
+
constraints,
|
|
202
|
+
alias,
|
|
203
|
+
description,
|
|
204
|
+
required,
|
|
205
|
+
...positions,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Determine if a field is required.
|
|
210
|
+
*/
|
|
211
|
+
isFieldRequired(raw, isOptional) {
|
|
212
|
+
// If Optional type, not required
|
|
213
|
+
if (isOptional)
|
|
214
|
+
return false;
|
|
215
|
+
// If has default value, not required
|
|
216
|
+
if (raw.defaultValue !== null)
|
|
217
|
+
return false;
|
|
218
|
+
// If Field() with default or default_factory, not required
|
|
219
|
+
if (raw.usesField) {
|
|
220
|
+
const hasDefault = raw.fieldArguments.some((arg) => arg.name === 'default' || arg.name === 'default_factory');
|
|
221
|
+
if (hasDefault)
|
|
222
|
+
return false;
|
|
223
|
+
// Check for ... (Ellipsis) as first positional arg (required marker)
|
|
224
|
+
const firstPositional = raw.fieldArguments.find((arg) => !arg.isKeyword);
|
|
225
|
+
if (firstPositional?.value === '...')
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Extract the actual default value (not Field() call).
|
|
232
|
+
*/
|
|
233
|
+
extractDefaultValue(raw) {
|
|
234
|
+
if (!raw.defaultValue)
|
|
235
|
+
return null;
|
|
236
|
+
// If using Field(), extract default from arguments
|
|
237
|
+
if (raw.usesField) {
|
|
238
|
+
const defaultArg = raw.fieldArguments.find((arg) => arg.name === 'default');
|
|
239
|
+
if (defaultArg) {
|
|
240
|
+
return defaultArg.value;
|
|
241
|
+
}
|
|
242
|
+
// Check first positional argument (if not ...)
|
|
243
|
+
const firstPositional = raw.fieldArguments.find((arg) => !arg.isKeyword);
|
|
244
|
+
if (firstPositional && firstPositional.value !== '...') {
|
|
245
|
+
return firstPositional.value;
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
return raw.defaultValue;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Extract a string constraint value.
|
|
253
|
+
*/
|
|
254
|
+
extractStringConstraint(args, name) {
|
|
255
|
+
const arg = args.find((a) => a.name === name);
|
|
256
|
+
if (!arg)
|
|
257
|
+
return null;
|
|
258
|
+
// Remove quotes from string value
|
|
259
|
+
const value = arg.value;
|
|
260
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
261
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
262
|
+
return value.slice(1, -1);
|
|
263
|
+
}
|
|
264
|
+
return value;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Create empty constraints object.
|
|
268
|
+
*/
|
|
269
|
+
createEmptyConstraints() {
|
|
270
|
+
return {
|
|
271
|
+
ge: null,
|
|
272
|
+
le: null,
|
|
273
|
+
gt: null,
|
|
274
|
+
lt: null,
|
|
275
|
+
minLength: null,
|
|
276
|
+
maxLength: null,
|
|
277
|
+
pattern: null,
|
|
278
|
+
multipleOf: null,
|
|
279
|
+
frozen: false,
|
|
280
|
+
validators: [],
|
|
281
|
+
jsonSchemaExtra: null,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=field-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-extractor.js","sourceRoot":"","sources":["../../../../src/parsers/tree-sitter/pydantic/field-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pydantic Module
|
|
3
|
+
*
|
|
4
|
+
* Public exports for Pydantic model extraction functionality.
|
|
5
|
+
* Provides comprehensive parsing of Pydantic v1 and v2 models.
|
|
6
|
+
*
|
|
7
|
+
* @module pydantic
|
|
8
|
+
*/
|
|
9
|
+
export { PydanticExtractor, modelsToContractFields, findModel, getModelNames } from './pydantic-extractor.js';
|
|
10
|
+
export { FieldExtractor } from './field-extractor.js';
|
|
11
|
+
export { TypeResolver } from './type-resolver.js';
|
|
12
|
+
export { ConstraintParser, hasNumericConstraints, hasStringConstraints, hasAnyConstraints, mergeConstraints } from './constraint-parser.js';
|
|
13
|
+
export { ValidatorExtractor } from './validator-extractor.js';
|
|
14
|
+
export { ConfigExtractor } from './config-extractor.js';
|
|
15
|
+
export { InheritanceResolver } from './inheritance-resolver.js';
|
|
16
|
+
export type { ExtractionContext, RawFieldData, FieldArgument, ParsedType, RawValidatorData, ValidatorDecoratorType, ValidatorMode, RawConfigData, ConfigValue, BaseClassInfo, } from './types.js';
|
|
17
|
+
export { createExtractionContext, PYTHON_TYPE_MAP, NUMERIC_CONSTRAINTS, STRING_CONSTRAINTS, ALL_CONSTRAINTS, PYDANTIC_BASE_CLASSES, extractPosition, extractPositionRange, } from './types.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/parsers/tree-sitter/pydantic/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM9G,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5I,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAMhE,YAAY,EACV,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pydantic Module
|
|
3
|
+
*
|
|
4
|
+
* Public exports for Pydantic model extraction functionality.
|
|
5
|
+
* Provides comprehensive parsing of Pydantic v1 and v2 models.
|
|
6
|
+
*
|
|
7
|
+
* @module pydantic
|
|
8
|
+
*/
|
|
9
|
+
// ============================================
|
|
10
|
+
// Main Extractor
|
|
11
|
+
// ============================================
|
|
12
|
+
export { PydanticExtractor, modelsToContractFields, findModel, getModelNames } from './pydantic-extractor.js';
|
|
13
|
+
// ============================================
|
|
14
|
+
// Individual Extractors
|
|
15
|
+
// ============================================
|
|
16
|
+
export { FieldExtractor } from './field-extractor.js';
|
|
17
|
+
export { TypeResolver } from './type-resolver.js';
|
|
18
|
+
export { ConstraintParser, hasNumericConstraints, hasStringConstraints, hasAnyConstraints, mergeConstraints } from './constraint-parser.js';
|
|
19
|
+
export { ValidatorExtractor } from './validator-extractor.js';
|
|
20
|
+
export { ConfigExtractor } from './config-extractor.js';
|
|
21
|
+
export { InheritanceResolver } from './inheritance-resolver.js';
|
|
22
|
+
export { createExtractionContext, PYTHON_TYPE_MAP, NUMERIC_CONSTRAINTS, STRING_CONSTRAINTS, ALL_CONSTRAINTS, PYDANTIC_BASE_CLASSES, extractPosition, extractPositionRange, } from './types.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/parsers/tree-sitter/pydantic/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+CAA+C;AAC/C,iBAAiB;AACjB,+CAA+C;AAE/C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE9G,+CAA+C;AAC/C,wBAAwB;AACxB,+CAA+C;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5I,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAmBhE,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pydantic Inheritance Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves model inheritance chains and merges fields from parent classes.
|
|
5
|
+
* Handles multiple inheritance and generic type substitution.
|
|
6
|
+
*
|
|
7
|
+
* @module pydantic/inheritance-resolver
|
|
8
|
+
*/
|
|
9
|
+
import type { PydanticModelInfo, PydanticFieldInfo } from '../types.js';
|
|
10
|
+
import type { BaseClassInfo } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Resolves Pydantic model inheritance.
|
|
13
|
+
*
|
|
14
|
+
* Handles:
|
|
15
|
+
* - Single inheritance: class Child(Parent)
|
|
16
|
+
* - Multiple inheritance: class Child(Parent1, Parent2)
|
|
17
|
+
* - Generic inheritance: class Child(Response[User])
|
|
18
|
+
* - Mixin classes
|
|
19
|
+
*/
|
|
20
|
+
export declare class InheritanceResolver {
|
|
21
|
+
/**
|
|
22
|
+
* Resolve all fields for a model including inherited fields.
|
|
23
|
+
*
|
|
24
|
+
* @param model - The model to resolve fields for
|
|
25
|
+
* @param allModels - Map of all known models by name
|
|
26
|
+
* @returns Array of all fields (inherited + own)
|
|
27
|
+
*/
|
|
28
|
+
resolveFields(model: PydanticModelInfo, allModels: Map<string, PydanticModelInfo>): PydanticFieldInfo[];
|
|
29
|
+
/**
|
|
30
|
+
* Recursively resolve fields from inheritance chain.
|
|
31
|
+
*/
|
|
32
|
+
private resolveFieldsRecursive;
|
|
33
|
+
/**
|
|
34
|
+
* Parse a base class string into structured info.
|
|
35
|
+
*/
|
|
36
|
+
parseBaseClass(baseStr: string): BaseClassInfo;
|
|
37
|
+
/**
|
|
38
|
+
* Parse generic type arguments.
|
|
39
|
+
*/
|
|
40
|
+
private parseTypeArgs;
|
|
41
|
+
/**
|
|
42
|
+
* Substitute generic type parameters in fields.
|
|
43
|
+
*/
|
|
44
|
+
private substituteGenericTypes;
|
|
45
|
+
/**
|
|
46
|
+
* Find generic type parameters from a model's bases.
|
|
47
|
+
*/
|
|
48
|
+
private findGenericParams;
|
|
49
|
+
/**
|
|
50
|
+
* Substitute type parameters in a TypeInfo.
|
|
51
|
+
*/
|
|
52
|
+
private substituteType;
|
|
53
|
+
/**
|
|
54
|
+
* Get the full inheritance chain for a model.
|
|
55
|
+
*/
|
|
56
|
+
getInheritanceChain(model: PydanticModelInfo, allModels: Map<string, PydanticModelInfo>): PydanticModelInfo[];
|
|
57
|
+
/**
|
|
58
|
+
* Recursively build inheritance chain.
|
|
59
|
+
*/
|
|
60
|
+
private buildInheritanceChain;
|
|
61
|
+
/**
|
|
62
|
+
* Check if a model inherits from another.
|
|
63
|
+
*/
|
|
64
|
+
inheritsFrom(model: PydanticModelInfo, ancestorName: string, allModels: Map<string, PydanticModelInfo>): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Find all models that inherit from a given model.
|
|
67
|
+
*/
|
|
68
|
+
findDescendants(ancestorName: string, allModels: Map<string, PydanticModelInfo>): PydanticModelInfo[];
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=inheritance-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance-resolver.d.ts","sourceRoot":"","sources":["../../../../src/parsers/tree-sitter/pydantic/inheritance-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAY,MAAM,aAAa,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAOhD;;;;;;;;GAQG;AACH,qBAAa,mBAAmB;IAC9B;;;;;;OAMG;IACH,aAAa,CACX,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GACxC,iBAAiB,EAAE;IAKtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;IA2B9C;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyB9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,mBAAmB,CACjB,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GACxC,iBAAiB,EAAE;IAStB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA6B7B;;OAEG;IACH,YAAY,CACV,KAAK,EAAE,iBAAiB,EACxB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GACxC,OAAO;IAKV;;OAEG;IACH,eAAe,CACb,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GACxC,iBAAiB,EAAE;CAYvB"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pydantic Inheritance Resolver
|
|
3
|
+
*
|
|
4
|
+
* Resolves model inheritance chains and merges fields from parent classes.
|
|
5
|
+
* Handles multiple inheritance and generic type substitution.
|
|
6
|
+
*
|
|
7
|
+
* @module pydantic/inheritance-resolver
|
|
8
|
+
*/
|
|
9
|
+
import { PYDANTIC_BASE_CLASSES } from './types.js';
|
|
10
|
+
// ============================================
|
|
11
|
+
// Inheritance Resolver Class
|
|
12
|
+
// ============================================
|
|
13
|
+
/**
|
|
14
|
+
* Resolves Pydantic model inheritance.
|
|
15
|
+
*
|
|
16
|
+
* Handles:
|
|
17
|
+
* - Single inheritance: class Child(Parent)
|
|
18
|
+
* - Multiple inheritance: class Child(Parent1, Parent2)
|
|
19
|
+
* - Generic inheritance: class Child(Response[User])
|
|
20
|
+
* - Mixin classes
|
|
21
|
+
*/
|
|
22
|
+
export class InheritanceResolver {
|
|
23
|
+
/**
|
|
24
|
+
* Resolve all fields for a model including inherited fields.
|
|
25
|
+
*
|
|
26
|
+
* @param model - The model to resolve fields for
|
|
27
|
+
* @param allModels - Map of all known models by name
|
|
28
|
+
* @returns Array of all fields (inherited + own)
|
|
29
|
+
*/
|
|
30
|
+
resolveFields(model, allModels) {
|
|
31
|
+
const visited = new Set();
|
|
32
|
+
return this.resolveFieldsRecursive(model, allModels, visited);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Recursively resolve fields from inheritance chain.
|
|
36
|
+
*/
|
|
37
|
+
resolveFieldsRecursive(model, allModels, visited) {
|
|
38
|
+
// Prevent infinite recursion
|
|
39
|
+
if (visited.has(model.name)) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
visited.add(model.name);
|
|
43
|
+
const inheritedFields = [];
|
|
44
|
+
// Process base classes in order (MRO)
|
|
45
|
+
for (const baseName of model.bases) {
|
|
46
|
+
const baseInfo = this.parseBaseClass(baseName);
|
|
47
|
+
// Skip Pydantic base classes
|
|
48
|
+
if (baseInfo.isPydanticBase) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
// Skip Generic[T]
|
|
52
|
+
if (baseInfo.isGeneric) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Find the parent model
|
|
56
|
+
const parentModel = allModels.get(baseInfo.name);
|
|
57
|
+
if (!parentModel) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Recursively get parent fields
|
|
61
|
+
const parentFields = this.resolveFieldsRecursive(parentModel, allModels, visited);
|
|
62
|
+
// Apply generic type substitution if needed
|
|
63
|
+
const substitutedFields = baseInfo.typeArgs.length > 0
|
|
64
|
+
? this.substituteGenericTypes(parentFields, parentModel, baseInfo.typeArgs)
|
|
65
|
+
: parentFields;
|
|
66
|
+
// Add parent fields (avoiding duplicates)
|
|
67
|
+
for (const field of substitutedFields) {
|
|
68
|
+
if (!inheritedFields.some((f) => f.name === field.name)) {
|
|
69
|
+
inheritedFields.push({ ...field });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Add own fields (override inherited)
|
|
74
|
+
const allFields = [...inheritedFields];
|
|
75
|
+
for (const field of model.fields) {
|
|
76
|
+
const existingIndex = allFields.findIndex((f) => f.name === field.name);
|
|
77
|
+
if (existingIndex >= 0) {
|
|
78
|
+
allFields[existingIndex] = field;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
allFields.push(field);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return allFields;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parse a base class string into structured info.
|
|
88
|
+
*/
|
|
89
|
+
parseBaseClass(baseStr) {
|
|
90
|
+
// Check for generic: Parent[T, U]
|
|
91
|
+
const genericMatch = baseStr.match(/^(\w+(?:\.\w+)*)\s*\[(.+)\]$/);
|
|
92
|
+
if (genericMatch) {
|
|
93
|
+
const [, name, argsStr] = genericMatch;
|
|
94
|
+
const typeArgs = this.parseTypeArgs(argsStr ?? '');
|
|
95
|
+
return {
|
|
96
|
+
name: name ?? '',
|
|
97
|
+
fullName: null,
|
|
98
|
+
typeArgs,
|
|
99
|
+
isPydanticBase: PYDANTIC_BASE_CLASSES.has(name ?? ''),
|
|
100
|
+
isGeneric: name === 'Generic',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Simple base class
|
|
104
|
+
return {
|
|
105
|
+
name: baseStr,
|
|
106
|
+
fullName: null,
|
|
107
|
+
typeArgs: [],
|
|
108
|
+
isPydanticBase: PYDANTIC_BASE_CLASSES.has(baseStr),
|
|
109
|
+
isGeneric: baseStr === 'Generic',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Parse generic type arguments.
|
|
114
|
+
*/
|
|
115
|
+
parseTypeArgs(argsStr) {
|
|
116
|
+
const args = [];
|
|
117
|
+
let current = '';
|
|
118
|
+
let depth = 0;
|
|
119
|
+
for (const char of argsStr) {
|
|
120
|
+
if (char === '[' || char === '(') {
|
|
121
|
+
depth++;
|
|
122
|
+
current += char;
|
|
123
|
+
}
|
|
124
|
+
else if (char === ']' || char === ')') {
|
|
125
|
+
depth--;
|
|
126
|
+
current += char;
|
|
127
|
+
}
|
|
128
|
+
else if (char === ',' && depth === 0) {
|
|
129
|
+
if (current.trim()) {
|
|
130
|
+
args.push(current.trim());
|
|
131
|
+
}
|
|
132
|
+
current = '';
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
current += char;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (current.trim()) {
|
|
139
|
+
args.push(current.trim());
|
|
140
|
+
}
|
|
141
|
+
return args;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Substitute generic type parameters in fields.
|
|
145
|
+
*/
|
|
146
|
+
substituteGenericTypes(fields, parentModel, typeArgs) {
|
|
147
|
+
// Find generic parameters from parent (e.g., T, U from Generic[T, U])
|
|
148
|
+
const genericParams = this.findGenericParams(parentModel);
|
|
149
|
+
if (genericParams.length === 0 || genericParams.length !== typeArgs.length) {
|
|
150
|
+
return fields;
|
|
151
|
+
}
|
|
152
|
+
// Create substitution map
|
|
153
|
+
const substitutions = new Map();
|
|
154
|
+
for (let i = 0; i < genericParams.length; i++) {
|
|
155
|
+
substitutions.set(genericParams[i], typeArgs[i]);
|
|
156
|
+
}
|
|
157
|
+
// Apply substitutions to fields
|
|
158
|
+
return fields.map((field) => ({
|
|
159
|
+
...field,
|
|
160
|
+
type: this.substituteType(field.type, substitutions),
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Find generic type parameters from a model's bases.
|
|
165
|
+
*/
|
|
166
|
+
findGenericParams(model) {
|
|
167
|
+
for (const base of model.bases) {
|
|
168
|
+
if (base.startsWith('Generic[')) {
|
|
169
|
+
const match = base.match(/^Generic\[(.+)\]$/);
|
|
170
|
+
if (match) {
|
|
171
|
+
return this.parseTypeArgs(match[1] ?? '');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Substitute type parameters in a TypeInfo.
|
|
179
|
+
*/
|
|
180
|
+
substituteType(type, substitutions) {
|
|
181
|
+
// Check if base type should be substituted
|
|
182
|
+
const substituted = substitutions.get(type.base);
|
|
183
|
+
if (substituted) {
|
|
184
|
+
return {
|
|
185
|
+
...type,
|
|
186
|
+
base: substituted,
|
|
187
|
+
raw: type.raw.replace(type.base, substituted),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Recursively substitute in type arguments
|
|
191
|
+
if (type.args.length > 0) {
|
|
192
|
+
return {
|
|
193
|
+
...type,
|
|
194
|
+
args: type.args.map((arg) => this.substituteType(arg, substitutions)),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
return type;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get the full inheritance chain for a model.
|
|
201
|
+
*/
|
|
202
|
+
getInheritanceChain(model, allModels) {
|
|
203
|
+
const chain = [];
|
|
204
|
+
const visited = new Set();
|
|
205
|
+
this.buildInheritanceChain(model, allModels, chain, visited);
|
|
206
|
+
return chain;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Recursively build inheritance chain.
|
|
210
|
+
*/
|
|
211
|
+
buildInheritanceChain(model, allModels, chain, visited) {
|
|
212
|
+
if (visited.has(model.name)) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
visited.add(model.name);
|
|
216
|
+
// Add parents first (depth-first)
|
|
217
|
+
for (const baseName of model.bases) {
|
|
218
|
+
const baseInfo = this.parseBaseClass(baseName);
|
|
219
|
+
if (baseInfo.isPydanticBase || baseInfo.isGeneric) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const parentModel = allModels.get(baseInfo.name);
|
|
223
|
+
if (parentModel) {
|
|
224
|
+
this.buildInheritanceChain(parentModel, allModels, chain, visited);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Add this model
|
|
228
|
+
chain.push(model);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Check if a model inherits from another.
|
|
232
|
+
*/
|
|
233
|
+
inheritsFrom(model, ancestorName, allModels) {
|
|
234
|
+
const chain = this.getInheritanceChain(model, allModels);
|
|
235
|
+
return chain.some((m) => m.name === ancestorName);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Find all models that inherit from a given model.
|
|
239
|
+
*/
|
|
240
|
+
findDescendants(ancestorName, allModels) {
|
|
241
|
+
const descendants = [];
|
|
242
|
+
for (const model of allModels.values()) {
|
|
243
|
+
if (model.name !== ancestorName &&
|
|
244
|
+
this.inheritsFrom(model, ancestorName, allModels)) {
|
|
245
|
+
descendants.push(model);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return descendants;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=inheritance-resolver.js.map
|