driftdetect-core 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/dist/boundaries/boundary-scanner.d.ts +76 -0
  2. package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
  3. package/dist/boundaries/boundary-scanner.js +801 -0
  4. package/dist/boundaries/boundary-scanner.js.map +1 -0
  5. package/dist/boundaries/data-access-learner.d.ts +126 -0
  6. package/dist/boundaries/data-access-learner.d.ts.map +1 -0
  7. package/dist/boundaries/data-access-learner.js +486 -0
  8. package/dist/boundaries/data-access-learner.js.map +1 -0
  9. package/dist/boundaries/index.d.ts +6 -0
  10. package/dist/boundaries/index.d.ts.map +1 -1
  11. package/dist/boundaries/index.js +6 -0
  12. package/dist/boundaries/index.js.map +1 -1
  13. package/dist/boundaries/security-prioritizer.d.ts +118 -0
  14. package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
  15. package/dist/boundaries/security-prioritizer.js +316 -0
  16. package/dist/boundaries/security-prioritizer.js.map +1 -0
  17. package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
  18. package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
  19. package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
  20. package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
  21. package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
  22. package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
  23. package/dist/call-graph/analysis/dead-code-detector.js +391 -0
  24. package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
  25. package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
  26. package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
  27. package/dist/call-graph/analysis/graph-builder.js +624 -0
  28. package/dist/call-graph/analysis/graph-builder.js.map +1 -0
  29. package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
  30. package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
  31. package/dist/call-graph/analysis/impact-analyzer.js +329 -0
  32. package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
  33. package/dist/call-graph/analysis/index.d.ts +11 -0
  34. package/dist/call-graph/analysis/index.d.ts.map +1 -0
  35. package/dist/call-graph/analysis/index.js +9 -0
  36. package/dist/call-graph/analysis/index.js.map +1 -0
  37. package/dist/call-graph/analysis/path-finder.d.ts +117 -0
  38. package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
  39. package/dist/call-graph/analysis/path-finder.js +360 -0
  40. package/dist/call-graph/analysis/path-finder.js.map +1 -0
  41. package/dist/call-graph/analysis/reachability.d.ts +56 -0
  42. package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
  43. package/dist/call-graph/analysis/reachability.js +357 -0
  44. package/dist/call-graph/analysis/reachability.js.map +1 -0
  45. package/dist/call-graph/demo.d.ts +11 -0
  46. package/dist/call-graph/demo.d.ts.map +1 -0
  47. package/dist/call-graph/demo.js +339 -0
  48. package/dist/call-graph/demo.js.map +1 -0
  49. package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
  50. package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
  51. package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
  52. package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
  53. package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
  54. package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
  55. package/dist/call-graph/enrichment/impact-scorer.js +328 -0
  56. package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
  57. package/dist/call-graph/enrichment/index.d.ts +12 -0
  58. package/dist/call-graph/enrichment/index.d.ts.map +1 -0
  59. package/dist/call-graph/enrichment/index.js +15 -0
  60. package/dist/call-graph/enrichment/index.js.map +1 -0
  61. package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
  62. package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
  63. package/dist/call-graph/enrichment/remediation-generator.js +609 -0
  64. package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
  65. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
  66. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
  67. package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
  68. package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
  69. package/dist/call-graph/enrichment/types.d.ts +402 -0
  70. package/dist/call-graph/enrichment/types.d.ts.map +1 -0
  71. package/dist/call-graph/enrichment/types.js +9 -0
  72. package/dist/call-graph/enrichment/types.js.map +1 -0
  73. package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
  74. package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
  75. package/dist/call-graph/extractors/base-extractor.js +140 -0
  76. package/dist/call-graph/extractors/base-extractor.js.map +1 -0
  77. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
  78. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
  79. package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
  80. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
  81. package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
  82. package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
  83. package/dist/call-graph/extractors/csharp-extractor.js +470 -0
  84. package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
  85. package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
  86. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
  87. package/dist/call-graph/extractors/data-access-extractor.js +234 -0
  88. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
  89. package/dist/call-graph/extractors/index.d.ts +26 -0
  90. package/dist/call-graph/extractors/index.d.ts.map +1 -0
  91. package/dist/call-graph/extractors/index.js +36 -0
  92. package/dist/call-graph/extractors/index.js.map +1 -0
  93. package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
  94. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
  95. package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
  96. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
  97. package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
  98. package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
  99. package/dist/call-graph/extractors/java-extractor.js +510 -0
  100. package/dist/call-graph/extractors/java-extractor.js.map +1 -0
  101. package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
  102. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
  103. package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
  104. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
  105. package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
  106. package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
  107. package/dist/call-graph/extractors/php-extractor.js +619 -0
  108. package/dist/call-graph/extractors/php-extractor.js.map +1 -0
  109. package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
  110. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
  111. package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
  112. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
  113. package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
  114. package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
  115. package/dist/call-graph/extractors/python-extractor.js +681 -0
  116. package/dist/call-graph/extractors/python-extractor.js.map +1 -0
  117. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
  118. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
  119. package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
  120. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
  121. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
  122. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
  123. package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
  124. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
  125. package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
  126. package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
  127. package/dist/call-graph/extractors/typescript-extractor.js +904 -0
  128. package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
  129. package/dist/call-graph/index.d.ts +127 -0
  130. package/dist/call-graph/index.d.ts.map +1 -0
  131. package/dist/call-graph/index.js +247 -0
  132. package/dist/call-graph/index.js.map +1 -0
  133. package/dist/call-graph/store/call-graph-store.d.ts +70 -0
  134. package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
  135. package/dist/call-graph/store/call-graph-store.js +210 -0
  136. package/dist/call-graph/store/call-graph-store.js.map +1 -0
  137. package/dist/call-graph/store/index.d.ts +7 -0
  138. package/dist/call-graph/store/index.d.ts.map +1 -0
  139. package/dist/call-graph/store/index.js +7 -0
  140. package/dist/call-graph/store/index.js.map +1 -0
  141. package/dist/call-graph/types.d.ts +376 -0
  142. package/dist/call-graph/types.d.ts.map +1 -0
  143. package/dist/call-graph/types.js +8 -0
  144. package/dist/call-graph/types.js.map +1 -0
  145. package/dist/index.d.ts +8 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +12 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/lake/callgraph-shard-store.d.ts +168 -0
  150. package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
  151. package/dist/lake/callgraph-shard-store.js +466 -0
  152. package/dist/lake/callgraph-shard-store.js.map +1 -0
  153. package/dist/lake/examples-store.d.ts +127 -0
  154. package/dist/lake/examples-store.d.ts.map +1 -0
  155. package/dist/lake/examples-store.js +389 -0
  156. package/dist/lake/examples-store.js.map +1 -0
  157. package/dist/lake/index-store.d.ts +82 -0
  158. package/dist/lake/index-store.d.ts.map +1 -0
  159. package/dist/lake/index-store.js +359 -0
  160. package/dist/lake/index-store.js.map +1 -0
  161. package/dist/lake/index.d.ts +93 -0
  162. package/dist/lake/index.d.ts.map +1 -0
  163. package/dist/lake/index.js +138 -0
  164. package/dist/lake/index.js.map +1 -0
  165. package/dist/lake/lake.bak/index-store.d.ts +82 -0
  166. package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
  167. package/dist/lake/lake.bak/index-store.js +357 -0
  168. package/dist/lake/lake.bak/index-store.js.map +1 -0
  169. package/dist/lake/lake.bak/index.d.ts +81 -0
  170. package/dist/lake/lake.bak/index.d.ts.map +1 -0
  171. package/dist/lake/lake.bak/index.js +114 -0
  172. package/dist/lake/lake.bak/index.js.map +1 -0
  173. package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
  174. package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
  175. package/dist/lake/lake.bak/manifest-store.js +347 -0
  176. package/dist/lake/lake.bak/manifest-store.js.map +1 -0
  177. package/dist/lake/lake.bak/query-engine.d.ts +112 -0
  178. package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
  179. package/dist/lake/lake.bak/query-engine.js +370 -0
  180. package/dist/lake/lake.bak/query-engine.js.map +1 -0
  181. package/dist/lake/lake.bak/types.d.ts +428 -0
  182. package/dist/lake/lake.bak/types.d.ts.map +1 -0
  183. package/dist/lake/lake.bak/types.js +46 -0
  184. package/dist/lake/lake.bak/types.js.map +1 -0
  185. package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
  186. package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
  187. package/dist/lake/lake.bak/view-materializer.js +314 -0
  188. package/dist/lake/lake.bak/view-materializer.js.map +1 -0
  189. package/dist/lake/lake.bak/view-store.d.ts +57 -0
  190. package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
  191. package/dist/lake/lake.bak/view-store.js +348 -0
  192. package/dist/lake/lake.bak/view-store.js.map +1 -0
  193. package/dist/lake/manifest-store.d.ts +51 -0
  194. package/dist/lake/manifest-store.d.ts.map +1 -0
  195. package/dist/lake/manifest-store.js +348 -0
  196. package/dist/lake/manifest-store.js.map +1 -0
  197. package/dist/lake/pattern-shard-store.d.ts +87 -0
  198. package/dist/lake/pattern-shard-store.d.ts.map +1 -0
  199. package/dist/lake/pattern-shard-store.js +347 -0
  200. package/dist/lake/pattern-shard-store.js.map +1 -0
  201. package/dist/lake/query-engine.d.ts +124 -0
  202. package/dist/lake/query-engine.d.ts.map +1 -0
  203. package/dist/lake/query-engine.js +453 -0
  204. package/dist/lake/query-engine.js.map +1 -0
  205. package/dist/lake/security-shard-store.d.ts +156 -0
  206. package/dist/lake/security-shard-store.d.ts.map +1 -0
  207. package/dist/lake/security-shard-store.js +498 -0
  208. package/dist/lake/security-shard-store.js.map +1 -0
  209. package/dist/lake/types.d.ts +428 -0
  210. package/dist/lake/types.d.ts.map +1 -0
  211. package/dist/lake/types.js +46 -0
  212. package/dist/lake/types.js.map +1 -0
  213. package/dist/lake/view-materializer.d.ts +70 -0
  214. package/dist/lake/view-materializer.d.ts.map +1 -0
  215. package/dist/lake/view-materializer.js +314 -0
  216. package/dist/lake/view-materializer.js.map +1 -0
  217. package/dist/lake/view-store.d.ts +57 -0
  218. package/dist/lake/view-store.d.ts.map +1 -0
  219. package/dist/lake/view-store.js +348 -0
  220. package/dist/lake/view-store.js.map +1 -0
  221. package/dist/parsers/tree-sitter/index.d.ts +1 -0
  222. package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
  223. package/dist/parsers/tree-sitter/index.js +4 -0
  224. package/dist/parsers/tree-sitter/index.js.map +1 -1
  225. package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
  226. package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
  227. package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
  228. package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
  229. package/dist/store/project-config.d.ts +154 -0
  230. package/dist/store/project-config.d.ts.map +1 -0
  231. package/dist/store/project-config.js +235 -0
  232. package/dist/store/project-config.js.map +1 -0
  233. package/dist/store/project-registry.d.ts +241 -0
  234. package/dist/store/project-registry.d.ts.map +1 -0
  235. package/dist/store/project-registry.js +557 -0
  236. package/dist/store/project-registry.js.map +1 -0
  237. package/package.json +4 -2
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Tree-sitter TypeScript/JavaScript Loader
3
+ *
4
+ * Handles loading tree-sitter and tree-sitter-typescript/javascript with graceful fallback.
5
+ * Provides functions to check availability and access the parser/language.
6
+ *
7
+ * @requirements Unified AST query interface for TypeScript/JavaScript
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-typescript is available */
16
+ let typescriptAvailable = null;
17
+ /** Whether tree-sitter-javascript is available */
18
+ let javascriptAvailable = null;
19
+ /** Cached tree-sitter module */
20
+ let cachedTreeSitter = null;
21
+ /** Cached TypeScript language */
22
+ let cachedTypeScriptLanguage = null;
23
+ /** Cached TSX language */
24
+ let cachedTsxLanguage = null;
25
+ /** Cached JavaScript language */
26
+ let cachedJavaScriptLanguage = null;
27
+ /** Loading error message if any */
28
+ let loadingError = null;
29
+ // ============================================
30
+ // Public API
31
+ // ============================================
32
+ /**
33
+ * Check if tree-sitter-typescript is available.
34
+ */
35
+ export function isTypeScriptTreeSitterAvailable() {
36
+ if (typescriptAvailable !== null) {
37
+ return typescriptAvailable;
38
+ }
39
+ try {
40
+ loadTypeScriptTreeSitter();
41
+ typescriptAvailable = true;
42
+ }
43
+ catch (error) {
44
+ typescriptAvailable = false;
45
+ loadingError = error instanceof Error ? error.message : 'Unknown error loading tree-sitter-typescript';
46
+ logDebug(`tree-sitter-typescript not available: ${loadingError}`);
47
+ }
48
+ return typescriptAvailable;
49
+ }
50
+ /**
51
+ * Check if tree-sitter-javascript is available.
52
+ */
53
+ export function isJavaScriptTreeSitterAvailable() {
54
+ if (javascriptAvailable !== null) {
55
+ return javascriptAvailable;
56
+ }
57
+ try {
58
+ loadJavaScriptTreeSitter();
59
+ javascriptAvailable = true;
60
+ }
61
+ catch (error) {
62
+ javascriptAvailable = false;
63
+ loadingError = error instanceof Error ? error.message : 'Unknown error loading tree-sitter-javascript';
64
+ logDebug(`tree-sitter-javascript not available: ${loadingError}`);
65
+ }
66
+ return javascriptAvailable;
67
+ }
68
+ /**
69
+ * Get the TypeScript language for tree-sitter.
70
+ */
71
+ export function getTypeScriptLanguage() {
72
+ if (!isTypeScriptTreeSitterAvailable()) {
73
+ throw new Error(`tree-sitter-typescript is not available: ${loadingError ?? 'unknown error'}`);
74
+ }
75
+ if (!cachedTypeScriptLanguage) {
76
+ throw new Error('tree-sitter-typescript language not loaded');
77
+ }
78
+ return cachedTypeScriptLanguage;
79
+ }
80
+ /**
81
+ * Get the TSX language for tree-sitter.
82
+ */
83
+ export function getTsxLanguage() {
84
+ if (!isTypeScriptTreeSitterAvailable()) {
85
+ throw new Error(`tree-sitter-typescript is not available: ${loadingError ?? 'unknown error'}`);
86
+ }
87
+ if (!cachedTsxLanguage) {
88
+ throw new Error('tree-sitter-tsx language not loaded');
89
+ }
90
+ return cachedTsxLanguage;
91
+ }
92
+ /**
93
+ * Get the JavaScript language for tree-sitter.
94
+ */
95
+ export function getJavaScriptLanguage() {
96
+ if (!isJavaScriptTreeSitterAvailable()) {
97
+ throw new Error(`tree-sitter-javascript is not available: ${loadingError ?? 'unknown error'}`);
98
+ }
99
+ if (!cachedJavaScriptLanguage) {
100
+ throw new Error('tree-sitter-javascript language not loaded');
101
+ }
102
+ return cachedJavaScriptLanguage;
103
+ }
104
+ /**
105
+ * Get the tree-sitter Parser constructor.
106
+ */
107
+ export function getTypeScriptTreeSitter() {
108
+ if (!isTypeScriptTreeSitterAvailable() && !isJavaScriptTreeSitterAvailable()) {
109
+ throw new Error(`tree-sitter is not available: ${loadingError ?? 'unknown error'}`);
110
+ }
111
+ if (!cachedTreeSitter) {
112
+ throw new Error('tree-sitter module not loaded');
113
+ }
114
+ return cachedTreeSitter;
115
+ }
116
+ /**
117
+ * Create a new tree-sitter parser instance configured for TypeScript.
118
+ */
119
+ export function createTypeScriptParser() {
120
+ const Parser = getTypeScriptTreeSitter();
121
+ const language = getTypeScriptLanguage();
122
+ const parser = new Parser();
123
+ parser.setLanguage(language);
124
+ return parser;
125
+ }
126
+ /**
127
+ * Create a new tree-sitter parser instance configured for TSX.
128
+ */
129
+ export function createTsxParser() {
130
+ const Parser = getTypeScriptTreeSitter();
131
+ const language = getTsxLanguage();
132
+ const parser = new Parser();
133
+ parser.setLanguage(language);
134
+ return parser;
135
+ }
136
+ /**
137
+ * Create a new tree-sitter parser instance configured for JavaScript.
138
+ */
139
+ export function createJavaScriptParser() {
140
+ const Parser = getTypeScriptTreeSitter();
141
+ const language = getJavaScriptLanguage();
142
+ const parser = new Parser();
143
+ parser.setLanguage(language);
144
+ return parser;
145
+ }
146
+ /**
147
+ * Create a parser for the given file extension.
148
+ */
149
+ export function createParserForFile(filePath) {
150
+ const ext = filePath.toLowerCase();
151
+ if (ext.endsWith('.tsx')) {
152
+ return isTypeScriptTreeSitterAvailable() ? createTsxParser() : null;
153
+ }
154
+ if (ext.endsWith('.ts') || ext.endsWith('.mts') || ext.endsWith('.cts')) {
155
+ return isTypeScriptTreeSitterAvailable() ? createTypeScriptParser() : null;
156
+ }
157
+ if (ext.endsWith('.jsx')) {
158
+ // JSX uses JavaScript parser with JSX support
159
+ return isJavaScriptTreeSitterAvailable() ? createJavaScriptParser() : null;
160
+ }
161
+ if (ext.endsWith('.js') || ext.endsWith('.mjs') || ext.endsWith('.cjs')) {
162
+ return isJavaScriptTreeSitterAvailable() ? createJavaScriptParser() : null;
163
+ }
164
+ return null;
165
+ }
166
+ /**
167
+ * Get the loading error message if tree-sitter failed to load.
168
+ */
169
+ export function getTypeScriptLoadingError() {
170
+ isTypeScriptTreeSitterAvailable();
171
+ return loadingError;
172
+ }
173
+ /**
174
+ * Reset the loader state (useful for testing).
175
+ */
176
+ export function resetTypeScriptLoader() {
177
+ typescriptAvailable = null;
178
+ javascriptAvailable = null;
179
+ cachedTreeSitter = null;
180
+ cachedTypeScriptLanguage = null;
181
+ cachedTsxLanguage = null;
182
+ cachedJavaScriptLanguage = null;
183
+ loadingError = null;
184
+ }
185
+ // ============================================
186
+ // Internal Functions
187
+ // ============================================
188
+ /**
189
+ * Load tree-sitter core module.
190
+ */
191
+ function loadTreeSitterCore() {
192
+ if (cachedTreeSitter)
193
+ return;
194
+ try {
195
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
196
+ cachedTreeSitter = require('tree-sitter');
197
+ }
198
+ catch (error) {
199
+ throw new Error(`Failed to load tree-sitter: ${error instanceof Error ? error.message : 'unknown error'}. ` +
200
+ 'Install with: pnpm add tree-sitter');
201
+ }
202
+ }
203
+ /**
204
+ * Attempt to load tree-sitter and tree-sitter-typescript.
205
+ */
206
+ function loadTypeScriptTreeSitter() {
207
+ if (cachedTypeScriptLanguage && cachedTsxLanguage) {
208
+ return;
209
+ }
210
+ loadTreeSitterCore();
211
+ try {
212
+ // tree-sitter-typescript exports an object with typescript and tsx languages
213
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
214
+ const tsModule = require('tree-sitter-typescript');
215
+ cachedTypeScriptLanguage = tsModule.typescript;
216
+ cachedTsxLanguage = tsModule.tsx;
217
+ }
218
+ catch (error) {
219
+ throw new Error(`Failed to load tree-sitter-typescript: ${error instanceof Error ? error.message : 'unknown error'}. ` +
220
+ 'Install with: pnpm add tree-sitter-typescript');
221
+ }
222
+ logDebug('tree-sitter-typescript loaded successfully');
223
+ }
224
+ /**
225
+ * Attempt to load tree-sitter and tree-sitter-javascript.
226
+ */
227
+ function loadJavaScriptTreeSitter() {
228
+ if (cachedJavaScriptLanguage) {
229
+ return;
230
+ }
231
+ loadTreeSitterCore();
232
+ try {
233
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
234
+ cachedJavaScriptLanguage = require('tree-sitter-javascript');
235
+ }
236
+ catch (error) {
237
+ throw new Error(`Failed to load tree-sitter-javascript: ${error instanceof Error ? error.message : 'unknown error'}. ` +
238
+ 'Install with: pnpm add tree-sitter-javascript');
239
+ }
240
+ logDebug('tree-sitter-javascript loaded successfully');
241
+ }
242
+ /**
243
+ * Log debug message if debug mode is enabled.
244
+ */
245
+ function logDebug(message) {
246
+ if (process.env['DRIFT_PARSER_DEBUG'] === 'true') {
247
+ console.debug(`[typescript-loader] ${message}`);
248
+ }
249
+ }
250
+ //# sourceMappingURL=typescript-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-loader.js","sourceRoot":"","sources":["../../../src/parsers/tree-sitter/typescript-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Project Config - Enhanced project-level configuration
3
+ *
4
+ * Extends the basic .drift/config.json with project identification
5
+ * and metadata that links to the global registry.
6
+ */
7
+ /**
8
+ * CI/CD configuration
9
+ */
10
+ export interface CIConfig {
11
+ /** Severity level that causes CI failure */
12
+ failOn: 'error' | 'warning' | 'info' | 'none';
13
+ /** Report format for CI output */
14
+ reportFormat: 'text' | 'json' | 'sarif' | 'github';
15
+ /** Upload results to dashboard */
16
+ uploadResults?: boolean;
17
+ }
18
+ /**
19
+ * Learning configuration
20
+ */
21
+ export interface LearningConfig {
22
+ /** Confidence threshold for auto-approval */
23
+ autoApproveThreshold: number;
24
+ /** Minimum occurrences before pattern is considered */
25
+ minOccurrences: number;
26
+ /** Enable semantic learning */
27
+ semanticLearning?: boolean;
28
+ }
29
+ /**
30
+ * Performance configuration
31
+ */
32
+ export interface PerformanceConfig {
33
+ /** Maximum parallel workers */
34
+ maxWorkers: number;
35
+ /** Enable caching */
36
+ cacheEnabled: boolean;
37
+ /** Enable incremental analysis */
38
+ incrementalAnalysis: boolean;
39
+ /** Cache TTL in seconds */
40
+ cacheTTL?: number;
41
+ }
42
+ /**
43
+ * Project metadata
44
+ */
45
+ export interface ProjectMetadata {
46
+ /** Unique project ID (matches registry) */
47
+ id: string;
48
+ /** Project display name */
49
+ name: string;
50
+ /** Project description */
51
+ description?: string | undefined;
52
+ /** Project version */
53
+ version?: string | undefined;
54
+ /** Team or owner */
55
+ team?: string | undefined;
56
+ /** Custom tags */
57
+ tags?: string[] | undefined;
58
+ /** When drift was initialized */
59
+ initializedAt: string;
60
+ }
61
+ /**
62
+ * Full project configuration
63
+ */
64
+ export interface ProjectConfig {
65
+ /** Config schema version */
66
+ version: string;
67
+ /** Project metadata */
68
+ project: ProjectMetadata;
69
+ /** Severity overrides by pattern category */
70
+ severity: Record<string, string>;
71
+ /** Glob patterns to ignore */
72
+ ignore: string[];
73
+ /** CI/CD settings */
74
+ ci: CIConfig;
75
+ /** Learning settings */
76
+ learning: LearningConfig;
77
+ /** Performance settings */
78
+ performance: PerformanceConfig;
79
+ /** Custom detector settings */
80
+ detectors?: Record<string, Record<string, unknown>>;
81
+ /** Feature flags */
82
+ features?: {
83
+ callGraph?: boolean;
84
+ boundaries?: boolean;
85
+ dna?: boolean;
86
+ contracts?: boolean;
87
+ };
88
+ }
89
+ /**
90
+ * Legacy config format (without project metadata)
91
+ */
92
+ export interface LegacyConfig {
93
+ version: string;
94
+ severity: Record<string, string>;
95
+ ignore: string[];
96
+ ci: CIConfig;
97
+ learning: LearningConfig;
98
+ performance: PerformanceConfig;
99
+ }
100
+ export declare function createDefaultConfig(projectPath: string, options?: Partial<ProjectMetadata>): ProjectConfig;
101
+ export declare class ProjectConfigManager {
102
+ private readonly configPath;
103
+ private config;
104
+ constructor(projectRoot: string);
105
+ /**
106
+ * Load configuration from disk
107
+ */
108
+ load(): Promise<ProjectConfig>;
109
+ /**
110
+ * Save configuration to disk
111
+ */
112
+ save(): Promise<void>;
113
+ /**
114
+ * Get current configuration
115
+ */
116
+ get(): ProjectConfig;
117
+ /**
118
+ * Get project ID
119
+ */
120
+ getProjectId(): string;
121
+ /**
122
+ * Get project name
123
+ */
124
+ getProjectName(): string;
125
+ /**
126
+ * Update configuration
127
+ */
128
+ update(updates: Partial<ProjectConfig>): Promise<ProjectConfig>;
129
+ /**
130
+ * Update project metadata
131
+ */
132
+ updateMetadata(updates: Partial<Omit<ProjectMetadata, 'id' | 'initializedAt'>>): Promise<ProjectMetadata>;
133
+ /**
134
+ * Check if config exists
135
+ */
136
+ exists(): Promise<boolean>;
137
+ /**
138
+ * Initialize new configuration
139
+ */
140
+ initialize(projectRoot: string, options?: Partial<ProjectMetadata>): Promise<ProjectConfig>;
141
+ /**
142
+ * Migrate legacy config to new format
143
+ */
144
+ private migrateLegacyConfig;
145
+ }
146
+ /**
147
+ * Create a project config manager
148
+ */
149
+ export declare function createProjectConfigManager(projectRoot: string): ProjectConfigManager;
150
+ /**
151
+ * Load project config (convenience function)
152
+ */
153
+ export declare function loadProjectConfig(projectRoot: string): Promise<ProjectConfig>;
154
+ //# sourceMappingURL=project-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/store/project-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Project Config - Enhanced project-level configuration
3
+ *
4
+ * Extends the basic .drift/config.json with project identification
5
+ * and metadata that links to the global registry.
6
+ */
7
+ import * as fs from 'node:fs/promises';
8
+ import * as path from 'node:path';
9
+ import * as crypto from 'node:crypto';
10
+ // ============================================================================
11
+ // Constants
12
+ // ============================================================================
13
+ const CONFIG_VERSION = '2.0.0';
14
+ const DRIFT_DIR = '.drift';
15
+ const CONFIG_FILE = 'config.json';
16
+ // ============================================================================
17
+ // Default Configuration
18
+ // ============================================================================
19
+ export function createDefaultConfig(projectPath, options) {
20
+ const now = new Date().toISOString();
21
+ return {
22
+ version: CONFIG_VERSION,
23
+ project: {
24
+ id: options?.id ?? crypto.randomUUID(),
25
+ name: options?.name ?? path.basename(projectPath),
26
+ description: options?.description,
27
+ tags: options?.tags,
28
+ initializedAt: now,
29
+ },
30
+ severity: {},
31
+ ignore: [
32
+ 'node_modules/**',
33
+ 'dist/**',
34
+ 'build/**',
35
+ '.git/**',
36
+ 'coverage/**',
37
+ '*.min.js',
38
+ '*.bundle.js',
39
+ 'vendor/**',
40
+ '__pycache__/**',
41
+ '.venv/**',
42
+ 'target/**',
43
+ 'bin/**',
44
+ 'obj/**',
45
+ ],
46
+ ci: {
47
+ failOn: 'error',
48
+ reportFormat: 'text',
49
+ },
50
+ learning: {
51
+ autoApproveThreshold: 0.95,
52
+ minOccurrences: 3,
53
+ semanticLearning: true,
54
+ },
55
+ performance: {
56
+ maxWorkers: 4,
57
+ cacheEnabled: true,
58
+ incrementalAnalysis: true,
59
+ cacheTTL: 3600,
60
+ },
61
+ features: {
62
+ callGraph: true,
63
+ boundaries: true,
64
+ dna: true,
65
+ contracts: true,
66
+ },
67
+ };
68
+ }
69
+ // ============================================================================
70
+ // Config Manager
71
+ // ============================================================================
72
+ export class ProjectConfigManager {
73
+ configPath;
74
+ config = null;
75
+ constructor(projectRoot) {
76
+ this.configPath = path.join(projectRoot, DRIFT_DIR, CONFIG_FILE);
77
+ }
78
+ /**
79
+ * Load configuration from disk
80
+ */
81
+ async load() {
82
+ try {
83
+ const content = await fs.readFile(this.configPath, 'utf-8');
84
+ const data = JSON.parse(content);
85
+ // Check if legacy format
86
+ if (!data.project) {
87
+ // Migrate legacy config
88
+ this.config = this.migrateLegacyConfig(data);
89
+ await this.save();
90
+ }
91
+ else {
92
+ this.config = data;
93
+ }
94
+ return this.config;
95
+ }
96
+ catch (error) {
97
+ if (error.code === 'ENOENT') {
98
+ throw new Error(`Config not found. Run 'drift init' first.`);
99
+ }
100
+ throw error;
101
+ }
102
+ }
103
+ /**
104
+ * Save configuration to disk
105
+ */
106
+ async save() {
107
+ if (!this.config) {
108
+ throw new Error('No config loaded');
109
+ }
110
+ await fs.writeFile(this.configPath, JSON.stringify(this.config, null, 2));
111
+ }
112
+ /**
113
+ * Get current configuration
114
+ */
115
+ get() {
116
+ if (!this.config) {
117
+ throw new Error('Config not loaded. Call load() first.');
118
+ }
119
+ return this.config;
120
+ }
121
+ /**
122
+ * Get project ID
123
+ */
124
+ getProjectId() {
125
+ return this.get().project.id;
126
+ }
127
+ /**
128
+ * Get project name
129
+ */
130
+ getProjectName() {
131
+ return this.get().project.name;
132
+ }
133
+ /**
134
+ * Update configuration
135
+ */
136
+ async update(updates) {
137
+ if (!this.config) {
138
+ throw new Error('Config not loaded. Call load() first.');
139
+ }
140
+ this.config = {
141
+ ...this.config,
142
+ ...updates,
143
+ version: this.config.version,
144
+ project: {
145
+ ...this.config.project,
146
+ ...(updates.project ?? {}),
147
+ id: this.config.project.id, // ID cannot be changed
148
+ initializedAt: this.config.project.initializedAt,
149
+ },
150
+ };
151
+ await this.save();
152
+ return this.config;
153
+ }
154
+ /**
155
+ * Update project metadata
156
+ */
157
+ async updateMetadata(updates) {
158
+ const config = await this.update({
159
+ project: {
160
+ ...this.config.project,
161
+ ...updates,
162
+ },
163
+ });
164
+ return config.project;
165
+ }
166
+ /**
167
+ * Check if config exists
168
+ */
169
+ async exists() {
170
+ try {
171
+ await fs.access(this.configPath);
172
+ return true;
173
+ }
174
+ catch {
175
+ return false;
176
+ }
177
+ }
178
+ /**
179
+ * Initialize new configuration
180
+ */
181
+ async initialize(projectRoot, options) {
182
+ this.config = createDefaultConfig(projectRoot, options);
183
+ await this.save();
184
+ return this.config;
185
+ }
186
+ /**
187
+ * Migrate legacy config to new format
188
+ */
189
+ migrateLegacyConfig(legacy) {
190
+ const projectRoot = path.dirname(path.dirname(this.configPath));
191
+ return {
192
+ version: CONFIG_VERSION,
193
+ project: {
194
+ id: crypto.randomUUID(),
195
+ name: path.basename(projectRoot),
196
+ initializedAt: new Date().toISOString(),
197
+ },
198
+ severity: legacy.severity ?? {},
199
+ ignore: legacy.ignore ?? [],
200
+ ci: legacy.ci ?? { failOn: 'error', reportFormat: 'text' },
201
+ learning: legacy.learning ?? {
202
+ autoApproveThreshold: 0.95,
203
+ minOccurrences: 3,
204
+ },
205
+ performance: legacy.performance ?? {
206
+ maxWorkers: 4,
207
+ cacheEnabled: true,
208
+ incrementalAnalysis: true,
209
+ },
210
+ features: {
211
+ callGraph: true,
212
+ boundaries: true,
213
+ dna: true,
214
+ contracts: true,
215
+ },
216
+ };
217
+ }
218
+ }
219
+ // ============================================================================
220
+ // Factory
221
+ // ============================================================================
222
+ /**
223
+ * Create a project config manager
224
+ */
225
+ export function createProjectConfigManager(projectRoot) {
226
+ return new ProjectConfigManager(projectRoot);
227
+ }
228
+ /**
229
+ * Load project config (convenience function)
230
+ */
231
+ export async function loadProjectConfig(projectRoot) {
232
+ const manager = new ProjectConfigManager(projectRoot);
233
+ return manager.load();
234
+ }
235
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/store/project-config.ts"],"names":[],"mappings":"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"}