driftdetect-core 0.4.4 → 0.4.6

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 (277) hide show
  1. package/LICENSE +21 -0
  2. package/dist/boundaries/boundary-scanner.d.ts.map +1 -1
  3. package/dist/boundaries/boundary-scanner.js +184 -18
  4. package/dist/boundaries/boundary-scanner.js.map +1 -1
  5. package/dist/boundaries/types.d.ts +34 -2
  6. package/dist/boundaries/types.d.ts.map +1 -1
  7. package/dist/call-graph/analysis/graph-builder.d.ts +3 -0
  8. package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -1
  9. package/dist/call-graph/analysis/graph-builder.js +81 -18
  10. package/dist/call-graph/analysis/graph-builder.js.map +1 -1
  11. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -1
  12. package/dist/call-graph/extractors/csharp-data-access-extractor.js +10 -5
  13. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -1
  14. package/dist/call-graph/extractors/data-access-extractor.d.ts +16 -2
  15. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -1
  16. package/dist/call-graph/extractors/data-access-extractor.js +114 -5
  17. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -1
  18. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -1
  19. package/dist/call-graph/extractors/java-data-access-extractor.js +12 -6
  20. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -1
  21. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -1
  22. package/dist/call-graph/extractors/php-data-access-extractor.js +12 -6
  23. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -1
  24. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -1
  25. package/dist/call-graph/extractors/python-data-access-extractor.js +12 -6
  26. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -1
  27. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +4 -0
  28. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -1
  29. package/dist/call-graph/extractors/semantic-data-access-scanner.js +46 -2
  30. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -1
  31. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -1
  32. package/dist/call-graph/extractors/typescript-data-access-extractor.js +23 -10
  33. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -1
  34. package/dist/call-graph/index.d.ts +2 -4
  35. package/dist/call-graph/index.d.ts.map +1 -1
  36. package/dist/call-graph/index.js +5 -6
  37. package/dist/call-graph/index.js.map +1 -1
  38. package/dist/index.d.ts +4 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +15 -5
  41. package/dist/index.js.map +1 -1
  42. package/dist/language-intelligence/base-normalizer.d.ts +68 -0
  43. package/dist/language-intelligence/base-normalizer.d.ts.map +1 -0
  44. package/dist/language-intelligence/base-normalizer.js +210 -0
  45. package/dist/language-intelligence/base-normalizer.js.map +1 -0
  46. package/dist/language-intelligence/framework-registry.d.ts +89 -0
  47. package/dist/language-intelligence/framework-registry.d.ts.map +1 -0
  48. package/dist/language-intelligence/framework-registry.js +165 -0
  49. package/dist/language-intelligence/framework-registry.js.map +1 -0
  50. package/dist/language-intelligence/frameworks/aspnet.d.ts +11 -0
  51. package/dist/language-intelligence/frameworks/aspnet.d.ts.map +1 -0
  52. package/dist/language-intelligence/frameworks/aspnet.js +325 -0
  53. package/dist/language-intelligence/frameworks/aspnet.js.map +1 -0
  54. package/dist/language-intelligence/frameworks/fastapi.d.ts +11 -0
  55. package/dist/language-intelligence/frameworks/fastapi.d.ts.map +1 -0
  56. package/dist/language-intelligence/frameworks/fastapi.js +188 -0
  57. package/dist/language-intelligence/frameworks/fastapi.js.map +1 -0
  58. package/dist/language-intelligence/frameworks/index.d.ts +32 -0
  59. package/dist/language-intelligence/frameworks/index.d.ts.map +1 -0
  60. package/dist/language-intelligence/frameworks/index.js +51 -0
  61. package/dist/language-intelligence/frameworks/index.js.map +1 -0
  62. package/dist/language-intelligence/frameworks/laravel.d.ts +12 -0
  63. package/dist/language-intelligence/frameworks/laravel.d.ts.map +1 -0
  64. package/dist/language-intelligence/frameworks/laravel.js +194 -0
  65. package/dist/language-intelligence/frameworks/laravel.js.map +1 -0
  66. package/dist/language-intelligence/frameworks/nestjs.d.ts +11 -0
  67. package/dist/language-intelligence/frameworks/nestjs.d.ts.map +1 -0
  68. package/dist/language-intelligence/frameworks/nestjs.js +307 -0
  69. package/dist/language-intelligence/frameworks/nestjs.js.map +1 -0
  70. package/dist/language-intelligence/frameworks/spring.d.ts +11 -0
  71. package/dist/language-intelligence/frameworks/spring.d.ts.map +1 -0
  72. package/dist/language-intelligence/frameworks/spring.js +369 -0
  73. package/dist/language-intelligence/frameworks/spring.js.map +1 -0
  74. package/dist/language-intelligence/index.d.ts +33 -0
  75. package/dist/language-intelligence/index.d.ts.map +1 -0
  76. package/dist/language-intelligence/index.js +37 -0
  77. package/dist/language-intelligence/index.js.map +1 -0
  78. package/dist/language-intelligence/language-intelligence.d.ts +99 -0
  79. package/dist/language-intelligence/language-intelligence.d.ts.map +1 -0
  80. package/dist/language-intelligence/language-intelligence.js +239 -0
  81. package/dist/language-intelligence/language-intelligence.js.map +1 -0
  82. package/dist/language-intelligence/normalizers/csharp-normalizer.d.ts +39 -0
  83. package/dist/language-intelligence/normalizers/csharp-normalizer.d.ts.map +1 -0
  84. package/dist/language-intelligence/normalizers/csharp-normalizer.js +86 -0
  85. package/dist/language-intelligence/normalizers/csharp-normalizer.js.map +1 -0
  86. package/dist/language-intelligence/normalizers/index.d.ts +25 -0
  87. package/dist/language-intelligence/normalizers/index.d.ts.map +1 -0
  88. package/dist/language-intelligence/normalizers/index.js +60 -0
  89. package/dist/language-intelligence/normalizers/index.js.map +1 -0
  90. package/dist/language-intelligence/normalizers/java-normalizer.d.ts +39 -0
  91. package/dist/language-intelligence/normalizers/java-normalizer.d.ts.map +1 -0
  92. package/dist/language-intelligence/normalizers/java-normalizer.js +96 -0
  93. package/dist/language-intelligence/normalizers/java-normalizer.js.map +1 -0
  94. package/dist/language-intelligence/normalizers/php-normalizer.d.ts +39 -0
  95. package/dist/language-intelligence/normalizers/php-normalizer.d.ts.map +1 -0
  96. package/dist/language-intelligence/normalizers/php-normalizer.js +86 -0
  97. package/dist/language-intelligence/normalizers/php-normalizer.js.map +1 -0
  98. package/dist/language-intelligence/normalizers/python-normalizer.d.ts +39 -0
  99. package/dist/language-intelligence/normalizers/python-normalizer.d.ts.map +1 -0
  100. package/dist/language-intelligence/normalizers/python-normalizer.js +95 -0
  101. package/dist/language-intelligence/normalizers/python-normalizer.js.map +1 -0
  102. package/dist/language-intelligence/normalizers/typescript-normalizer.d.ts +39 -0
  103. package/dist/language-intelligence/normalizers/typescript-normalizer.d.ts.map +1 -0
  104. package/dist/language-intelligence/normalizers/typescript-normalizer.js +84 -0
  105. package/dist/language-intelligence/normalizers/typescript-normalizer.js.map +1 -0
  106. package/dist/language-intelligence/types.d.ts +270 -0
  107. package/dist/language-intelligence/types.d.ts.map +1 -0
  108. package/dist/language-intelligence/types.js +9 -0
  109. package/dist/language-intelligence/types.js.map +1 -0
  110. package/dist/scanner/file-processor-worker.d.ts +66 -0
  111. package/dist/scanner/file-processor-worker.d.ts.map +1 -0
  112. package/dist/scanner/file-processor-worker.js +189 -0
  113. package/dist/scanner/file-processor-worker.js.map +1 -0
  114. package/dist/scanner/index.d.ts +2 -0
  115. package/dist/scanner/index.d.ts.map +1 -1
  116. package/dist/scanner/index.js +2 -0
  117. package/dist/scanner/index.js.map +1 -1
  118. package/dist/scanner/threaded-worker-pool.d.ts +182 -0
  119. package/dist/scanner/threaded-worker-pool.d.ts.map +1 -0
  120. package/dist/scanner/threaded-worker-pool.js +243 -0
  121. package/dist/scanner/threaded-worker-pool.js.map +1 -0
  122. package/dist/store/types.d.ts +6 -3
  123. package/dist/store/types.d.ts.map +1 -1
  124. package/dist/store/types.js.map +1 -1
  125. package/dist/unified-provider/compat/index.d.ts +11 -0
  126. package/dist/unified-provider/compat/index.d.ts.map +1 -0
  127. package/dist/unified-provider/compat/index.js +13 -0
  128. package/dist/unified-provider/compat/index.js.map +1 -0
  129. package/dist/unified-provider/compat/legacy-extractors.d.ts +63 -0
  130. package/dist/unified-provider/compat/legacy-extractors.d.ts.map +1 -0
  131. package/dist/unified-provider/compat/legacy-extractors.js +80 -0
  132. package/dist/unified-provider/compat/legacy-extractors.js.map +1 -0
  133. package/dist/unified-provider/compat/legacy-scanner.d.ts +28 -0
  134. package/dist/unified-provider/compat/legacy-scanner.d.ts.map +1 -0
  135. package/dist/unified-provider/compat/legacy-scanner.js +31 -0
  136. package/dist/unified-provider/compat/legacy-scanner.js.map +1 -0
  137. package/dist/unified-provider/index.d.ts +28 -0
  138. package/dist/unified-provider/index.d.ts.map +1 -0
  139. package/dist/unified-provider/index.js +47 -0
  140. package/dist/unified-provider/index.js.map +1 -0
  141. package/dist/unified-provider/integration/index.d.ts +9 -0
  142. package/dist/unified-provider/integration/index.d.ts.map +1 -0
  143. package/dist/unified-provider/integration/index.js +11 -0
  144. package/dist/unified-provider/integration/index.js.map +1 -0
  145. package/dist/unified-provider/integration/unified-data-access-adapter.d.ts +75 -0
  146. package/dist/unified-provider/integration/unified-data-access-adapter.d.ts.map +1 -0
  147. package/dist/unified-provider/integration/unified-data-access-adapter.js +210 -0
  148. package/dist/unified-provider/integration/unified-data-access-adapter.js.map +1 -0
  149. package/dist/unified-provider/integration/unified-scanner.d.ts +90 -0
  150. package/dist/unified-provider/integration/unified-scanner.d.ts.map +1 -0
  151. package/dist/unified-provider/integration/unified-scanner.js +369 -0
  152. package/dist/unified-provider/integration/unified-scanner.js.map +1 -0
  153. package/dist/unified-provider/matching/base-matcher.d.ts +80 -0
  154. package/dist/unified-provider/matching/base-matcher.d.ts.map +1 -0
  155. package/dist/unified-provider/matching/base-matcher.js +196 -0
  156. package/dist/unified-provider/matching/base-matcher.js.map +1 -0
  157. package/dist/unified-provider/matching/django-matcher.d.ts +32 -0
  158. package/dist/unified-provider/matching/django-matcher.d.ts.map +1 -0
  159. package/dist/unified-provider/matching/django-matcher.js +107 -0
  160. package/dist/unified-provider/matching/django-matcher.js.map +1 -0
  161. package/dist/unified-provider/matching/drizzle-matcher.d.ts +25 -0
  162. package/dist/unified-provider/matching/drizzle-matcher.d.ts.map +1 -0
  163. package/dist/unified-provider/matching/drizzle-matcher.js +123 -0
  164. package/dist/unified-provider/matching/drizzle-matcher.js.map +1 -0
  165. package/dist/unified-provider/matching/efcore-matcher.d.ts +27 -0
  166. package/dist/unified-provider/matching/efcore-matcher.d.ts.map +1 -0
  167. package/dist/unified-provider/matching/efcore-matcher.js +88 -0
  168. package/dist/unified-provider/matching/efcore-matcher.js.map +1 -0
  169. package/dist/unified-provider/matching/eloquent-matcher.d.ts +32 -0
  170. package/dist/unified-provider/matching/eloquent-matcher.d.ts.map +1 -0
  171. package/dist/unified-provider/matching/eloquent-matcher.js +162 -0
  172. package/dist/unified-provider/matching/eloquent-matcher.js.map +1 -0
  173. package/dist/unified-provider/matching/index.d.ts +19 -0
  174. package/dist/unified-provider/matching/index.d.ts.map +1 -0
  175. package/dist/unified-provider/matching/index.js +24 -0
  176. package/dist/unified-provider/matching/index.js.map +1 -0
  177. package/dist/unified-provider/matching/knex-matcher.d.ts +26 -0
  178. package/dist/unified-provider/matching/knex-matcher.d.ts.map +1 -0
  179. package/dist/unified-provider/matching/knex-matcher.js +109 -0
  180. package/dist/unified-provider/matching/knex-matcher.js.map +1 -0
  181. package/dist/unified-provider/matching/matcher-registry.d.ts +55 -0
  182. package/dist/unified-provider/matching/matcher-registry.d.ts.map +1 -0
  183. package/dist/unified-provider/matching/matcher-registry.js +130 -0
  184. package/dist/unified-provider/matching/matcher-registry.js.map +1 -0
  185. package/dist/unified-provider/matching/mongoose-matcher.d.ts +30 -0
  186. package/dist/unified-provider/matching/mongoose-matcher.d.ts.map +1 -0
  187. package/dist/unified-provider/matching/mongoose-matcher.js +132 -0
  188. package/dist/unified-provider/matching/mongoose-matcher.js.map +1 -0
  189. package/dist/unified-provider/matching/prisma-matcher.d.ts +31 -0
  190. package/dist/unified-provider/matching/prisma-matcher.d.ts.map +1 -0
  191. package/dist/unified-provider/matching/prisma-matcher.js +123 -0
  192. package/dist/unified-provider/matching/prisma-matcher.js.map +1 -0
  193. package/dist/unified-provider/matching/raw-sql-matcher.d.ts +31 -0
  194. package/dist/unified-provider/matching/raw-sql-matcher.d.ts.map +1 -0
  195. package/dist/unified-provider/matching/raw-sql-matcher.js +173 -0
  196. package/dist/unified-provider/matching/raw-sql-matcher.js.map +1 -0
  197. package/dist/unified-provider/matching/sequelize-matcher.d.ts +28 -0
  198. package/dist/unified-provider/matching/sequelize-matcher.d.ts.map +1 -0
  199. package/dist/unified-provider/matching/sequelize-matcher.js +132 -0
  200. package/dist/unified-provider/matching/sequelize-matcher.js.map +1 -0
  201. package/dist/unified-provider/matching/spring-data-matcher.d.ts +32 -0
  202. package/dist/unified-provider/matching/spring-data-matcher.d.ts.map +1 -0
  203. package/dist/unified-provider/matching/spring-data-matcher.js +112 -0
  204. package/dist/unified-provider/matching/spring-data-matcher.js.map +1 -0
  205. package/dist/unified-provider/matching/sqlalchemy-matcher.d.ts +32 -0
  206. package/dist/unified-provider/matching/sqlalchemy-matcher.d.ts.map +1 -0
  207. package/dist/unified-provider/matching/sqlalchemy-matcher.js +201 -0
  208. package/dist/unified-provider/matching/sqlalchemy-matcher.js.map +1 -0
  209. package/dist/unified-provider/matching/supabase-matcher.d.ts +27 -0
  210. package/dist/unified-provider/matching/supabase-matcher.d.ts.map +1 -0
  211. package/dist/unified-provider/matching/supabase-matcher.js +122 -0
  212. package/dist/unified-provider/matching/supabase-matcher.js.map +1 -0
  213. package/dist/unified-provider/matching/typeorm-matcher.d.ts +32 -0
  214. package/dist/unified-provider/matching/typeorm-matcher.d.ts.map +1 -0
  215. package/dist/unified-provider/matching/typeorm-matcher.js +169 -0
  216. package/dist/unified-provider/matching/typeorm-matcher.js.map +1 -0
  217. package/dist/unified-provider/migration/deprecated-extractors.d.ts +104 -0
  218. package/dist/unified-provider/migration/deprecated-extractors.d.ts.map +1 -0
  219. package/dist/unified-provider/migration/deprecated-extractors.js +129 -0
  220. package/dist/unified-provider/migration/deprecated-extractors.js.map +1 -0
  221. package/dist/unified-provider/migration/deprecated-scanner.d.ts +40 -0
  222. package/dist/unified-provider/migration/deprecated-scanner.d.ts.map +1 -0
  223. package/dist/unified-provider/migration/deprecated-scanner.js +49 -0
  224. package/dist/unified-provider/migration/deprecated-scanner.js.map +1 -0
  225. package/dist/unified-provider/migration/index.d.ts +41 -0
  226. package/dist/unified-provider/migration/index.d.ts.map +1 -0
  227. package/dist/unified-provider/migration/index.js +43 -0
  228. package/dist/unified-provider/migration/index.js.map +1 -0
  229. package/dist/unified-provider/normalization/base-normalizer.d.ts +188 -0
  230. package/dist/unified-provider/normalization/base-normalizer.d.ts.map +1 -0
  231. package/dist/unified-provider/normalization/base-normalizer.js +339 -0
  232. package/dist/unified-provider/normalization/base-normalizer.js.map +1 -0
  233. package/dist/unified-provider/normalization/csharp-normalizer.d.ts +58 -0
  234. package/dist/unified-provider/normalization/csharp-normalizer.d.ts.map +1 -0
  235. package/dist/unified-provider/normalization/csharp-normalizer.js +467 -0
  236. package/dist/unified-provider/normalization/csharp-normalizer.js.map +1 -0
  237. package/dist/unified-provider/normalization/index.d.ts +23 -0
  238. package/dist/unified-provider/normalization/index.d.ts.map +1 -0
  239. package/dist/unified-provider/normalization/index.js +62 -0
  240. package/dist/unified-provider/normalization/index.js.map +1 -0
  241. package/dist/unified-provider/normalization/java-normalizer.d.ts +54 -0
  242. package/dist/unified-provider/normalization/java-normalizer.d.ts.map +1 -0
  243. package/dist/unified-provider/normalization/java-normalizer.js +453 -0
  244. package/dist/unified-provider/normalization/java-normalizer.js.map +1 -0
  245. package/dist/unified-provider/normalization/php-normalizer.d.ts +54 -0
  246. package/dist/unified-provider/normalization/php-normalizer.d.ts.map +1 -0
  247. package/dist/unified-provider/normalization/php-normalizer.js +489 -0
  248. package/dist/unified-provider/normalization/php-normalizer.js.map +1 -0
  249. package/dist/unified-provider/normalization/python-normalizer.d.ts +61 -0
  250. package/dist/unified-provider/normalization/python-normalizer.d.ts.map +1 -0
  251. package/dist/unified-provider/normalization/python-normalizer.js +548 -0
  252. package/dist/unified-provider/normalization/python-normalizer.js.map +1 -0
  253. package/dist/unified-provider/normalization/typescript-normalizer.d.ts +60 -0
  254. package/dist/unified-provider/normalization/typescript-normalizer.d.ts.map +1 -0
  255. package/dist/unified-provider/normalization/typescript-normalizer.js +608 -0
  256. package/dist/unified-provider/normalization/typescript-normalizer.js.map +1 -0
  257. package/dist/unified-provider/parsing/index.d.ts +5 -0
  258. package/dist/unified-provider/parsing/index.d.ts.map +1 -0
  259. package/dist/unified-provider/parsing/index.js +5 -0
  260. package/dist/unified-provider/parsing/index.js.map +1 -0
  261. package/dist/unified-provider/parsing/parser-registry.d.ts +70 -0
  262. package/dist/unified-provider/parsing/parser-registry.d.ts.map +1 -0
  263. package/dist/unified-provider/parsing/parser-registry.js +260 -0
  264. package/dist/unified-provider/parsing/parser-registry.js.map +1 -0
  265. package/dist/unified-provider/provider/index.d.ts +5 -0
  266. package/dist/unified-provider/provider/index.d.ts.map +1 -0
  267. package/dist/unified-provider/provider/index.js +5 -0
  268. package/dist/unified-provider/provider/index.js.map +1 -0
  269. package/dist/unified-provider/provider/unified-language-provider.d.ts +56 -0
  270. package/dist/unified-provider/provider/unified-language-provider.d.ts.map +1 -0
  271. package/dist/unified-provider/provider/unified-language-provider.js +212 -0
  272. package/dist/unified-provider/provider/unified-language-provider.js.map +1 -0
  273. package/dist/unified-provider/types.d.ts +389 -0
  274. package/dist/unified-provider/types.d.ts.map +1 -0
  275. package/dist/unified-provider/types.js +9 -0
  276. package/dist/unified-provider/types.js.map +1 -0
  277. package/package.json +21 -17
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Language Intelligence Layer - Core Types
3
+ *
4
+ * Unified semantic model for cross-language code analysis.
5
+ * This layer sits ON TOP of existing extractors, adding semantic
6
+ * normalization without modifying any existing code.
7
+ */
8
+ import type { CallGraphLanguage, FunctionExtraction, FileExtractionResult } from '../call-graph/types.js';
9
+ import type { DataAccessPoint } from '../boundaries/types.js';
10
+ /**
11
+ * High-level semantic categories for decorators/annotations
12
+ */
13
+ export type SemanticCategory = 'routing' | 'di' | 'orm' | 'auth' | 'validation' | 'test' | 'logging' | 'caching' | 'scheduling' | 'messaging' | 'middleware' | 'unknown';
14
+ /**
15
+ * HTTP methods for routing decorators
16
+ * Note: Aligned with contracts.ts HttpMethod for compatibility
17
+ */
18
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
19
+ /**
20
+ * Data access mode
21
+ */
22
+ export type DataAccessMode = 'read' | 'write' | 'both';
23
+ /**
24
+ * Semantic meaning extracted from a decorator/annotation
25
+ */
26
+ export interface DecoratorSemantics {
27
+ /** High-level category */
28
+ category: SemanticCategory;
29
+ /** Human-readable description of what this decorator does */
30
+ intent: string;
31
+ /** Whether this marks a function as an entry point (API endpoint, event handler, etc.) */
32
+ isEntryPoint: boolean;
33
+ /** Whether this marks a class/function as injectable (DI service) */
34
+ isInjectable: boolean;
35
+ /** Whether this marks a function as requiring authentication */
36
+ requiresAuth: boolean;
37
+ /** Data access mode if this is an ORM decorator */
38
+ dataAccess?: DataAccessMode;
39
+ /** Confidence score (0-1) for this semantic interpretation */
40
+ confidence: number;
41
+ }
42
+ /**
43
+ * Normalized decorator that works across all languages
44
+ *
45
+ * Takes raw decorator strings like "@Controller", "[ApiController]", "@app.route"
46
+ * and normalizes them to a common semantic model.
47
+ */
48
+ export interface NormalizedDecorator {
49
+ /** Original raw decorator string as extracted by tree-sitter */
50
+ raw: string;
51
+ /** Normalized name (without @ or [] or language-specific syntax) */
52
+ name: string;
53
+ /** Source language */
54
+ language: CallGraphLanguage;
55
+ /** Framework that defines this decorator (if known) */
56
+ framework?: string;
57
+ /** Semantic meaning */
58
+ semantic: DecoratorSemantics;
59
+ /** Extracted arguments from the decorator */
60
+ arguments: DecoratorArguments;
61
+ }
62
+ /**
63
+ * Common decorator arguments extracted across languages
64
+ */
65
+ export interface DecoratorArguments {
66
+ /** Route path for routing decorators: "/api/users" */
67
+ path?: string;
68
+ /** HTTP methods: ["GET", "POST"] */
69
+ methods?: HttpMethod[];
70
+ /** Named route/endpoint */
71
+ name?: string;
72
+ /** Middleware/guards to apply */
73
+ middleware?: string[];
74
+ /** Roles/permissions required */
75
+ roles?: string[];
76
+ /** Scope for DI (singleton, transient, scoped) */
77
+ scope?: 'singleton' | 'transient' | 'scoped';
78
+ /** Generic key-value arguments */
79
+ [key: string]: unknown;
80
+ }
81
+ /**
82
+ * Semantic information derived from a function and its decorators
83
+ */
84
+ export interface FunctionSemantics {
85
+ /** Is this an entry point (API endpoint, event handler, CLI command, etc.) */
86
+ isEntryPoint: boolean;
87
+ /** Is this a data accessor (reads/writes to database) */
88
+ isDataAccessor: boolean;
89
+ /** Is this an auth handler (login, logout, token validation) */
90
+ isAuthHandler: boolean;
91
+ /** Is this a test case */
92
+ isTestCase: boolean;
93
+ /** Is this an injectable service */
94
+ isInjectable: boolean;
95
+ /** Entry point details (if isEntryPoint) */
96
+ entryPoint?: {
97
+ type: 'http' | 'graphql' | 'grpc' | 'websocket' | 'event' | 'scheduled' | 'cli';
98
+ path?: string | undefined;
99
+ methods?: HttpMethod[] | undefined;
100
+ } | undefined;
101
+ /** Injected dependencies (service names) */
102
+ dependencies: string[];
103
+ /** Data access points within this function */
104
+ dataAccess: DataAccessPoint[];
105
+ /** Required authentication/authorization */
106
+ auth?: {
107
+ required: boolean;
108
+ roles?: string[] | undefined;
109
+ permissions?: string[] | undefined;
110
+ } | undefined;
111
+ }
112
+ /**
113
+ * Normalized function with semantic enrichment
114
+ *
115
+ * Extends the raw FunctionExtraction with semantic information
116
+ * derived from decorators and framework knowledge.
117
+ */
118
+ export interface NormalizedFunction extends FunctionExtraction {
119
+ /** Normalized decorators with semantic meaning */
120
+ normalizedDecorators: NormalizedDecorator[];
121
+ /** Derived semantic information */
122
+ semantics: FunctionSemantics;
123
+ }
124
+ /**
125
+ * Result of normalizing a file extraction
126
+ */
127
+ export interface NormalizedExtractionResult extends Omit<FileExtractionResult, 'functions'> {
128
+ /** Normalized functions with semantic enrichment */
129
+ functions: NormalizedFunction[];
130
+ /** Detected frameworks in this file */
131
+ detectedFrameworks: string[];
132
+ /** Overall file semantics */
133
+ fileSemantics: {
134
+ /** Is this a controller/router file */
135
+ isController: boolean;
136
+ /** Is this a service/provider file */
137
+ isService: boolean;
138
+ /** Is this a model/entity file */
139
+ isModel: boolean;
140
+ /** Is this a test file */
141
+ isTestFile: boolean;
142
+ /** Primary framework detected */
143
+ primaryFramework?: string | undefined;
144
+ };
145
+ }
146
+ /**
147
+ * A single decorator pattern mapping
148
+ */
149
+ export interface DecoratorMapping {
150
+ /** Pattern to match decorator strings (applied to already-extracted decorator) */
151
+ pattern: RegExp;
152
+ /** Semantic meaning when matched */
153
+ semantic: Omit<DecoratorSemantics, 'confidence'>;
154
+ /** Function to extract arguments from the raw decorator string */
155
+ extractArgs: (raw: string) => DecoratorArguments;
156
+ /** Confidence score for this mapping (default: 1.0) */
157
+ confidence?: number;
158
+ }
159
+ /**
160
+ * Framework pattern definition
161
+ *
162
+ * Declarative definition of how a framework uses decorators/annotations.
163
+ * This is the "knowledge base" that powers semantic normalization.
164
+ */
165
+ export interface FrameworkPattern {
166
+ /** Framework identifier: "spring", "laravel", "fastapi", "nestjs", "aspnet" */
167
+ framework: string;
168
+ /** Display name: "Spring Boot", "Laravel", "FastAPI" */
169
+ displayName: string;
170
+ /** Languages this framework applies to */
171
+ languages: CallGraphLanguage[];
172
+ /** Version constraints (optional) */
173
+ version?: string;
174
+ /** Decorator/annotation mappings */
175
+ decoratorMappings: DecoratorMapping[];
176
+ /** Patterns that indicate this framework is in use (for detection) */
177
+ detectionPatterns: {
178
+ /** Import patterns that indicate framework usage */
179
+ imports?: RegExp[];
180
+ /** Decorator patterns that indicate framework usage */
181
+ decorators?: RegExp[];
182
+ /** File patterns (e.g., "*.controller.ts" for NestJS) */
183
+ filePatterns?: RegExp[];
184
+ };
185
+ /** Patterns that mark entry points */
186
+ entryPointPatterns: RegExp[];
187
+ /** Patterns that mark injectable services */
188
+ diPatterns: RegExp[];
189
+ /** Patterns that indicate ORM/data access */
190
+ ormPatterns: RegExp[];
191
+ /** Patterns that indicate auth requirements */
192
+ authPatterns: RegExp[];
193
+ }
194
+ /**
195
+ * Interface for language-specific normalizers
196
+ *
197
+ * Each normalizer wraps an existing extractor and adds semantic normalization.
198
+ */
199
+ export interface LanguageNormalizer {
200
+ /** Language this normalizer handles */
201
+ readonly language: CallGraphLanguage;
202
+ /** File extensions this normalizer handles */
203
+ readonly extensions: string[];
204
+ /**
205
+ * Normalize an extraction result
206
+ *
207
+ * Takes raw extraction from existing extractor and adds semantic information.
208
+ */
209
+ normalize(source: string, filePath: string): NormalizedExtractionResult;
210
+ /**
211
+ * Normalize a single decorator string
212
+ */
213
+ normalizeDecorator(raw: string, frameworks: FrameworkPattern[]): NormalizedDecorator;
214
+ /**
215
+ * Detect which frameworks are in use in the source
216
+ */
217
+ detectFrameworks(source: string): FrameworkPattern[];
218
+ /**
219
+ * Check if this normalizer can handle a file
220
+ */
221
+ canHandle(filePath: string): boolean;
222
+ }
223
+ /**
224
+ * Options for querying normalized functions
225
+ */
226
+ export interface QueryOptions {
227
+ /** Filter by semantic category */
228
+ category?: SemanticCategory;
229
+ /** Filter by framework */
230
+ framework?: string;
231
+ /** Filter by language */
232
+ language?: CallGraphLanguage;
233
+ /** Only entry points */
234
+ entryPointsOnly?: boolean;
235
+ /** Only data accessors */
236
+ dataAccessorsOnly?: boolean;
237
+ /** Only functions requiring auth */
238
+ authRequiredOnly?: boolean;
239
+ /** Filter by table name (for data accessors) */
240
+ table?: string;
241
+ }
242
+ /**
243
+ * Result of a cross-language query
244
+ */
245
+ export interface QueryResult {
246
+ /** Matching functions */
247
+ functions: NormalizedFunction[];
248
+ /** Files containing matches */
249
+ files: string[];
250
+ /** Frameworks involved */
251
+ frameworks: string[];
252
+ /** Languages involved */
253
+ languages: CallGraphLanguage[];
254
+ /** Total count */
255
+ count: number;
256
+ }
257
+ /**
258
+ * Configuration for the Language Intelligence system
259
+ */
260
+ export interface LanguageIntelligenceConfig {
261
+ /** Root directory of the project */
262
+ rootDir: string;
263
+ /** Additional framework patterns to register */
264
+ customFrameworks?: FrameworkPattern[];
265
+ /** Whether to auto-detect frameworks */
266
+ autoDetect?: boolean;
267
+ /** Verbose logging */
268
+ verbose?: boolean;
269
+ }
270
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/language-intelligence/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Language Intelligence Layer - Core Types
3
+ *
4
+ * Unified semantic model for cross-language code analysis.
5
+ * This layer sits ON TOP of existing extractors, adding semantic
6
+ * normalization without modifying any existing code.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/language-intelligence/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * File Processor Worker - Worker thread for CPU-bound file processing
3
+ *
4
+ * This worker runs in a separate thread and handles:
5
+ * - Tree-sitter AST parsing
6
+ * - Regex pattern matching
7
+ * - File content analysis
8
+ *
9
+ * @requirements 2.6 - Parallel file processing with worker threads
10
+ */
11
+ /**
12
+ * Task input for file processing
13
+ */
14
+ export interface FileProcessorTask {
15
+ /** Absolute path to the file */
16
+ filePath: string;
17
+ /** File content (optional - will be read if not provided) */
18
+ content?: string;
19
+ /** Root directory for relative path calculation */
20
+ rootDir: string;
21
+ /** Patterns to match (regex strings) */
22
+ patterns?: Array<{
23
+ id: string;
24
+ regex: string;
25
+ flags?: string;
26
+ }>;
27
+ /** Whether to parse AST */
28
+ parseAst?: boolean;
29
+ /** Language hint (optional - will be detected from extension) */
30
+ language?: string;
31
+ }
32
+ /**
33
+ * Result of file processing
34
+ */
35
+ export interface FileProcessorResult {
36
+ /** Relative path to the file */
37
+ relativePath: string;
38
+ /** Absolute path to the file */
39
+ absolutePath: string;
40
+ /** Detected language */
41
+ language: string | null;
42
+ /** Pattern matches found */
43
+ matches: Array<{
44
+ patternId: string;
45
+ line: number;
46
+ column: number;
47
+ match: string;
48
+ }>;
49
+ /** AST info (if parsed) */
50
+ ast?: {
51
+ nodeCount: number;
52
+ rootType: string;
53
+ hasErrors: boolean;
54
+ } | undefined;
55
+ /** Processing duration in milliseconds */
56
+ duration: number;
57
+ /** Error message if processing failed */
58
+ error?: string | undefined;
59
+ }
60
+ /**
61
+ * Process a single file
62
+ *
63
+ * This is the main export that Piscina will call for each task.
64
+ */
65
+ export default function processFile(task: FileProcessorTask): Promise<FileProcessorResult>;
66
+ //# sourceMappingURL=file-processor-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-processor-worker.d.ts","sourceRoot":"","sources":["../../src/scanner/file-processor-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IAEjB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAEhB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IAEH,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IAErB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IAErB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB,4BAA4B;IAC5B,OAAO,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IAEH,2BAA2B;IAC3B,GAAG,CAAC,EAAE;QACJ,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;KACpB,GAAG,SAAS,CAAC;IAEd,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IAEjB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AA2CD;;;;GAIG;AACH,wBAA8B,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuF/F"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * File Processor Worker - Worker thread for CPU-bound file processing
3
+ *
4
+ * This worker runs in a separate thread and handles:
5
+ * - Tree-sitter AST parsing
6
+ * - Regex pattern matching
7
+ * - File content analysis
8
+ *
9
+ * @requirements 2.6 - Parallel file processing with worker threads
10
+ */
11
+ import * as fs from 'node:fs/promises';
12
+ import * as path from 'node:path';
13
+ /**
14
+ * Extension to language mapping
15
+ */
16
+ const EXTENSION_LANGUAGE_MAP = {
17
+ '.ts': 'typescript',
18
+ '.tsx': 'typescript',
19
+ '.mts': 'typescript',
20
+ '.cts': 'typescript',
21
+ '.js': 'javascript',
22
+ '.jsx': 'javascript',
23
+ '.mjs': 'javascript',
24
+ '.cjs': 'javascript',
25
+ '.py': 'python',
26
+ '.pyw': 'python',
27
+ '.cs': 'csharp',
28
+ '.java': 'java',
29
+ '.php': 'php',
30
+ };
31
+ /**
32
+ * Detect language from file extension
33
+ */
34
+ function detectLanguage(filePath) {
35
+ const ext = path.extname(filePath).toLowerCase();
36
+ return EXTENSION_LANGUAGE_MAP[ext] || null;
37
+ }
38
+ /**
39
+ * Count nodes in a tree-sitter tree
40
+ */
41
+ function countNodes(node) {
42
+ let count = 1;
43
+ for (let i = 0; i < node.childCount; i++) {
44
+ const child = node.children[i];
45
+ if (child) {
46
+ count += countNodes(child);
47
+ }
48
+ }
49
+ return count;
50
+ }
51
+ /**
52
+ * Process a single file
53
+ *
54
+ * This is the main export that Piscina will call for each task.
55
+ */
56
+ export default async function processFile(task) {
57
+ const startTime = Date.now();
58
+ const relativePath = path.relative(task.rootDir, task.filePath);
59
+ const language = task.language || detectLanguage(task.filePath);
60
+ try {
61
+ // Read content if not provided
62
+ const content = task.content ?? await fs.readFile(task.filePath, 'utf-8');
63
+ const matches = [];
64
+ // Run regex pattern matching
65
+ if (task.patterns && task.patterns.length > 0) {
66
+ for (const pattern of task.patterns) {
67
+ try {
68
+ const regex = new RegExp(pattern.regex, pattern.flags || 'gm');
69
+ let match;
70
+ // Reset regex state
71
+ regex.lastIndex = 0;
72
+ while ((match = regex.exec(content)) !== null) {
73
+ // Calculate line and column from match index
74
+ let line = 1;
75
+ let lastNewline = 0;
76
+ for (let i = 0; i < match.index; i++) {
77
+ if (content[i] === '\n') {
78
+ line++;
79
+ lastNewline = i + 1;
80
+ }
81
+ }
82
+ const column = match.index - lastNewline + 1;
83
+ matches.push({
84
+ patternId: pattern.id,
85
+ line,
86
+ column,
87
+ match: match[0].substring(0, 100), // Limit match length
88
+ });
89
+ // Prevent infinite loops on zero-length matches
90
+ if (match[0].length === 0) {
91
+ regex.lastIndex++;
92
+ }
93
+ }
94
+ }
95
+ catch (regexError) {
96
+ // Invalid regex - skip this pattern
97
+ console.error(`Invalid regex pattern ${pattern.id}: ${regexError}`);
98
+ }
99
+ }
100
+ }
101
+ // Parse AST if requested
102
+ let ast;
103
+ if (task.parseAst && language) {
104
+ try {
105
+ ast = await parseAst(content, language);
106
+ }
107
+ catch (astError) {
108
+ // AST parsing failed - continue without it
109
+ ast = {
110
+ nodeCount: 0,
111
+ rootType: 'error',
112
+ hasErrors: true,
113
+ };
114
+ }
115
+ }
116
+ return {
117
+ relativePath,
118
+ absolutePath: task.filePath,
119
+ language,
120
+ matches,
121
+ ast,
122
+ duration: Date.now() - startTime,
123
+ };
124
+ }
125
+ catch (error) {
126
+ return {
127
+ relativePath,
128
+ absolutePath: task.filePath,
129
+ language,
130
+ matches: [],
131
+ duration: Date.now() - startTime,
132
+ error: error instanceof Error ? error.message : String(error),
133
+ };
134
+ }
135
+ }
136
+ /**
137
+ * Parse AST using tree-sitter
138
+ */
139
+ async function parseAst(content, language) {
140
+ // Dynamic import tree-sitter based on language
141
+ // Each worker thread loads its own instance of tree-sitter
142
+ let Parser;
143
+ let languageModule;
144
+ try {
145
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
146
+ Parser = require('tree-sitter');
147
+ }
148
+ catch {
149
+ throw new Error('tree-sitter not available');
150
+ }
151
+ // Load language-specific grammar
152
+ switch (language) {
153
+ case 'python':
154
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
155
+ languageModule = require('tree-sitter-python');
156
+ break;
157
+ case 'typescript':
158
+ case 'javascript':
159
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
160
+ const tsModule = require('tree-sitter-typescript');
161
+ languageModule = language === 'typescript' ? tsModule.typescript : tsModule.tsx;
162
+ break;
163
+ case 'csharp':
164
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
165
+ languageModule = require('tree-sitter-c-sharp');
166
+ break;
167
+ case 'java':
168
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
169
+ languageModule = require('tree-sitter-java');
170
+ break;
171
+ case 'php':
172
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
173
+ const phpModule = require('tree-sitter-php');
174
+ languageModule = phpModule.php;
175
+ break;
176
+ default:
177
+ throw new Error(`Unsupported language: ${language}`);
178
+ }
179
+ const parser = new Parser();
180
+ parser.setLanguage(languageModule);
181
+ const tree = parser.parse(content);
182
+ const rootNode = tree.rootNode;
183
+ return {
184
+ nodeCount: countNodes(rootNode),
185
+ rootType: rootNode.type,
186
+ hasErrors: rootNode.hasError,
187
+ };
188
+ }
189
+ //# sourceMappingURL=file-processor-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-processor-worker.js","sourceRoot":"","sources":["../../src/scanner/file-processor-worker.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,6 @@ export { FileWalker } from './file-walker.js';
9
9
  export { ChangeDetector, type ChangeType, type FileSnapshot, type ChangeSet, type FileChange, type ChangeDetectionOptions, type SnapshotFile, } from './change-detector.js';
