driftdetect-core 0.1.3 → 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.
Files changed (193) hide show
  1. package/dist/boundaries/boundary-store.d.ts +92 -0
  2. package/dist/boundaries/boundary-store.d.ts.map +1 -0
  3. package/dist/boundaries/boundary-store.js +458 -0
  4. package/dist/boundaries/boundary-store.js.map +1 -0
  5. package/dist/boundaries/index.d.ts +8 -0
  6. package/dist/boundaries/index.d.ts.map +1 -0
  7. package/dist/boundaries/index.js +8 -0
  8. package/dist/boundaries/index.js.map +1 -0
  9. package/dist/boundaries/types.d.ts +237 -0
  10. package/dist/boundaries/types.d.ts.map +1 -0
  11. package/dist/boundaries/types.js +8 -0
  12. package/dist/boundaries/types.js.map +1 -0
  13. package/dist/dna/ai-context.d.ts +10 -0
  14. package/dist/dna/ai-context.d.ts.map +1 -0
  15. package/dist/dna/ai-context.js +46 -0
  16. package/dist/dna/ai-context.js.map +1 -0
  17. package/dist/dna/dna-analyzer.d.ts +34 -0
  18. package/dist/dna/dna-analyzer.d.ts.map +1 -0
  19. package/dist/dna/dna-analyzer.js +110 -0
  20. package/dist/dna/dna-analyzer.js.map +1 -0
  21. package/dist/dna/dna-store.d.ts +13 -0
  22. package/dist/dna/dna-store.d.ts.map +1 -0
  23. package/dist/dna/dna-store.js +43 -0
  24. package/dist/dna/dna-store.js.map +1 -0
  25. package/dist/dna/gene-extractors/animation-approach.d.ts +15 -0
  26. package/dist/dna/gene-extractors/animation-approach.d.ts.map +1 -0
  27. package/dist/dna/gene-extractors/animation-approach.js +97 -0
  28. package/dist/dna/gene-extractors/animation-approach.js.map +1 -0
  29. package/dist/dna/gene-extractors/base-extractor.d.ts +53 -0
  30. package/dist/dna/gene-extractors/base-extractor.d.ts.map +1 -0
  31. package/dist/dna/gene-extractors/base-extractor.js +76 -0
  32. package/dist/dna/gene-extractors/base-extractor.js.map +1 -0
  33. package/dist/dna/gene-extractors/index.d.ts +16 -0
  34. package/dist/dna/gene-extractors/index.d.ts.map +1 -0
  35. package/dist/dna/gene-extractors/index.js +38 -0
  36. package/dist/dna/gene-extractors/index.js.map +1 -0
  37. package/dist/dna/gene-extractors/responsive-approach.d.ts +10 -0
  38. package/dist/dna/gene-extractors/responsive-approach.d.ts.map +1 -0
  39. package/dist/dna/gene-extractors/responsive-approach.js +30 -0
  40. package/dist/dna/gene-extractors/responsive-approach.js.map +1 -0
  41. package/dist/dna/gene-extractors/spacing-philosophy.d.ts +10 -0
  42. package/dist/dna/gene-extractors/spacing-philosophy.d.ts.map +1 -0
  43. package/dist/dna/gene-extractors/spacing-philosophy.js +30 -0
  44. package/dist/dna/gene-extractors/spacing-philosophy.js.map +1 -0
  45. package/dist/dna/gene-extractors/state-styling.d.ts +10 -0
  46. package/dist/dna/gene-extractors/state-styling.d.ts.map +1 -0
  47. package/dist/dna/gene-extractors/state-styling.js +29 -0
  48. package/dist/dna/gene-extractors/state-styling.js.map +1 -0
  49. package/dist/dna/gene-extractors/theming.d.ts +10 -0
  50. package/dist/dna/gene-extractors/theming.d.ts.map +1 -0
  51. package/dist/dna/gene-extractors/theming.js +30 -0
  52. package/dist/dna/gene-extractors/theming.js.map +1 -0
  53. package/dist/dna/gene-extractors/variant-handling.d.ts +13 -0
  54. package/dist/dna/gene-extractors/variant-handling.d.ts.map +1 -0
  55. package/dist/dna/gene-extractors/variant-handling.js +38 -0
  56. package/dist/dna/gene-extractors/variant-handling.js.map +1 -0
  57. package/dist/dna/health-calculator.d.ts +21 -0
  58. package/dist/dna/health-calculator.d.ts.map +1 -0
  59. package/dist/dna/health-calculator.js +113 -0
  60. package/dist/dna/health-calculator.js.map +1 -0
  61. package/dist/dna/index.d.ts +21 -0
  62. package/dist/dna/index.d.ts.map +1 -0
  63. package/dist/dna/index.js +19 -0
  64. package/dist/dna/index.js.map +1 -0
  65. package/dist/dna/mutation-detector.d.ts +10 -0
  66. package/dist/dna/mutation-detector.d.ts.map +1 -0
  67. package/dist/dna/mutation-detector.js +39 -0
  68. package/dist/dna/mutation-detector.js.map +1 -0
  69. package/dist/dna/playbook-generator.d.ts +6 -0
  70. package/dist/dna/playbook-generator.d.ts.map +1 -0
  71. package/dist/dna/playbook-generator.js +53 -0
  72. package/dist/dna/playbook-generator.js.map +1 -0
  73. package/dist/dna/types.d.ts +95 -0
  74. package/dist/dna/types.d.ts.map +1 -0
  75. package/dist/dna/types.js +8 -0
  76. package/dist/dna/types.js.map +1 -0
  77. package/dist/index.d.ts +7 -0
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +10 -0
  80. package/dist/index.js.map +1 -1
  81. package/dist/parsers/parser-manager.d.ts.map +1 -1
  82. package/dist/parsers/parser-manager.js +2 -0
  83. package/dist/parsers/parser-manager.js.map +1 -1
  84. package/dist/parsers/tree-sitter/config.d.ts +82 -0
  85. package/dist/parsers/tree-sitter/config.d.ts.map +1 -0
  86. package/dist/parsers/tree-sitter/config.js +200 -0
  87. package/dist/parsers/tree-sitter/config.js.map +1 -0
  88. package/dist/parsers/tree-sitter/csharp-ast-converter.d.ts +64 -0
  89. package/dist/parsers/tree-sitter/csharp-ast-converter.d.ts.map +1 -0
  90. package/dist/parsers/tree-sitter/csharp-ast-converter.js +271 -0
  91. package/dist/parsers/tree-sitter/csharp-ast-converter.js.map +1 -0
  92. package/dist/parsers/tree-sitter/csharp-loader.d.ts +43 -0
  93. package/dist/parsers/tree-sitter/csharp-loader.d.ts.map +1 -0
  94. package/dist/parsers/tree-sitter/csharp-loader.js +146 -0
  95. package/dist/parsers/tree-sitter/csharp-loader.js.map +1 -0
  96. package/dist/parsers/tree-sitter/index.d.ts +26 -0
  97. package/dist/parsers/tree-sitter/index.d.ts.map +1 -0
  98. package/dist/parsers/tree-sitter/index.js +47 -0
  99. package/dist/parsers/tree-sitter/index.js.map +1 -0
  100. package/dist/parsers/tree-sitter/java/annotation-extractor.d.ts +79 -0
  101. package/dist/parsers/tree-sitter/java/annotation-extractor.d.ts.map +1 -0
  102. package/dist/parsers/tree-sitter/java/annotation-extractor.js +540 -0
  103. package/dist/parsers/tree-sitter/java/annotation-extractor.js.map +1 -0
  104. package/dist/parsers/tree-sitter/java/class-extractor.d.ts +40 -0
  105. package/dist/parsers/tree-sitter/java/class-extractor.d.ts.map +1 -0
  106. package/dist/parsers/tree-sitter/java/class-extractor.js +770 -0
  107. package/dist/parsers/tree-sitter/java/class-extractor.js.map +1 -0
  108. package/dist/parsers/tree-sitter/java/index.d.ts +14 -0
  109. package/dist/parsers/tree-sitter/java/index.d.ts.map +1 -0
  110. package/dist/parsers/tree-sitter/java/index.js +25 -0
  111. package/dist/parsers/tree-sitter/java/index.js.map +1 -0
  112. package/dist/parsers/tree-sitter/java/method-extractor.d.ts +88 -0
  113. package/dist/parsers/tree-sitter/java/method-extractor.d.ts.map +1 -0
  114. package/dist/parsers/tree-sitter/java/method-extractor.js +551 -0
  115. package/dist/parsers/tree-sitter/java/method-extractor.js.map +1 -0
  116. package/dist/parsers/tree-sitter/java/types.d.ts +545 -0
  117. package/dist/parsers/tree-sitter/java/types.d.ts.map +1 -0
  118. package/dist/parsers/tree-sitter/java/types.js +81 -0
  119. package/dist/parsers/tree-sitter/java/types.js.map +1 -0
  120. package/dist/parsers/tree-sitter/loader.d.ts +50 -0
  121. package/dist/parsers/tree-sitter/loader.d.ts.map +1 -0
  122. package/dist/parsers/tree-sitter/loader.js +156 -0
  123. package/dist/parsers/tree-sitter/loader.js.map +1 -0
  124. package/dist/parsers/tree-sitter/pydantic/config-extractor.d.ts +78 -0
  125. package/dist/parsers/tree-sitter/pydantic/config-extractor.d.ts.map +1 -0
  126. package/dist/parsers/tree-sitter/pydantic/config-extractor.js +278 -0
  127. package/dist/parsers/tree-sitter/pydantic/config-extractor.js.map +1 -0
  128. package/dist/parsers/tree-sitter/pydantic/constraint-parser.d.ts +84 -0
  129. package/dist/parsers/tree-sitter/pydantic/constraint-parser.d.ts.map +1 -0
  130. package/dist/parsers/tree-sitter/pydantic/constraint-parser.js +321 -0
  131. package/dist/parsers/tree-sitter/pydantic/constraint-parser.js.map +1 -0
  132. package/dist/parsers/tree-sitter/pydantic/field-extractor.d.ts +74 -0
  133. package/dist/parsers/tree-sitter/pydantic/field-extractor.d.ts.map +1 -0
  134. package/dist/parsers/tree-sitter/pydantic/field-extractor.js +285 -0
  135. package/dist/parsers/tree-sitter/pydantic/field-extractor.js.map +1 -0
  136. package/dist/parsers/tree-sitter/pydantic/index.d.ts +18 -0
  137. package/dist/parsers/tree-sitter/pydantic/index.d.ts.map +1 -0
  138. package/dist/parsers/tree-sitter/pydantic/index.js +23 -0
  139. package/dist/parsers/tree-sitter/pydantic/index.js.map +1 -0
  140. package/dist/parsers/tree-sitter/pydantic/inheritance-resolver.d.ts +70 -0
  141. package/dist/parsers/tree-sitter/pydantic/inheritance-resolver.d.ts.map +1 -0
  142. package/dist/parsers/tree-sitter/pydantic/inheritance-resolver.js +251 -0
  143. package/dist/parsers/tree-sitter/pydantic/inheritance-resolver.js.map +1 -0
  144. package/dist/parsers/tree-sitter/pydantic/pydantic-extractor.d.ts +102 -0
  145. package/dist/parsers/tree-sitter/pydantic/pydantic-extractor.d.ts.map +1 -0
  146. package/dist/parsers/tree-sitter/pydantic/pydantic-extractor.js +399 -0
  147. package/dist/parsers/tree-sitter/pydantic/pydantic-extractor.js.map +1 -0
  148. package/dist/parsers/tree-sitter/pydantic/type-resolver.d.ts +89 -0
  149. package/dist/parsers/tree-sitter/pydantic/type-resolver.d.ts.map +1 -0
  150. package/dist/parsers/tree-sitter/pydantic/type-resolver.js +426 -0
  151. package/dist/parsers/tree-sitter/pydantic/type-resolver.js.map +1 -0
  152. package/dist/parsers/tree-sitter/pydantic/types.d.ts +177 -0
  153. package/dist/parsers/tree-sitter/pydantic/types.d.ts.map +1 -0
  154. package/dist/parsers/tree-sitter/pydantic/types.js +139 -0
  155. package/dist/parsers/tree-sitter/pydantic/types.js.map +1 -0
  156. package/dist/parsers/tree-sitter/pydantic/validator-extractor.d.ts +88 -0
  157. package/dist/parsers/tree-sitter/pydantic/validator-extractor.d.ts.map +1 -0
  158. package/dist/parsers/tree-sitter/pydantic/validator-extractor.js +315 -0
  159. package/dist/parsers/tree-sitter/pydantic/validator-extractor.js.map +1 -0
  160. package/dist/parsers/tree-sitter/python-ast-converter.d.ts +140 -0
  161. package/dist/parsers/tree-sitter/python-ast-converter.d.ts.map +1 -0
  162. package/dist/parsers/tree-sitter/python-ast-converter.js +360 -0
  163. package/dist/parsers/tree-sitter/python-ast-converter.js.map +1 -0
  164. package/dist/parsers/tree-sitter/tree-sitter-csharp-parser.d.ts +465 -0
  165. package/dist/parsers/tree-sitter/tree-sitter-csharp-parser.d.ts.map +1 -0
  166. package/dist/parsers/tree-sitter/tree-sitter-csharp-parser.js +1146 -0
  167. package/dist/parsers/tree-sitter/tree-sitter-csharp-parser.js.map +1 -0
  168. package/dist/parsers/tree-sitter/tree-sitter-python-parser.d.ts +86 -0
  169. package/dist/parsers/tree-sitter/tree-sitter-python-parser.d.ts.map +1 -0
  170. package/dist/parsers/tree-sitter/tree-sitter-python-parser.js +177 -0
  171. package/dist/parsers/tree-sitter/tree-sitter-python-parser.js.map +1 -0
  172. package/dist/parsers/tree-sitter/types.d.ts +399 -0
  173. package/dist/parsers/tree-sitter/types.d.ts.map +1 -0
  174. package/dist/parsers/tree-sitter/types.js +20 -0
  175. package/dist/parsers/tree-sitter/types.js.map +1 -0
  176. package/dist/parsers/types.d.ts +1 -1
  177. package/dist/parsers/types.d.ts.map +1 -1
  178. package/dist/scanner/file-walker.d.ts.map +1 -1
  179. package/dist/scanner/file-walker.js +5 -0
  180. package/dist/scanner/file-walker.js.map +1 -1
  181. package/dist/store/history-store.d.ts +85 -269
  182. package/dist/store/history-store.d.ts.map +1 -1
  183. package/dist/store/history-store.js +272 -624
  184. package/dist/store/history-store.js.map +1 -1
  185. package/dist/types/index.d.ts +1 -0
  186. package/dist/types/index.d.ts.map +1 -1
  187. package/dist/types/index.js +2 -0
  188. package/dist/types/index.js.map +1 -1
  189. package/dist/types/java-type-mapping.d.ts +79 -0
  190. package/dist/types/java-type-mapping.d.ts.map +1 -0
  191. package/dist/types/java-type-mapping.js +290 -0
  192. package/dist/types/java-type-mapping.js.map +1 -0
  193. package/package.json +7 -2
@@ -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