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.
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 +8 -3
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Tree-sitter Loader
3
+ *
4
+ * Handles loading tree-sitter and tree-sitter-python with graceful fallback.
5
+ * Provides functions to check availability and access the parser/language.
6
+ *
7
+ * @requirements 3.5 - Unified AST query interface
8
+ */
9
+ import type { TreeSitterParser, TreeSitterLanguage } from './types.js';
10
+ /**
11
+ * Check if tree-sitter is available.
12
+ *
13
+ * This function attempts to load tree-sitter and tree-sitter-python
14
+ * on first call and caches the result.
15
+ *
16
+ * @returns true if tree-sitter is available and working
17
+ */
18
+ export declare function isTreeSitterAvailable(): boolean;
19
+ /**
20
+ * Get the tree-sitter Parser constructor.
21
+ *
22
+ * @returns TreeSitter Parser constructor
23
+ * @throws Error if tree-sitter is not available
24
+ */
25
+ export declare function getTreeSitter(): new () => TreeSitterParser;
26
+ /**
27
+ * Get the Python language for tree-sitter.
28
+ *
29
+ * @returns TreeSitter Python language
30
+ * @throws Error if tree-sitter-python is not available
31
+ */
32
+ export declare function getPythonLanguage(): TreeSitterLanguage;
33
+ /**
34
+ * Create a new tree-sitter parser instance configured for Python.
35
+ *
36
+ * @returns Configured TreeSitter parser
37
+ * @throws Error if tree-sitter is not available
38
+ */
39
+ export declare function createPythonParser(): TreeSitterParser;
40
+ /**
41
+ * Get the loading error message if tree-sitter failed to load.
42
+ *
43
+ * @returns Error message or null if no error
44
+ */
45
+ export declare function getLoadingError(): string | null;
46
+ /**
47
+ * Reset the loader state (useful for testing).
48
+ */
49
+ export declare function resetLoader(): void;
50
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/parsers/tree-sitter/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAyBvE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAe/C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,UAAU,gBAAgB,CAU1D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,kBAAkB,CAUtD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,CAQrD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAKlC"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Tree-sitter Loader
3
+ *
4
+ * Handles loading tree-sitter and tree-sitter-python with graceful fallback.
5
+ * Provides functions to check availability and access the parser/language.
6
+ *
7
+ * @requirements 3.5 - Unified AST query interface
8
+ */
9
+ import { createRequire } from 'node:module';
10
+ // Create require function for ESM compatibility
11
+ const require = createRequire(import.meta.url);
12
+ // ============================================
13
+ // Module State
14
+ // ============================================
15
+ /** Whether tree-sitter is available */
16
+ let treeSitterAvailable = null;
17
+ /** Cached tree-sitter Parser constructor */
18
+ let cachedTreeSitter = null;
19
+ /** Cached Python language */
20
+ let cachedPythonLanguage = null;
21
+ /** Loading error message if any */
22
+ let loadingError = null;
23
+ // ============================================
24
+ // Public API
25
+ // ============================================
26
+ /**
27
+ * Check if tree-sitter is available.
28
+ *
29
+ * This function attempts to load tree-sitter and tree-sitter-python
30
+ * on first call and caches the result.
31
+ *
32
+ * @returns true if tree-sitter is available and working
33
+ */
34
+ export function isTreeSitterAvailable() {
35
+ if (treeSitterAvailable !== null) {
36
+ return treeSitterAvailable;
37
+ }
38
+ try {
39
+ loadTreeSitter();
40
+ treeSitterAvailable = true;
41
+ }
42
+ catch (error) {
43
+ treeSitterAvailable = false;
44
+ loadingError = error instanceof Error ? error.message : 'Unknown error loading tree-sitter';
45
+ logDebug(`tree-sitter not available: ${loadingError}`);
46
+ }
47
+ return treeSitterAvailable;
48
+ }
49
+ /**
50
+ * Get the tree-sitter Parser constructor.
51
+ *
52
+ * @returns TreeSitter Parser constructor
53
+ * @throws Error if tree-sitter is not available
54
+ */
55
+ export function getTreeSitter() {
56
+ if (!isTreeSitterAvailable()) {
57
+ throw new Error(`tree-sitter is not available: ${loadingError ?? 'unknown error'}`);
58
+ }
59
+ if (!cachedTreeSitter) {
60
+ throw new Error('tree-sitter module not loaded');
61
+ }
62
+ return cachedTreeSitter;
63
+ }
64
+ /**
65
+ * Get the Python language for tree-sitter.
66
+ *
67
+ * @returns TreeSitter Python language
68
+ * @throws Error if tree-sitter-python is not available
69
+ */
70
+ export function getPythonLanguage() {
71
+ if (!isTreeSitterAvailable()) {
72
+ throw new Error(`tree-sitter-python is not available: ${loadingError ?? 'unknown error'}`);
73
+ }
74
+ if (!cachedPythonLanguage) {
75
+ throw new Error('tree-sitter-python language not loaded');
76
+ }
77
+ return cachedPythonLanguage;
78
+ }
79
+ /**
80
+ * Create a new tree-sitter parser instance configured for Python.
81
+ *
82
+ * @returns Configured TreeSitter parser
83
+ * @throws Error if tree-sitter is not available
84
+ */
85
+ export function createPythonParser() {
86
+ const Parser = getTreeSitter();
87
+ const language = getPythonLanguage();
88
+ const parser = new Parser();
89
+ parser.setLanguage(language);
90
+ return parser;
91
+ }
92
+ /**
93
+ * Get the loading error message if tree-sitter failed to load.
94
+ *
95
+ * @returns Error message or null if no error
96
+ */
97
+ export function getLoadingError() {
98
+ // Ensure we've attempted to load
99
+ isTreeSitterAvailable();
100
+ return loadingError;
101
+ }
102
+ /**
103
+ * Reset the loader state (useful for testing).
104
+ */
105
+ export function resetLoader() {
106
+ treeSitterAvailable = null;
107
+ cachedTreeSitter = null;
108
+ cachedPythonLanguage = null;
109
+ loadingError = null;
110
+ }
111
+ // ============================================
112
+ // Internal Functions
113
+ // ============================================
114
+ /**
115
+ * Attempt to load tree-sitter and tree-sitter-python.
116
+ *
117
+ * @throws Error if loading fails
118
+ */
119
+ function loadTreeSitter() {
120
+ // Skip if already loaded
121
+ if (cachedTreeSitter && cachedPythonLanguage) {
122
+ return;
123
+ }
124
+ try {
125
+ // Dynamic require for optional dependencies
126
+ // tree-sitter exports the Parser constructor directly
127
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
128
+ cachedTreeSitter = require('tree-sitter');
129
+ }
130
+ catch (error) {
131
+ throw new Error(`Failed to load tree-sitter: ${error instanceof Error ? error.message : 'unknown error'}. ` +
132
+ 'Install with: pnpm add tree-sitter tree-sitter-python');
133
+ }
134
+ try {
135
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
136
+ cachedPythonLanguage = require('tree-sitter-python');
137
+ }
138
+ catch (error) {
139
+ // Clear tree-sitter cache since we can't use it without Python
140
+ cachedTreeSitter = null;
141
+ throw new Error(`Failed to load tree-sitter-python: ${error instanceof Error ? error.message : 'unknown error'}. ` +
142
+ 'Install with: pnpm add tree-sitter-python');
143
+ }
144
+ logDebug('tree-sitter and tree-sitter-python loaded successfully');
145
+ }
146
+ /**
147
+ * Log debug message if debug mode is enabled.
148
+ *
149
+ * @param message - Message to log
150
+ */
151
+ function logDebug(message) {
152
+ if (process.env['DRIFT_PARSER_DEBUG'] === 'true') {
153
+ console.debug(`[tree-sitter-loader] ${message}`);
154
+ }
155
+ }
156
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/parsers/tree-sitter/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Pydantic Config Extractor
3
+ *
4
+ * Extracts model configuration from Pydantic classes.
5
+ * Handles both v1 (Config class) and v2 (model_config dict).
6
+ *
7
+ * @module pydantic/config-extractor
8
+ */
9
+ import type { TreeSitterNode } from '../types.js';
10
+ import type { PydanticConfigInfo } from '../types.js';
11
+ import type { ExtractionContext } from './types.js';
12
+ /**
13
+ * Extracts Pydantic model configuration.
14
+ *
15
+ * Handles:
16
+ * - v1: class Config: ...
17
+ * - v2: model_config = ConfigDict(...)
18
+ * - v2: model_config = {...}
19
+ */
20
+ export declare class ConfigExtractor {
21
+ /**
22
+ * Extract config from a class body.
23
+ *
24
+ * @param bodyNode - The class body (block) node
25
+ * @param context - Extraction context
26
+ * @returns Config info or null if no config found
27
+ */
28
+ extractConfig(bodyNode: TreeSitterNode, context: ExtractionContext): PydanticConfigInfo | null;
29
+ /**
30
+ * Extract v2 style model_config.
31
+ */
32
+ private extractV2Config;
33
+ /**
34
+ * Parse v2 config value (dict or ConfigDict call).
35
+ */
36
+ private parseV2ConfigValue;
37
+ /**
38
+ * Parse a dictionary literal config.
39
+ */
40
+ private parseDictConfig;
41
+ /**
42
+ * Parse a ConfigDict() call.
43
+ */
44
+ private parseConfigDictCall;
45
+ /**
46
+ * Extract v1 style Config class.
47
+ */
48
+ private extractV1Config;
49
+ /**
50
+ * Parse v1 Config class body.
51
+ */
52
+ private parseV1ConfigClass;
53
+ /**
54
+ * Parse a config value string.
55
+ */
56
+ private parseConfigValue;
57
+ /**
58
+ * Remove quotes from a string.
59
+ */
60
+ private unquote;
61
+ /**
62
+ * Process raw config data into PydanticConfigInfo.
63
+ */
64
+ private processRawConfig;
65
+ /**
66
+ * Extract extra config value.
67
+ */
68
+ private extractExtraConfig;
69
+ /**
70
+ * Extract a boolean config value.
71
+ */
72
+ private extractBooleanConfig;
73
+ /**
74
+ * Extract json_schema_extra config.
75
+ */
76
+ private extractJsonSchemaExtra;
77
+ }
78
+ //# sourceMappingURL=config-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-extractor.d.ts","sourceRoot":"","sources":["../../../../src/parsers/tree-sitter/pydantic/config-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAA8B,MAAM,YAAY,CAAC;AAMhF;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B;;;;;;OAMG;IACH,aAAa,CACX,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,iBAAiB,GACzB,kBAAkB,GAAG,IAAI;IAoB5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACH,OAAO,CAAC,OAAO;IAaf;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAa/B"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Pydantic Config Extractor
3
+ *
4
+ * Extracts model configuration from Pydantic classes.
5
+ * Handles both v1 (Config class) and v2 (model_config dict).
6
+ *
7
+ * @module pydantic/config-extractor
8
+ */
9
+ // ============================================
10
+ // Config Extractor Class
11
+ // ============================================
12
+ /**
13
+ * Extracts Pydantic model configuration.
14
+ *
15
+ * Handles:
16
+ * - v1: class Config: ...
17
+ * - v2: model_config = ConfigDict(...)
18
+ * - v2: model_config = {...}
19
+ */
20
+ export class ConfigExtractor {
21
+ /**
22
+ * Extract config from a class body.
23
+ *
24
+ * @param bodyNode - The class body (block) node
25
+ * @param context - Extraction context
26
+ * @returns Config info or null if no config found
27
+ */
28
+ extractConfig(bodyNode, context) {
29
+ // Try v2 style first (model_config)
30
+ const v2Config = this.extractV2Config(bodyNode, context);
31
+ if (v2Config) {
32
+ return v2Config;
33
+ }
34
+ // Try v1 style (Config class)
35
+ const v1Config = this.extractV1Config(bodyNode, context);
36
+ if (v1Config) {
37
+ return v1Config;
38
+ }
39
+ return null;
40
+ }
41
+ // ============================================
42
+ // V2 Config Extraction
43
+ // ============================================
44
+ /**
45
+ * Extract v2 style model_config.
46
+ */
47
+ extractV2Config(bodyNode, _context) {
48
+ for (const child of bodyNode.namedChildren) {
49
+ if (child.type !== 'expression_statement')
50
+ continue;
51
+ const inner = child.namedChildren[0];
52
+ if (!inner || inner.type !== 'assignment')
53
+ continue;
54
+ const left = inner.childForFieldName('left');
55
+ if (!left || left.text !== 'model_config')
56
+ continue;
57
+ const right = inner.childForFieldName('right');
58
+ if (!right)
59
+ continue;
60
+ const rawData = this.parseV2ConfigValue(right, inner);
61
+ return this.processRawConfig(rawData);
62
+ }
63
+ return null;
64
+ }
65
+ /**
66
+ * Parse v2 config value (dict or ConfigDict call).
67
+ */
68
+ parseV2ConfigValue(valueNode, assignmentNode) {
69
+ const values = new Map();
70
+ if (valueNode.type === 'dictionary') {
71
+ // model_config = {...}
72
+ this.parseDictConfig(valueNode, values);
73
+ }
74
+ else if (valueNode.type === 'call') {
75
+ // model_config = ConfigDict(...)
76
+ this.parseConfigDictCall(valueNode, values);
77
+ }
78
+ return {
79
+ version: 2,
80
+ values,
81
+ node: assignmentNode,
82
+ };
83
+ }
84
+ /**
85
+ * Parse a dictionary literal config.
86
+ */
87
+ parseDictConfig(dictNode, values) {
88
+ for (const child of dictNode.namedChildren) {
89
+ if (child.type === 'pair') {
90
+ const keyNode = child.childForFieldName('key');
91
+ const valueNode = child.childForFieldName('value');
92
+ if (keyNode && valueNode) {
93
+ const key = this.unquote(keyNode.text);
94
+ values.set(key, this.parseConfigValue(valueNode.text));
95
+ }
96
+ }
97
+ }
98
+ }
99
+ /**
100
+ * Parse a ConfigDict() call.
101
+ */
102
+ parseConfigDictCall(callNode, values) {
103
+ const argsNode = callNode.childForFieldName('arguments');
104
+ if (!argsNode)
105
+ return;
106
+ for (const child of argsNode.namedChildren) {
107
+ if (child.type === 'keyword_argument') {
108
+ const nameNode = child.childForFieldName('name');
109
+ const valueNode = child.childForFieldName('value');
110
+ if (nameNode && valueNode) {
111
+ values.set(nameNode.text, this.parseConfigValue(valueNode.text));
112
+ }
113
+ }
114
+ }
115
+ }
116
+ // ============================================
117
+ // V1 Config Extraction
118
+ // ============================================
119
+ /**
120
+ * Extract v1 style Config class.
121
+ */
122
+ extractV1Config(bodyNode, _context) {
123
+ for (const child of bodyNode.namedChildren) {
124
+ if (child.type !== 'class_definition')
125
+ continue;
126
+ const nameNode = child.childForFieldName('name');
127
+ if (!nameNode || nameNode.text !== 'Config')
128
+ continue;
129
+ const configBody = child.childForFieldName('body');
130
+ if (!configBody)
131
+ continue;
132
+ const rawData = this.parseV1ConfigClass(configBody, child);
133
+ return this.processRawConfig(rawData);
134
+ }
135
+ return null;
136
+ }
137
+ /**
138
+ * Parse v1 Config class body.
139
+ */
140
+ parseV1ConfigClass(bodyNode, classNode) {
141
+ const values = new Map();
142
+ for (const child of bodyNode.namedChildren) {
143
+ if (child.type !== 'expression_statement')
144
+ continue;
145
+ const inner = child.namedChildren[0];
146
+ if (!inner || inner.type !== 'assignment')
147
+ continue;
148
+ const left = inner.childForFieldName('left');
149
+ const right = inner.childForFieldName('right');
150
+ if (left && right && left.type === 'identifier') {
151
+ values.set(left.text, this.parseConfigValue(right.text));
152
+ }
153
+ }
154
+ return {
155
+ version: 1,
156
+ values,
157
+ node: classNode,
158
+ };
159
+ }
160
+ // ============================================
161
+ // Value Parsing
162
+ // ============================================
163
+ /**
164
+ * Parse a config value string.
165
+ */
166
+ parseConfigValue(valueStr) {
167
+ const trimmed = valueStr.trim();
168
+ // Boolean
169
+ if (trimmed === 'True') {
170
+ return { raw: trimmed, parsed: true, isComplex: false };
171
+ }
172
+ if (trimmed === 'False') {
173
+ return { raw: trimmed, parsed: false, isComplex: false };
174
+ }
175
+ if (trimmed === 'None') {
176
+ return { raw: trimmed, parsed: null, isComplex: false };
177
+ }
178
+ // Number
179
+ const num = parseFloat(trimmed);
180
+ if (!isNaN(num) && /^-?\d+\.?\d*$/.test(trimmed)) {
181
+ return { raw: trimmed, parsed: num, isComplex: false };
182
+ }
183
+ // String
184
+ if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
185
+ (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
186
+ return { raw: trimmed, parsed: trimmed.slice(1, -1), isComplex: false };
187
+ }
188
+ // Complex expression
189
+ return { raw: trimmed, parsed: null, isComplex: true };
190
+ }
191
+ /**
192
+ * Remove quotes from a string.
193
+ */
194
+ unquote(value) {
195
+ const trimmed = value.trim();
196
+ if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
197
+ (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
198
+ return trimmed.slice(1, -1);
199
+ }
200
+ return trimmed;
201
+ }
202
+ // ============================================
203
+ // Processing
204
+ // ============================================
205
+ /**
206
+ * Process raw config data into PydanticConfigInfo.
207
+ */
208
+ processRawConfig(raw) {
209
+ const rawValues = {};
210
+ for (const [key, value] of raw.values) {
211
+ rawValues[key] = value.isComplex ? value.raw : value.parsed;
212
+ }
213
+ return {
214
+ extra: this.extractExtraConfig(raw.values),
215
+ frozen: this.extractBooleanConfig(raw.values, ['frozen', 'allow_mutation']),
216
+ validateAssignment: this.extractBooleanConfig(raw.values, ['validate_assignment']),
217
+ useEnumValues: this.extractBooleanConfig(raw.values, ['use_enum_values']),
218
+ validateDefault: this.extractBooleanConfig(raw.values, ['validate_default']),
219
+ populateByName: this.extractBooleanConfig(raw.values, ['populate_by_name', 'allow_population_by_field_name']),
220
+ arbitraryTypesAllowed: this.extractBooleanConfig(raw.values, ['arbitrary_types_allowed']),
221
+ jsonSchemaExtra: this.extractJsonSchemaExtra(raw.values),
222
+ raw: rawValues,
223
+ };
224
+ }
225
+ /**
226
+ * Extract extra config value.
227
+ */
228
+ extractExtraConfig(values) {
229
+ const value = values.get('extra');
230
+ if (!value)
231
+ return null;
232
+ const parsed = value.parsed;
233
+ if (typeof parsed === 'string') {
234
+ if (parsed === 'allow' || parsed === 'forbid' || parsed === 'ignore') {
235
+ return parsed;
236
+ }
237
+ }
238
+ // Handle v1 style: Extra.allow, Extra.forbid, Extra.ignore
239
+ const raw = value.raw;
240
+ if (raw.includes('allow'))
241
+ return 'allow';
242
+ if (raw.includes('forbid'))
243
+ return 'forbid';
244
+ if (raw.includes('ignore'))
245
+ return 'ignore';
246
+ return null;
247
+ }
248
+ /**
249
+ * Extract a boolean config value.
250
+ */
251
+ extractBooleanConfig(values, keys) {
252
+ for (const key of keys) {
253
+ const value = values.get(key);
254
+ if (value && typeof value.parsed === 'boolean') {
255
+ // Handle inverted keys (allow_mutation -> frozen)
256
+ if (key === 'allow_mutation') {
257
+ return !value.parsed;
258
+ }
259
+ return value.parsed;
260
+ }
261
+ }
262
+ return null;
263
+ }
264
+ /**
265
+ * Extract json_schema_extra config.
266
+ */
267
+ extractJsonSchemaExtra(values) {
268
+ const value = values.get('json_schema_extra') || values.get('schema_extra');
269
+ if (!value)
270
+ return null;
271
+ // If it's a simple dict, try to parse it
272
+ if (!value.isComplex && typeof value.parsed === 'object' && value.parsed !== null) {
273
+ return value.parsed;
274
+ }
275
+ return null;
276
+ }
277
+ }
278
+ //# sourceMappingURL=config-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-extractor.js","sourceRoot":"","sources":["../../../../src/parsers/tree-sitter/pydantic/config-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Pydantic Constraint Parser
3
+ *
4
+ * Parses Field() constraints from function call arguments.
5
+ * Handles numeric, string, and custom constraints.
6
+ *
7
+ * @module pydantic/constraint-parser
8
+ */
9
+ import type { FieldConstraints } from '../types.js';
10
+ import type { FieldArgument } from './types.js';
11
+ /**
12
+ * Parses Pydantic Field() constraints.
13
+ *
14
+ * Handles:
15
+ * - Numeric: ge, le, gt, lt, multiple_of
16
+ * - String: min_length, max_length, pattern, regex
17
+ * - Other: frozen, alias, title, description
18
+ */
19
+ export declare class ConstraintParser {
20
+ /**
21
+ * Parse constraints from Field() arguments.
22
+ *
23
+ * @param args - Field() call arguments
24
+ * @returns Parsed constraints
25
+ */
26
+ parseConstraints(args: FieldArgument[]): FieldConstraints;
27
+ /**
28
+ * Parse a single constraint argument.
29
+ */
30
+ private parseConstraintArg;
31
+ /**
32
+ * Parse a numeric value.
33
+ */
34
+ private parseNumber;
35
+ /**
36
+ * Parse a string value (remove quotes).
37
+ */
38
+ private parseString;
39
+ /**
40
+ * Parse a boolean value.
41
+ */
42
+ private parseBoolean;
43
+ /**
44
+ * Parse json_schema_extra value.
45
+ */
46
+ private parseJsonSchemaExtra;
47
+ /**
48
+ * Parse a simple Python dict literal.
49
+ */
50
+ private parseSimpleDict;
51
+ /**
52
+ * Split dict pairs respecting nested structures.
53
+ */
54
+ private splitDictPairs;
55
+ /**
56
+ * Parse a generic Python value.
57
+ */
58
+ private parseValue;
59
+ /**
60
+ * Parse a simple Python list literal.
61
+ */
62
+ private parseSimpleList;
63
+ /**
64
+ * Parse validator references.
65
+ */
66
+ private parseValidators;
67
+ }
68
+ /**
69
+ * Check if constraints have any numeric constraints.
70
+ */
71
+ export declare function hasNumericConstraints(constraints: FieldConstraints): boolean;
72
+ /**
73
+ * Check if constraints have any string constraints.
74
+ */
75
+ export declare function hasStringConstraints(constraints: FieldConstraints): boolean;
76
+ /**
77
+ * Check if constraints are empty.
78
+ */
79
+ export declare function hasAnyConstraints(constraints: FieldConstraints): boolean;
80
+ /**
81
+ * Merge two constraint objects.
82
+ */
83
+ export declare function mergeConstraints(base: FieldConstraints, override: Partial<FieldConstraints>): FieldConstraints;
84
+ //# sourceMappingURL=constraint-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraint-parser.d.ts","sourceRoot":"","sources":["../../../../src/parsers/tree-sitter/pydantic/constraint-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMhD;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAC3B;;;;;OAKG;IACH,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,gBAAgB;IAwBzD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA0D1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAsBnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAyCtB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkClB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,eAAe;CAQxB;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAQ5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAM3E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAQxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAClC,gBAAgB,CAclB"}