10
10
  export { DependencyGraph, type ImportType, type ExportType, type ImportInfo, type ImportSpecifier, type ExportInfo, type ModuleNode, type DependencyEdge, type CircularDependencyResult, type DependencyGraphOptions, } from './dependency-graph.js';
11
11
  export { WorkerPool, createFileProcessorPool, type WorkerPoolOptions, type TaskStatus, type Task, type TaskResult, type WorkerPoolStats, type WorkerPoolEvents, type TaskProcessor, } from './worker-pool.js';
12
+ export { ThreadedWorkerPool, createThreadedPool, getModuleDir, type ThreadedWorkerPoolOptions, type ThreadedWorkerPoolStats, type BatchResult, type ThreadedWorkerPoolEvents, } from './threaded-worker-pool.js';
13
+ export type { FileProcessorTask, FileProcessorResult, } from './file-processor-worker.js';
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,cAAc,EACd,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,YAAY,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,cAAc,EACd,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,YAAY,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAChB,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EACV,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC"}
@@ -9,4 +9,6 @@ export { FileWalker } from './file-walker.js';
9
9
  export { ChangeDetector, } from './change-detector.js';
10
10
  export { DependencyGraph, } from './dependency-graph.js';
11
11
  export { WorkerPool, createFileProcessorPool, } from './worker-pool.js';
12
+ // Threaded Worker Pool (true multi-threading with Piscina)
13
+ export { ThreadedWorkerPool, createThreadedPool, getModuleDir, } from './threaded-worker-pool.js';
12
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,cAAc,GAOf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,GAUhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,uBAAuB,GAQxB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,cAAc,GAOf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,eAAe,GAUhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,uBAAuB,GAQxB,MAAM,kBAAkB,CAAC;AAE1B,2DAA2D;AAC3D,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,GAKb,MAAM,2BAA2B,CAAC"}