driftdetect-core 0.4.5 → 0.5.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 (578) 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 +8 -0
  12. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -1
  13. package/dist/call-graph/extractors/csharp-data-access-extractor.js +18 -5
  14. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -1
  15. package/dist/call-graph/extractors/csharp-extractor.d.ts +35 -0
  16. package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -1
  17. package/dist/call-graph/extractors/csharp-extractor.js +362 -4
  18. package/dist/call-graph/extractors/csharp-extractor.js.map +1 -1
  19. package/dist/call-graph/extractors/csharp-hybrid-extractor.d.ts +37 -0
  20. package/dist/call-graph/extractors/csharp-hybrid-extractor.d.ts.map +1 -0
  21. package/dist/call-graph/extractors/csharp-hybrid-extractor.js +408 -0
  22. package/dist/call-graph/extractors/csharp-hybrid-extractor.js.map +1 -0
  23. package/dist/call-graph/extractors/data-access-extractor.d.ts +16 -2
  24. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -1
  25. package/dist/call-graph/extractors/data-access-extractor.js +114 -5
  26. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -1
  27. package/dist/call-graph/extractors/hybrid-extractor-base.d.ts +102 -0
  28. package/dist/call-graph/extractors/hybrid-extractor-base.d.ts.map +1 -0
  29. package/dist/call-graph/extractors/hybrid-extractor-base.js +289 -0
  30. package/dist/call-graph/extractors/hybrid-extractor-base.js.map +1 -0
  31. package/dist/call-graph/extractors/index.d.ts +17 -13
  32. package/dist/call-graph/extractors/index.d.ts.map +1 -1
  33. package/dist/call-graph/extractors/index.js +24 -23
  34. package/dist/call-graph/extractors/index.js.map +1 -1
  35. package/dist/call-graph/extractors/java-data-access-extractor.d.ts +8 -0
  36. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -1
  37. package/dist/call-graph/extractors/java-data-access-extractor.js +20 -6
  38. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -1
  39. package/dist/call-graph/extractors/java-extractor.d.ts +15 -0
  40. package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -1
  41. package/dist/call-graph/extractors/java-extractor.js +120 -4
  42. package/dist/call-graph/extractors/java-extractor.js.map +1 -1
  43. package/dist/call-graph/extractors/java-hybrid-extractor.d.ts +36 -0
  44. package/dist/call-graph/extractors/java-hybrid-extractor.d.ts.map +1 -0
  45. package/dist/call-graph/extractors/java-hybrid-extractor.js +426 -0
  46. package/dist/call-graph/extractors/java-hybrid-extractor.js.map +1 -0
  47. package/dist/call-graph/extractors/php-data-access-extractor.d.ts +8 -0
  48. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -1
  49. package/dist/call-graph/extractors/php-data-access-extractor.js +20 -6
  50. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -1
  51. package/dist/call-graph/extractors/php-extractor.d.ts +48 -1
  52. package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -1
  53. package/dist/call-graph/extractors/php-extractor.js +460 -6
  54. package/dist/call-graph/extractors/php-extractor.js.map +1 -1
  55. package/dist/call-graph/extractors/php-hybrid-extractor.d.ts +35 -0
  56. package/dist/call-graph/extractors/php-hybrid-extractor.d.ts.map +1 -0
  57. package/dist/call-graph/extractors/php-hybrid-extractor.js +393 -0
  58. package/dist/call-graph/extractors/php-hybrid-extractor.js.map +1 -0
  59. package/dist/call-graph/extractors/python-data-access-extractor.d.ts +8 -0
  60. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -1
  61. package/dist/call-graph/extractors/python-data-access-extractor.js +20 -6
  62. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -1
  63. package/dist/call-graph/extractors/python-hybrid-extractor.d.ts +85 -0
  64. package/dist/call-graph/extractors/python-hybrid-extractor.d.ts.map +1 -0
  65. package/dist/call-graph/extractors/python-hybrid-extractor.js +462 -0
  66. package/dist/call-graph/extractors/python-hybrid-extractor.js.map +1 -0
  67. package/dist/call-graph/extractors/regex/base-regex-extractor.d.ts +154 -0
  68. package/dist/call-graph/extractors/regex/base-regex-extractor.d.ts.map +1 -0
  69. package/dist/call-graph/extractors/regex/base-regex-extractor.js +346 -0
  70. package/dist/call-graph/extractors/regex/base-regex-extractor.js.map +1 -0
  71. package/dist/call-graph/extractors/regex/csharp-regex.d.ts +34 -0
  72. package/dist/call-graph/extractors/regex/csharp-regex.d.ts.map +1 -0
  73. package/dist/call-graph/extractors/regex/csharp-regex.js +393 -0
  74. package/dist/call-graph/extractors/regex/csharp-regex.js.map +1 -0
  75. package/dist/call-graph/extractors/regex/index.d.ts +25 -0
  76. package/dist/call-graph/extractors/regex/index.d.ts.map +1 -0
  77. package/dist/call-graph/extractors/regex/index.js +66 -0
  78. package/dist/call-graph/extractors/regex/index.js.map +1 -0
  79. package/dist/call-graph/extractors/regex/java-regex.d.ts +34 -0
  80. package/dist/call-graph/extractors/regex/java-regex.d.ts.map +1 -0
  81. package/dist/call-graph/extractors/regex/java-regex.js +327 -0
  82. package/dist/call-graph/extractors/regex/java-regex.js.map +1 -0
  83. package/dist/call-graph/extractors/regex/php-regex.d.ts +30 -0
  84. package/dist/call-graph/extractors/regex/php-regex.d.ts.map +1 -0
  85. package/dist/call-graph/extractors/regex/php-regex.js +333 -0
  86. package/dist/call-graph/extractors/regex/php-regex.js.map +1 -0
  87. package/dist/call-graph/extractors/regex/python-regex.d.ts +46 -0
  88. package/dist/call-graph/extractors/regex/python-regex.d.ts.map +1 -0
  89. package/dist/call-graph/extractors/regex/python-regex.js +380 -0
  90. package/dist/call-graph/extractors/regex/python-regex.js.map +1 -0
  91. package/dist/call-graph/extractors/regex/typescript-regex.d.ts +27 -0
  92. package/dist/call-graph/extractors/regex/typescript-regex.d.ts.map +1 -0
  93. package/dist/call-graph/extractors/regex/typescript-regex.js +349 -0
  94. package/dist/call-graph/extractors/regex/typescript-regex.js.map +1 -0
  95. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +11 -0
  96. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -1
  97. package/dist/call-graph/extractors/semantic-data-access-scanner.js +53 -2
  98. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -1
  99. package/dist/call-graph/extractors/types.d.ts +111 -0
  100. package/dist/call-graph/extractors/types.d.ts.map +1 -0
  101. package/dist/call-graph/extractors/types.js +68 -0
  102. package/dist/call-graph/extractors/types.js.map +1 -0
  103. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +8 -0
  104. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -1
  105. package/dist/call-graph/extractors/typescript-data-access-extractor.js +31 -10
  106. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -1
  107. package/dist/call-graph/extractors/typescript-hybrid-extractor.d.ts +116 -0
  108. package/dist/call-graph/extractors/typescript-hybrid-extractor.d.ts.map +1 -0
  109. package/dist/call-graph/extractors/typescript-hybrid-extractor.js +635 -0
  110. package/dist/call-graph/extractors/typescript-hybrid-extractor.js.map +1 -0
  111. package/dist/call-graph/index.d.ts +2 -4
  112. package/dist/call-graph/index.d.ts.map +1 -1
  113. package/dist/call-graph/index.js +5 -6
  114. package/dist/call-graph/index.js.map +1 -1
  115. package/dist/error-handling/error-handling-analyzer.d.ts +73 -0
  116. package/dist/error-handling/error-handling-analyzer.d.ts.map +1 -0
  117. package/dist/error-handling/error-handling-analyzer.js +706 -0
  118. package/dist/error-handling/error-handling-analyzer.js.map +1 -0
  119. package/dist/error-handling/index.d.ts +8 -0
  120. package/dist/error-handling/index.d.ts.map +1 -0
  121. package/dist/error-handling/index.js +8 -0
  122. package/dist/error-handling/index.js.map +1 -0
  123. package/dist/error-handling/types.d.ts +307 -0
  124. package/dist/error-handling/types.d.ts.map +1 -0
  125. package/dist/error-handling/types.js +7 -0
  126. package/dist/error-handling/types.js.map +1 -0
  127. package/dist/index.d.ts +18 -2
  128. package/dist/index.d.ts.map +1 -1
  129. package/dist/index.js +44 -5
  130. package/dist/index.js.map +1 -1
  131. package/dist/lake/pattern-shard-store.d.ts +6 -0
  132. package/dist/lake/pattern-shard-store.d.ts.map +1 -1
  133. package/dist/lake/pattern-shard-store.js +6 -0
  134. package/dist/lake/pattern-shard-store.js.map +1 -1
  135. package/dist/language-intelligence/base-normalizer.d.ts +68 -0
  136. package/dist/language-intelligence/base-normalizer.d.ts.map +1 -0
  137. package/dist/language-intelligence/base-normalizer.js +210 -0
  138. package/dist/language-intelligence/base-normalizer.js.map +1 -0
  139. package/dist/language-intelligence/framework-registry.d.ts +89 -0
  140. package/dist/language-intelligence/framework-registry.d.ts.map +1 -0
  141. package/dist/language-intelligence/framework-registry.js +165 -0
  142. package/dist/language-intelligence/framework-registry.js.map +1 -0
  143. package/dist/language-intelligence/frameworks/aspnet.d.ts +11 -0
  144. package/dist/language-intelligence/frameworks/aspnet.d.ts.map +1 -0
  145. package/dist/language-intelligence/frameworks/aspnet.js +325 -0
  146. package/dist/language-intelligence/frameworks/aspnet.js.map +1 -0
  147. package/dist/language-intelligence/frameworks/fastapi.d.ts +11 -0
  148. package/dist/language-intelligence/frameworks/fastapi.d.ts.map +1 -0
  149. package/dist/language-intelligence/frameworks/fastapi.js +188 -0
  150. package/dist/language-intelligence/frameworks/fastapi.js.map +1 -0
  151. package/dist/language-intelligence/frameworks/index.d.ts +32 -0
  152. package/dist/language-intelligence/frameworks/index.d.ts.map +1 -0
  153. package/dist/language-intelligence/frameworks/index.js +51 -0
  154. package/dist/language-intelligence/frameworks/index.js.map +1 -0
  155. package/dist/language-intelligence/frameworks/laravel.d.ts +12 -0
  156. package/dist/language-intelligence/frameworks/laravel.d.ts.map +1 -0
  157. package/dist/language-intelligence/frameworks/laravel.js +194 -0
  158. package/dist/language-intelligence/frameworks/laravel.js.map +1 -0
  159. package/dist/language-intelligence/frameworks/nestjs.d.ts +11 -0
  160. package/dist/language-intelligence/frameworks/nestjs.d.ts.map +1 -0
  161. package/dist/language-intelligence/frameworks/nestjs.js +307 -0
  162. package/dist/language-intelligence/frameworks/nestjs.js.map +1 -0
  163. package/dist/language-intelligence/frameworks/spring.d.ts +11 -0
  164. package/dist/language-intelligence/frameworks/spring.d.ts.map +1 -0
  165. package/dist/language-intelligence/frameworks/spring.js +369 -0
  166. package/dist/language-intelligence/frameworks/spring.js.map +1 -0
  167. package/dist/language-intelligence/index.d.ts +33 -0
  168. package/dist/language-intelligence/index.d.ts.map +1 -0
  169. package/dist/language-intelligence/index.js +37 -0
  170. package/dist/language-intelligence/index.js.map +1 -0
  171. package/dist/language-intelligence/language-intelligence.d.ts +99 -0
  172. package/dist/language-intelligence/language-intelligence.d.ts.map +1 -0
  173. package/dist/language-intelligence/language-intelligence.js +239 -0
  174. package/dist/language-intelligence/language-intelligence.js.map +1 -0
  175. package/dist/language-intelligence/normalizers/csharp-normalizer.d.ts +39 -0
  176. package/dist/language-intelligence/normalizers/csharp-normalizer.d.ts.map +1 -0
  177. package/dist/language-intelligence/normalizers/csharp-normalizer.js +86 -0
  178. package/dist/language-intelligence/normalizers/csharp-normalizer.js.map +1 -0
  179. package/dist/language-intelligence/normalizers/index.d.ts +25 -0
  180. package/dist/language-intelligence/normalizers/index.d.ts.map +1 -0
  181. package/dist/language-intelligence/normalizers/index.js +60 -0
  182. package/dist/language-intelligence/normalizers/index.js.map +1 -0
  183. package/dist/language-intelligence/normalizers/java-normalizer.d.ts +39 -0
  184. package/dist/language-intelligence/normalizers/java-normalizer.d.ts.map +1 -0
  185. package/dist/language-intelligence/normalizers/java-normalizer.js +96 -0
  186. package/dist/language-intelligence/normalizers/java-normalizer.js.map +1 -0
  187. package/dist/language-intelligence/normalizers/php-normalizer.d.ts +39 -0
  188. package/dist/language-intelligence/normalizers/php-normalizer.d.ts.map +1 -0
  189. package/dist/language-intelligence/normalizers/php-normalizer.js +86 -0
  190. package/dist/language-intelligence/normalizers/php-normalizer.js.map +1 -0
  191. package/dist/language-intelligence/normalizers/python-normalizer.d.ts +39 -0
  192. package/dist/language-intelligence/normalizers/python-normalizer.d.ts.map +1 -0
  193. package/dist/language-intelligence/normalizers/python-normalizer.js +95 -0
  194. package/dist/language-intelligence/normalizers/python-normalizer.js.map +1 -0
  195. package/dist/language-intelligence/normalizers/typescript-normalizer.d.ts +39 -0
  196. package/dist/language-intelligence/normalizers/typescript-normalizer.d.ts.map +1 -0
  197. package/dist/language-intelligence/normalizers/typescript-normalizer.js +84 -0
  198. package/dist/language-intelligence/normalizers/typescript-normalizer.js.map +1 -0
  199. package/dist/language-intelligence/types.d.ts +270 -0
  200. package/dist/language-intelligence/types.d.ts.map +1 -0
  201. package/dist/language-intelligence/types.js +9 -0
  202. package/dist/language-intelligence/types.js.map +1 -0
  203. package/dist/module-coupling/coupling-analyzer.d.ts +73 -0
  204. package/dist/module-coupling/coupling-analyzer.d.ts.map +1 -0
  205. package/dist/module-coupling/coupling-analyzer.js +668 -0
  206. package/dist/module-coupling/coupling-analyzer.js.map +1 -0
  207. package/dist/module-coupling/index.d.ts +9 -0
  208. package/dist/module-coupling/index.d.ts.map +1 -0
  209. package/dist/module-coupling/index.js +9 -0
  210. package/dist/module-coupling/index.js.map +1 -0
  211. package/dist/module-coupling/types.d.ts +273 -0
  212. package/dist/module-coupling/types.d.ts.map +1 -0
  213. package/dist/module-coupling/types.js +8 -0
  214. package/dist/module-coupling/types.js.map +1 -0
  215. package/dist/patterns/adapters/index.d.ts +11 -0
  216. package/dist/patterns/adapters/index.d.ts.map +1 -0
  217. package/dist/patterns/adapters/index.js +11 -0
  218. package/dist/patterns/adapters/index.js.map +1 -0
  219. package/dist/patterns/adapters/pattern-store-adapter.d.ts +59 -0
  220. package/dist/patterns/adapters/pattern-store-adapter.d.ts.map +1 -0
  221. package/dist/patterns/adapters/pattern-store-adapter.js +468 -0
  222. package/dist/patterns/adapters/pattern-store-adapter.js.map +1 -0
  223. package/dist/patterns/adapters/service-factory.d.ts +40 -0
  224. package/dist/patterns/adapters/service-factory.d.ts.map +1 -0
  225. package/dist/patterns/adapters/service-factory.js +144 -0
  226. package/dist/patterns/adapters/service-factory.js.map +1 -0
  227. package/dist/patterns/errors.d.ts +32 -0
  228. package/dist/patterns/errors.d.ts.map +1 -0
  229. package/dist/patterns/errors.js +45 -0
  230. package/dist/patterns/errors.js.map +1 -0
  231. package/dist/patterns/impl/cached-repository.d.ts +79 -0
  232. package/dist/patterns/impl/cached-repository.d.ts.map +1 -0
  233. package/dist/patterns/impl/cached-repository.js +296 -0
  234. package/dist/patterns/impl/cached-repository.js.map +1 -0
  235. package/dist/patterns/impl/file-repository.d.ts +75 -0
  236. package/dist/patterns/impl/file-repository.d.ts.map +1 -0
  237. package/dist/patterns/impl/file-repository.js +507 -0
  238. package/dist/patterns/impl/file-repository.js.map +1 -0
  239. package/dist/patterns/impl/index.d.ts +16 -0
  240. package/dist/patterns/impl/index.d.ts.map +1 -0
  241. package/dist/patterns/impl/index.js +21 -0
  242. package/dist/patterns/impl/index.js.map +1 -0
  243. package/dist/patterns/impl/memory-repository.d.ts +56 -0
  244. package/dist/patterns/impl/memory-repository.d.ts.map +1 -0
  245. package/dist/patterns/impl/memory-repository.js +323 -0
  246. package/dist/patterns/impl/memory-repository.js.map +1 -0
  247. package/dist/patterns/impl/pattern-service.d.ts +52 -0
  248. package/dist/patterns/impl/pattern-service.d.ts.map +1 -0
  249. package/dist/patterns/impl/pattern-service.js +382 -0
  250. package/dist/patterns/impl/pattern-service.js.map +1 -0
  251. package/dist/patterns/impl/repository-factory.d.ts +44 -0
  252. package/dist/patterns/impl/repository-factory.d.ts.map +1 -0
  253. package/dist/patterns/impl/repository-factory.js +140 -0
  254. package/dist/patterns/impl/repository-factory.js.map +1 -0
  255. package/dist/patterns/impl/unified-file-repository.d.ts +111 -0
  256. package/dist/patterns/impl/unified-file-repository.d.ts.map +1 -0
  257. package/dist/patterns/impl/unified-file-repository.js +677 -0
  258. package/dist/patterns/impl/unified-file-repository.js.map +1 -0
  259. package/dist/patterns/index.d.ts +23 -0
  260. package/dist/patterns/index.d.ts.map +1 -0
  261. package/dist/patterns/index.js +41 -0
  262. package/dist/patterns/index.js.map +1 -0
  263. package/dist/patterns/repository.d.ts +241 -0
  264. package/dist/patterns/repository.d.ts.map +1 -0
  265. package/dist/patterns/repository.js +23 -0
  266. package/dist/patterns/repository.js.map +1 -0
  267. package/dist/patterns/service.d.ts +245 -0
  268. package/dist/patterns/service.d.ts.map +1 -0
  269. package/dist/patterns/service.js +25 -0
  270. package/dist/patterns/service.js.map +1 -0
  271. package/dist/patterns/types.d.ts +227 -0
  272. package/dist/patterns/types.d.ts.map +1 -0
  273. package/dist/patterns/types.js +117 -0
  274. package/dist/patterns/types.js.map +1 -0
  275. package/dist/scanner/file-processor-worker.d.ts +66 -0
  276. package/dist/scanner/file-processor-worker.d.ts.map +1 -0
  277. package/dist/scanner/file-processor-worker.js +189 -0
  278. package/dist/scanner/file-processor-worker.js.map +1 -0
  279. package/dist/scanner/index.d.ts +2 -0
  280. package/dist/scanner/index.d.ts.map +1 -1
  281. package/dist/scanner/index.js +2 -0
  282. package/dist/scanner/index.js.map +1 -1
  283. package/dist/scanner/threaded-worker-pool.d.ts +182 -0
  284. package/dist/scanner/threaded-worker-pool.d.ts.map +1 -0
  285. package/dist/scanner/threaded-worker-pool.js +243 -0
  286. package/dist/scanner/threaded-worker-pool.js.map +1 -0
  287. package/dist/store/pattern-store.d.ts +6 -0
  288. package/dist/store/pattern-store.d.ts.map +1 -1
  289. package/dist/store/pattern-store.js +6 -0
  290. package/dist/store/pattern-store.js.map +1 -1
  291. package/dist/store/types.d.ts +6 -3
  292. package/dist/store/types.d.ts.map +1 -1
  293. package/dist/store/types.js.map +1 -1
  294. package/dist/test-topology/extractors/base-test-extractor.d.ts +89 -0
  295. package/dist/test-topology/extractors/base-test-extractor.d.ts.map +1 -0
  296. package/dist/test-topology/extractors/base-test-extractor.js +187 -0
  297. package/dist/test-topology/extractors/base-test-extractor.js.map +1 -0
  298. package/dist/test-topology/extractors/csharp-test-extractor.d.ts +23 -0
  299. package/dist/test-topology/extractors/csharp-test-extractor.d.ts.map +1 -0
  300. package/dist/test-topology/extractors/csharp-test-extractor.js +367 -0
  301. package/dist/test-topology/extractors/csharp-test-extractor.js.map +1 -0
  302. package/dist/test-topology/extractors/index.d.ts +12 -0
  303. package/dist/test-topology/extractors/index.d.ts.map +1 -0
  304. package/dist/test-topology/extractors/index.js +12 -0
  305. package/dist/test-topology/extractors/index.js.map +1 -0
  306. package/dist/test-topology/extractors/java-test-extractor.d.ts +20 -0
  307. package/dist/test-topology/extractors/java-test-extractor.d.ts.map +1 -0
  308. package/dist/test-topology/extractors/java-test-extractor.js +275 -0
  309. package/dist/test-topology/extractors/java-test-extractor.js.map +1 -0
  310. package/dist/test-topology/extractors/php-test-extractor.d.ts +24 -0
  311. package/dist/test-topology/extractors/php-test-extractor.d.ts.map +1 -0
  312. package/dist/test-topology/extractors/php-test-extractor.js +409 -0
  313. package/dist/test-topology/extractors/php-test-extractor.js.map +1 -0
  314. package/dist/test-topology/extractors/python-test-extractor.d.ts +23 -0
  315. package/dist/test-topology/extractors/python-test-extractor.d.ts.map +1 -0
  316. package/dist/test-topology/extractors/python-test-extractor.js +342 -0
  317. package/dist/test-topology/extractors/python-test-extractor.js.map +1 -0
  318. package/dist/test-topology/extractors/regex/csharp-test-regex.d.ts +51 -0
  319. package/dist/test-topology/extractors/regex/csharp-test-regex.d.ts.map +1 -0
  320. package/dist/test-topology/extractors/regex/csharp-test-regex.js +383 -0
  321. package/dist/test-topology/extractors/regex/csharp-test-regex.js.map +1 -0
  322. package/dist/test-topology/extractors/regex/index.d.ts +18 -0
  323. package/dist/test-topology/extractors/regex/index.d.ts.map +1 -0
  324. package/dist/test-topology/extractors/regex/index.js +43 -0
  325. package/dist/test-topology/extractors/regex/index.js.map +1 -0
  326. package/dist/test-topology/extractors/regex/java-test-regex.d.ts +50 -0
  327. package/dist/test-topology/extractors/regex/java-test-regex.d.ts.map +1 -0
  328. package/dist/test-topology/extractors/regex/java-test-regex.js +370 -0
  329. package/dist/test-topology/extractors/regex/java-test-regex.js.map +1 -0
  330. package/dist/test-topology/extractors/regex/php-test-regex.d.ts +56 -0
  331. package/dist/test-topology/extractors/regex/php-test-regex.d.ts.map +1 -0
  332. package/dist/test-topology/extractors/regex/php-test-regex.js +503 -0
  333. package/dist/test-topology/extractors/regex/php-test-regex.js.map +1 -0
  334. package/dist/test-topology/extractors/regex/python-test-regex.d.ts +57 -0
  335. package/dist/test-topology/extractors/regex/python-test-regex.d.ts.map +1 -0
  336. package/dist/test-topology/extractors/regex/python-test-regex.js +381 -0
  337. package/dist/test-topology/extractors/regex/python-test-regex.js.map +1 -0
  338. package/dist/test-topology/extractors/regex/typescript-test-regex.d.ts +60 -0
  339. package/dist/test-topology/extractors/regex/typescript-test-regex.d.ts.map +1 -0
  340. package/dist/test-topology/extractors/regex/typescript-test-regex.js +368 -0
  341. package/dist/test-topology/extractors/regex/typescript-test-regex.js.map +1 -0
  342. package/dist/test-topology/extractors/typescript-test-extractor.d.ts +24 -0
  343. package/dist/test-topology/extractors/typescript-test-extractor.d.ts.map +1 -0
  344. package/dist/test-topology/extractors/typescript-test-extractor.js +266 -0
  345. package/dist/test-topology/extractors/typescript-test-extractor.js.map +1 -0
  346. package/dist/test-topology/hybrid-test-topology-analyzer.d.ts +98 -0
  347. package/dist/test-topology/hybrid-test-topology-analyzer.d.ts.map +1 -0
  348. package/dist/test-topology/hybrid-test-topology-analyzer.js +555 -0
  349. package/dist/test-topology/hybrid-test-topology-analyzer.js.map +1 -0
  350. package/dist/test-topology/index.d.ts +16 -0
  351. package/dist/test-topology/index.d.ts.map +1 -0
  352. package/dist/test-topology/index.js +19 -0
  353. package/dist/test-topology/index.js.map +1 -0
  354. package/dist/test-topology/test-topology-analyzer.d.ts +85 -0
  355. package/dist/test-topology/test-topology-analyzer.d.ts.map +1 -0
  356. package/dist/test-topology/test-topology-analyzer.js +538 -0
  357. package/dist/test-topology/test-topology-analyzer.js.map +1 -0
  358. package/dist/test-topology/types.d.ts +300 -0
  359. package/dist/test-topology/types.d.ts.map +1 -0
  360. package/dist/test-topology/types.js +7 -0
  361. package/dist/test-topology/types.js.map +1 -0
  362. package/dist/unified-provider/compat/index.d.ts +11 -0
  363. package/dist/unified-provider/compat/index.d.ts.map +1 -0
  364. package/dist/unified-provider/compat/index.js +13 -0
  365. package/dist/unified-provider/compat/index.js.map +1 -0
  366. package/dist/unified-provider/compat/legacy-extractors.d.ts +63 -0
  367. package/dist/unified-provider/compat/legacy-extractors.d.ts.map +1 -0
  368. package/dist/unified-provider/compat/legacy-extractors.js +80 -0
  369. package/dist/unified-provider/compat/legacy-extractors.js.map +1 -0
  370. package/dist/unified-provider/compat/legacy-scanner.d.ts +28 -0
  371. package/dist/unified-provider/compat/legacy-scanner.d.ts.map +1 -0
  372. package/dist/unified-provider/compat/legacy-scanner.js +31 -0
  373. package/dist/unified-provider/compat/legacy-scanner.js.map +1 -0
  374. package/dist/unified-provider/index.d.ts +28 -0
  375. package/dist/unified-provider/index.d.ts.map +1 -0
  376. package/dist/unified-provider/index.js +47 -0
  377. package/dist/unified-provider/index.js.map +1 -0
  378. package/dist/unified-provider/integration/index.d.ts +9 -0
  379. package/dist/unified-provider/integration/index.d.ts.map +1 -0
  380. package/dist/unified-provider/integration/index.js +11 -0
  381. package/dist/unified-provider/integration/index.js.map +1 -0
  382. package/dist/unified-provider/integration/unified-data-access-adapter.d.ts +75 -0
  383. package/dist/unified-provider/integration/unified-data-access-adapter.d.ts.map +1 -0
  384. package/dist/unified-provider/integration/unified-data-access-adapter.js +210 -0
  385. package/dist/unified-provider/integration/unified-data-access-adapter.js.map +1 -0
  386. package/dist/unified-provider/integration/unified-scanner.d.ts +90 -0
  387. package/dist/unified-provider/integration/unified-scanner.d.ts.map +1 -0
  388. package/dist/unified-provider/integration/unified-scanner.js +369 -0
  389. package/dist/unified-provider/integration/unified-scanner.js.map +1 -0
  390. package/dist/unified-provider/matching/base-matcher.d.ts +80 -0
  391. package/dist/unified-provider/matching/base-matcher.d.ts.map +1 -0
  392. package/dist/unified-provider/matching/base-matcher.js +196 -0
  393. package/dist/unified-provider/matching/base-matcher.js.map +1 -0
  394. package/dist/unified-provider/matching/django-matcher.d.ts +32 -0
  395. package/dist/unified-provider/matching/django-matcher.d.ts.map +1 -0
  396. package/dist/unified-provider/matching/django-matcher.js +107 -0
  397. package/dist/unified-provider/matching/django-matcher.js.map +1 -0
  398. package/dist/unified-provider/matching/drizzle-matcher.d.ts +25 -0
  399. package/dist/unified-provider/matching/drizzle-matcher.d.ts.map +1 -0
  400. package/dist/unified-provider/matching/drizzle-matcher.js +123 -0
  401. package/dist/unified-provider/matching/drizzle-matcher.js.map +1 -0
  402. package/dist/unified-provider/matching/efcore-matcher.d.ts +27 -0
  403. package/dist/unified-provider/matching/efcore-matcher.d.ts.map +1 -0
  404. package/dist/unified-provider/matching/efcore-matcher.js +88 -0
  405. package/dist/unified-provider/matching/efcore-matcher.js.map +1 -0
  406. package/dist/unified-provider/matching/eloquent-matcher.d.ts +32 -0
  407. package/dist/unified-provider/matching/eloquent-matcher.d.ts.map +1 -0
  408. package/dist/unified-provider/matching/eloquent-matcher.js +162 -0
  409. package/dist/unified-provider/matching/eloquent-matcher.js.map +1 -0
  410. package/dist/unified-provider/matching/index.d.ts +19 -0
  411. package/dist/unified-provider/matching/index.d.ts.map +1 -0
  412. package/dist/unified-provider/matching/index.js +24 -0
  413. package/dist/unified-provider/matching/index.js.map +1 -0
  414. package/dist/unified-provider/matching/knex-matcher.d.ts +26 -0
  415. package/dist/unified-provider/matching/knex-matcher.d.ts.map +1 -0
  416. package/dist/unified-provider/matching/knex-matcher.js +109 -0
  417. package/dist/unified-provider/matching/knex-matcher.js.map +1 -0
  418. package/dist/unified-provider/matching/matcher-registry.d.ts +55 -0
  419. package/dist/unified-provider/matching/matcher-registry.d.ts.map +1 -0
  420. package/dist/unified-provider/matching/matcher-registry.js +130 -0
  421. package/dist/unified-provider/matching/matcher-registry.js.map +1 -0
  422. package/dist/unified-provider/matching/mongoose-matcher.d.ts +30 -0
  423. package/dist/unified-provider/matching/mongoose-matcher.d.ts.map +1 -0
  424. package/dist/unified-provider/matching/mongoose-matcher.js +132 -0
  425. package/dist/unified-provider/matching/mongoose-matcher.js.map +1 -0
  426. package/dist/unified-provider/matching/prisma-matcher.d.ts +31 -0
  427. package/dist/unified-provider/matching/prisma-matcher.d.ts.map +1 -0
  428. package/dist/unified-provider/matching/prisma-matcher.js +123 -0
  429. package/dist/unified-provider/matching/prisma-matcher.js.map +1 -0
  430. package/dist/unified-provider/matching/raw-sql-matcher.d.ts +31 -0
  431. package/dist/unified-provider/matching/raw-sql-matcher.d.ts.map +1 -0
  432. package/dist/unified-provider/matching/raw-sql-matcher.js +173 -0
  433. package/dist/unified-provider/matching/raw-sql-matcher.js.map +1 -0
  434. package/dist/unified-provider/matching/sequelize-matcher.d.ts +28 -0
  435. package/dist/unified-provider/matching/sequelize-matcher.d.ts.map +1 -0
  436. package/dist/unified-provider/matching/sequelize-matcher.js +132 -0
  437. package/dist/unified-provider/matching/sequelize-matcher.js.map +1 -0
  438. package/dist/unified-provider/matching/spring-data-matcher.d.ts +32 -0
  439. package/dist/unified-provider/matching/spring-data-matcher.d.ts.map +1 -0
  440. package/dist/unified-provider/matching/spring-data-matcher.js +112 -0
  441. package/dist/unified-provider/matching/spring-data-matcher.js.map +1 -0
  442. package/dist/unified-provider/matching/sqlalchemy-matcher.d.ts +32 -0
  443. package/dist/unified-provider/matching/sqlalchemy-matcher.d.ts.map +1 -0
  444. package/dist/unified-provider/matching/sqlalchemy-matcher.js +201 -0
  445. package/dist/unified-provider/matching/sqlalchemy-matcher.js.map +1 -0
  446. package/dist/unified-provider/matching/supabase-matcher.d.ts +27 -0
  447. package/dist/unified-provider/matching/supabase-matcher.d.ts.map +1 -0
  448. package/dist/unified-provider/matching/supabase-matcher.js +122 -0
  449. package/dist/unified-provider/matching/supabase-matcher.js.map +1 -0
  450. package/dist/unified-provider/matching/typeorm-matcher.d.ts +32 -0
  451. package/dist/unified-provider/matching/typeorm-matcher.d.ts.map +1 -0
  452. package/dist/unified-provider/matching/typeorm-matcher.js +169 -0
  453. package/dist/unified-provider/matching/typeorm-matcher.js.map +1 -0
  454. package/dist/unified-provider/migration/deprecated-extractors.d.ts +104 -0
  455. package/dist/unified-provider/migration/deprecated-extractors.d.ts.map +1 -0
  456. package/dist/unified-provider/migration/deprecated-extractors.js +129 -0
  457. package/dist/unified-provider/migration/deprecated-extractors.js.map +1 -0
  458. package/dist/unified-provider/migration/deprecated-scanner.d.ts +40 -0
  459. package/dist/unified-provider/migration/deprecated-scanner.d.ts.map +1 -0
  460. package/dist/unified-provider/migration/deprecated-scanner.js +49 -0
  461. package/dist/unified-provider/migration/deprecated-scanner.js.map +1 -0
  462. package/dist/unified-provider/migration/index.d.ts +41 -0
  463. package/dist/unified-provider/migration/index.d.ts.map +1 -0
  464. package/dist/unified-provider/migration/index.js +43 -0
  465. package/dist/unified-provider/migration/index.js.map +1 -0
  466. package/dist/unified-provider/normalization/base-normalizer.d.ts +188 -0
  467. package/dist/unified-provider/normalization/base-normalizer.d.ts.map +1 -0
  468. package/dist/unified-provider/normalization/base-normalizer.js +339 -0
  469. package/dist/unified-provider/normalization/base-normalizer.js.map +1 -0
  470. package/dist/unified-provider/normalization/csharp-normalizer.d.ts +58 -0
  471. package/dist/unified-provider/normalization/csharp-normalizer.d.ts.map +1 -0
  472. package/dist/unified-provider/normalization/csharp-normalizer.js +467 -0
  473. package/dist/unified-provider/normalization/csharp-normalizer.js.map +1 -0
  474. package/dist/unified-provider/normalization/index.d.ts +23 -0
  475. package/dist/unified-provider/normalization/index.d.ts.map +1 -0
  476. package/dist/unified-provider/normalization/index.js +62 -0
  477. package/dist/unified-provider/normalization/index.js.map +1 -0
  478. package/dist/unified-provider/normalization/java-normalizer.d.ts +54 -0
  479. package/dist/unified-provider/normalization/java-normalizer.d.ts.map +1 -0
  480. package/dist/unified-provider/normalization/java-normalizer.js +453 -0
  481. package/dist/unified-provider/normalization/java-normalizer.js.map +1 -0
  482. package/dist/unified-provider/normalization/php-normalizer.d.ts +54 -0
  483. package/dist/unified-provider/normalization/php-normalizer.d.ts.map +1 -0
  484. package/dist/unified-provider/normalization/php-normalizer.js +489 -0
  485. package/dist/unified-provider/normalization/php-normalizer.js.map +1 -0
  486. package/dist/unified-provider/normalization/python-normalizer.d.ts +61 -0
  487. package/dist/unified-provider/normalization/python-normalizer.d.ts.map +1 -0
  488. package/dist/unified-provider/normalization/python-normalizer.js +548 -0
  489. package/dist/unified-provider/normalization/python-normalizer.js.map +1 -0
  490. package/dist/unified-provider/normalization/typescript-normalizer.d.ts +60 -0
  491. package/dist/unified-provider/normalization/typescript-normalizer.d.ts.map +1 -0
  492. package/dist/unified-provider/normalization/typescript-normalizer.js +608 -0
  493. package/dist/unified-provider/normalization/typescript-normalizer.js.map +1 -0
  494. package/dist/unified-provider/parsing/index.d.ts +5 -0
  495. package/dist/unified-provider/parsing/index.d.ts.map +1 -0
  496. package/dist/unified-provider/parsing/index.js +5 -0
  497. package/dist/unified-provider/parsing/index.js.map +1 -0
  498. package/dist/unified-provider/parsing/parser-registry.d.ts +70 -0
  499. package/dist/unified-provider/parsing/parser-registry.d.ts.map +1 -0
  500. package/dist/unified-provider/parsing/parser-registry.js +260 -0
  501. package/dist/unified-provider/parsing/parser-registry.js.map +1 -0
  502. package/dist/unified-provider/provider/index.d.ts +5 -0
  503. package/dist/unified-provider/provider/index.d.ts.map +1 -0
  504. package/dist/unified-provider/provider/index.js +5 -0
  505. package/dist/unified-provider/provider/index.js.map +1 -0
  506. package/dist/unified-provider/provider/unified-language-provider.d.ts +56 -0
  507. package/dist/unified-provider/provider/unified-language-provider.d.ts.map +1 -0
  508. package/dist/unified-provider/provider/unified-language-provider.js +212 -0
  509. package/dist/unified-provider/provider/unified-language-provider.js.map +1 -0
  510. package/dist/unified-provider/types.d.ts +389 -0
  511. package/dist/unified-provider/types.d.ts.map +1 -0
  512. package/dist/unified-provider/types.js +9 -0
  513. package/dist/unified-provider/types.js.map +1 -0
  514. package/dist/wrappers/clustering/clusterer.d.ts +43 -0
  515. package/dist/wrappers/clustering/clusterer.d.ts.map +1 -0
  516. package/dist/wrappers/clustering/clusterer.js +374 -0
  517. package/dist/wrappers/clustering/clusterer.js.map +1 -0
  518. package/dist/wrappers/clustering/exclusions.d.ts +47 -0
  519. package/dist/wrappers/clustering/exclusions.d.ts.map +1 -0
  520. package/dist/wrappers/clustering/exclusions.js +318 -0
  521. package/dist/wrappers/clustering/exclusions.js.map +1 -0
  522. package/dist/wrappers/clustering/index.d.ts +6 -0
  523. package/dist/wrappers/clustering/index.d.ts.map +1 -0
  524. package/dist/wrappers/clustering/index.js +6 -0
  525. package/dist/wrappers/clustering/index.js.map +1 -0
  526. package/dist/wrappers/detection/detector.d.ts +69 -0
  527. package/dist/wrappers/detection/detector.d.ts.map +1 -0
  528. package/dist/wrappers/detection/detector.js +279 -0
  529. package/dist/wrappers/detection/detector.js.map +1 -0
  530. package/dist/wrappers/detection/index.d.ts +5 -0
  531. package/dist/wrappers/detection/index.d.ts.map +1 -0
  532. package/dist/wrappers/detection/index.js +5 -0
  533. package/dist/wrappers/detection/index.js.map +1 -0
  534. package/dist/wrappers/export/index.d.ts +5 -0
  535. package/dist/wrappers/export/index.d.ts.map +1 -0
  536. package/dist/wrappers/export/index.js +5 -0
  537. package/dist/wrappers/export/index.js.map +1 -0
  538. package/dist/wrappers/export/json.d.ts +127 -0
  539. package/dist/wrappers/export/json.d.ts.map +1 -0
  540. package/dist/wrappers/export/json.js +160 -0
  541. package/dist/wrappers/export/json.js.map +1 -0
  542. package/dist/wrappers/index.d.ts +56 -0
  543. package/dist/wrappers/index.d.ts.map +1 -0
  544. package/dist/wrappers/index.js +159 -0
  545. package/dist/wrappers/index.js.map +1 -0
  546. package/dist/wrappers/integration/adapter.d.ts +52 -0
  547. package/dist/wrappers/integration/adapter.d.ts.map +1 -0
  548. package/dist/wrappers/integration/adapter.js +209 -0
  549. package/dist/wrappers/integration/adapter.js.map +1 -0
  550. package/dist/wrappers/integration/index.d.ts +9 -0
  551. package/dist/wrappers/integration/index.d.ts.map +1 -0
  552. package/dist/wrappers/integration/index.js +12 -0
  553. package/dist/wrappers/integration/index.js.map +1 -0
  554. package/dist/wrappers/integration/pattern-adapter.d.ts +52 -0
  555. package/dist/wrappers/integration/pattern-adapter.d.ts.map +1 -0
  556. package/dist/wrappers/integration/pattern-adapter.js +192 -0
  557. package/dist/wrappers/integration/pattern-adapter.js.map +1 -0
  558. package/dist/wrappers/integration/scanner.d.ts +85 -0
  559. package/dist/wrappers/integration/scanner.d.ts.map +1 -0
  560. package/dist/wrappers/integration/scanner.js +367 -0
  561. package/dist/wrappers/integration/scanner.js.map +1 -0
  562. package/dist/wrappers/primitives/discovery.d.ts +57 -0
  563. package/dist/wrappers/primitives/discovery.d.ts.map +1 -0
  564. package/dist/wrappers/primitives/discovery.js +389 -0
  565. package/dist/wrappers/primitives/discovery.js.map +1 -0
  566. package/dist/wrappers/primitives/index.d.ts +6 -0
  567. package/dist/wrappers/primitives/index.d.ts.map +1 -0
  568. package/dist/wrappers/primitives/index.js +6 -0
  569. package/dist/wrappers/primitives/index.js.map +1 -0
  570. package/dist/wrappers/primitives/registry.d.ts +63 -0
  571. package/dist/wrappers/primitives/registry.d.ts.map +1 -0
  572. package/dist/wrappers/primitives/registry.js +447 -0
  573. package/dist/wrappers/primitives/registry.js.map +1 -0
  574. package/dist/wrappers/types.d.ts +137 -0
  575. package/dist/wrappers/types.d.ts.map +1 -0
  576. package/dist/wrappers/types.js +7 -0
  577. package/dist/wrappers/types.js.map +1 -0
  578. package/package.json +23 -18
@@ -0,0 +1,677 @@
1
+ /**
2
+ * Unified File Pattern Repository
3
+ *
4
+ * Phase 3 implementation that consolidates the two storage systems:
5
+ * - PatternStore (status-based directories)
6
+ * - PatternShardStore (category-based shards)
7
+ *
8
+ * New unified storage structure:
9
+ * .drift/patterns/
10
+ * ├── api.json # All API patterns (with status field)
11
+ * ├── auth.json # All auth patterns
12
+ * ├── security.json # All security patterns
13
+ * └── ...
14
+ *
15
+ * Benefits:
16
+ * - Single source of truth (no sync issues)
17
+ * - Category-based sharding (load only what you need)
18
+ * - Status tracked per-pattern (not per-directory)
19
+ * - Backward compatible migration from old format
20
+ *
21
+ * @module patterns/impl/unified-file-repository
22
+ */
23
+ import { EventEmitter } from 'node:events';
24
+ import * as fs from 'node:fs/promises';
25
+ import * as path from 'node:path';
26
+ import * as crypto from 'node:crypto';
27
+ import { PATTERN_CATEGORIES, VALID_STATUS_TRANSITIONS, computeConfidenceLevel, toPatternSummary, } from '../types.js';
28
+ import { PatternNotFoundError, InvalidStatusTransitionError, PatternAlreadyExistsError, } from '../errors.js';
29
+ import { DEFAULT_REPOSITORY_CONFIG } from '../repository.js';
30
+ // ============================================================================
31
+ // Constants
32
+ // ============================================================================
33
+ const DRIFT_DIR = '.drift';
34
+ const PATTERNS_DIR = 'patterns';
35
+ const UNIFIED_FILE_VERSION = '2.0.0';
36
+ // Legacy directories for migration
37
+ const LEGACY_STATUS_DIRS = {
38
+ discovered: 'discovered',
39
+ approved: 'approved',
40
+ ignored: 'ignored',
41
+ };
42
+ // ============================================================================
43
+ // Helper Functions
44
+ // ============================================================================
45
+ async function fileExists(filePath) {
46
+ try {
47
+ await fs.access(filePath);
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ async function ensureDir(dirPath) {
55
+ await fs.mkdir(dirPath, { recursive: true });
56
+ }
57
+ function generateChecksum(patterns) {
58
+ const content = JSON.stringify(patterns.map(p => p.id).sort());
59
+ return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
60
+ }
61
+ function patternToEntry(pattern) {
62
+ const entry = {
63
+ id: pattern.id,
64
+ subcategory: pattern.subcategory,
65
+ name: pattern.name,
66
+ description: pattern.description,
67
+ status: pattern.status,
68
+ detectorId: pattern.detectorId,
69
+ detectorName: pattern.detectorName,
70
+ detectionMethod: pattern.detectionMethod,
71
+ detector: pattern.detector,
72
+ confidence: pattern.confidence,
73
+ confidenceLevel: pattern.confidenceLevel,
74
+ locations: pattern.locations,
75
+ outliers: pattern.outliers,
76
+ severity: pattern.severity,
77
+ firstSeen: pattern.firstSeen,
78
+ lastSeen: pattern.lastSeen,
79
+ tags: pattern.tags,
80
+ autoFixable: pattern.autoFixable,
81
+ metadata: pattern.metadata,
82
+ };
83
+ // Only include optional fields if they have values
84
+ if (pattern.approvedAt !== undefined) {
85
+ entry.approvedAt = pattern.approvedAt;
86
+ }
87
+ if (pattern.approvedBy !== undefined) {
88
+ entry.approvedBy = pattern.approvedBy;
89
+ }
90
+ return entry;
91
+ }
92
+ function entryToPattern(entry, category) {
93
+ return {
94
+ ...entry,
95
+ category,
96
+ detectionMethod: entry.detectionMethod,
97
+ };
98
+ }
99
+ function computeStatusCounts(patterns) {
100
+ const counts = {
101
+ discovered: 0,
102
+ approved: 0,
103
+ ignored: 0,
104
+ };
105
+ for (const p of patterns) {
106
+ counts[p.status]++;
107
+ }
108
+ return counts;
109
+ }
110
+ const DEFAULT_UNIFIED_CONFIG = {
111
+ ...DEFAULT_REPOSITORY_CONFIG,
112
+ autoMigrate: true,
113
+ keepLegacyFiles: true,
114
+ };
115
+ /**
116
+ * Unified file-based pattern repository.
117
+ *
118
+ * Stores patterns in .drift/patterns/{category}.json files.
119
+ * Each file contains all patterns for that category with their status.
120
+ */
121
+ export class UnifiedFilePatternRepository extends EventEmitter {
122
+ config;
123
+ patternsDir;
124
+ patterns = new Map();
125
+ initialized = false;
126
+ dirty = false;
127
+ dirtyCategories = new Set();
128
+ saveTimeout = null;
129
+ constructor(config = {}) {
130
+ super();
131
+ this.config = { ...DEFAULT_UNIFIED_CONFIG, ...config };
132
+ this.patternsDir = path.join(this.config.rootDir, DRIFT_DIR, PATTERNS_DIR);
133
+ }
134
+ // ==========================================================================
135
+ // Lifecycle
136
+ // ==========================================================================
137
+ async initialize() {
138
+ if (this.initialized)
139
+ return;
140
+ await ensureDir(this.patternsDir);
141
+ // Check if we need to migrate from legacy format
142
+ if (this.config.autoMigrate && (await this.hasLegacyFormat())) {
143
+ await this.migrateFromLegacy();
144
+ }
145
+ // Load all patterns
146
+ await this.loadAll();
147
+ this.initialized = true;
148
+ this.emit('patterns:loaded', undefined, { count: this.patterns.size });
149
+ }
150
+ async close() {
151
+ if (this.saveTimeout) {
152
+ clearTimeout(this.saveTimeout);
153
+ this.saveTimeout = null;
154
+ }
155
+ if (this.dirty) {
156
+ await this.saveAll();
157
+ }
158
+ this.patterns.clear();
159
+ this.initialized = false;
160
+ }
161
+ // ==========================================================================
162
+ // Migration from Legacy Format
163
+ // ==========================================================================
164
+ /**
165
+ * Check if legacy format exists (status-based directories)
166
+ */
167
+ async hasLegacyFormat() {
168
+ for (const status of Object.values(LEGACY_STATUS_DIRS)) {
169
+ const statusDir = path.join(this.patternsDir, status);
170
+ if (await fileExists(statusDir)) {
171
+ return true;
172
+ }
173
+ }
174
+ return false;
175
+ }
176
+ /**
177
+ * Check if unified format exists (public for migration tools)
178
+ */
179
+ async hasUnifiedFormat() {
180
+ for (const category of PATTERN_CATEGORIES) {
181
+ const filePath = path.join(this.patternsDir, `${category}.json`);
182
+ if (await fileExists(filePath)) {
183
+ try {
184
+ const content = await fs.readFile(filePath, 'utf-8');
185
+ const data = JSON.parse(content);
186
+ if (data.version?.startsWith('2.')) {
187
+ return true;
188
+ }
189
+ }
190
+ catch {
191
+ // Not valid unified format
192
+ }
193
+ }
194
+ }
195
+ return false;
196
+ }
197
+ /**
198
+ * Migrate from legacy status-based format to unified category-based format
199
+ */
200
+ async migrateFromLegacy() {
201
+ console.log('[UnifiedFilePatternRepository] Migrating from legacy format...');
202
+ const migratedPatterns = [];
203
+ const migratedCategories = new Set();
204
+ // Load patterns from all legacy status directories
205
+ for (const status of Object.keys(LEGACY_STATUS_DIRS)) {
206
+ const statusDir = path.join(this.patternsDir, LEGACY_STATUS_DIRS[status]);
207
+ if (!(await fileExists(statusDir)))
208
+ continue;
209
+ for (const category of PATTERN_CATEGORIES) {
210
+ const filePath = path.join(statusDir, `${category}.json`);
211
+ if (!(await fileExists(filePath)))
212
+ continue;
213
+ try {
214
+ const content = await fs.readFile(filePath, 'utf-8');
215
+ const data = JSON.parse(content);
216
+ // Handle legacy format (patterns without status field)
217
+ for (const stored of data.patterns || []) {
218
+ const pattern = {
219
+ ...stored,
220
+ category,
221
+ status,
222
+ detectionMethod: stored.detectionMethod || 'ast',
223
+ confidenceLevel: stored.confidenceLevel || computeConfidenceLevel(stored.confidence || 0.5),
224
+ };
225
+ migratedPatterns.push(pattern);
226
+ migratedCategories.add(category);
227
+ }
228
+ }
229
+ catch (error) {
230
+ console.warn(`[UnifiedFilePatternRepository] Failed to read legacy file ${filePath}:`, error);
231
+ }
232
+ }
233
+ }
234
+ // Store migrated patterns in memory
235
+ for (const pattern of migratedPatterns) {
236
+ this.patterns.set(pattern.id, pattern);
237
+ }
238
+ // Save in new unified format
239
+ if (migratedPatterns.length > 0) {
240
+ this.dirty = true;
241
+ for (const category of migratedCategories) {
242
+ this.dirtyCategories.add(category);
243
+ }
244
+ await this.saveAll();
245
+ }
246
+ // Optionally remove legacy directories
247
+ if (!this.config.keepLegacyFiles) {
248
+ await this.removeLegacyFiles();
249
+ }
250
+ console.log(`[UnifiedFilePatternRepository] Migrated ${migratedPatterns.length} patterns from ${migratedCategories.size} categories`);
251
+ return {
252
+ migrated: migratedPatterns.length,
253
+ categories: Array.from(migratedCategories),
254
+ };
255
+ }
256
+ /**
257
+ * Remove legacy status-based directories
258
+ */
259
+ async removeLegacyFiles() {
260
+ for (const status of Object.values(LEGACY_STATUS_DIRS)) {
261
+ const statusDir = path.join(this.patternsDir, status);
262
+ if (await fileExists(statusDir)) {
263
+ await fs.rm(statusDir, { recursive: true, force: true });
264
+ }
265
+ }
266
+ }
267
+ // ==========================================================================
268
+ // Loading
269
+ // ==========================================================================
270
+ async loadAll() {
271
+ this.patterns.clear();
272
+ for (const category of PATTERN_CATEGORIES) {
273
+ await this.loadCategory(category);
274
+ }
275
+ }
276
+ async loadCategory(category) {
277
+ const filePath = path.join(this.patternsDir, `${category}.json`);
278
+ if (!(await fileExists(filePath))) {
279
+ return;
280
+ }
281
+ try {
282
+ const content = await fs.readFile(filePath, 'utf-8');
283
+ const data = JSON.parse(content);
284
+ for (const entry of data.patterns) {
285
+ const pattern = entryToPattern(entry, category);
286
+ this.patterns.set(pattern.id, pattern);
287
+ }
288
+ }
289
+ catch (error) {
290
+ if (error.code !== 'ENOENT') {
291
+ throw error;
292
+ }
293
+ }
294
+ }
295
+ // ==========================================================================
296
+ // Saving
297
+ // ==========================================================================
298
+ async saveAll() {
299
+ const grouped = this.groupPatternsByCategory();
300
+ for (const [category, patterns] of grouped.entries()) {
301
+ await this.saveCategoryFile(category, patterns);
302
+ }
303
+ this.dirty = false;
304
+ this.dirtyCategories.clear();
305
+ this.emit('patterns:saved', undefined, { count: this.patterns.size });
306
+ }
307
+ /**
308
+ * Save only dirty categories (incremental save)
309
+ */
310
+ async saveIncremental() {
311
+ if (this.dirtyCategories.size === 0)
312
+ return;
313
+ const grouped = this.groupPatternsByCategory();
314
+ for (const category of this.dirtyCategories) {
315
+ const patterns = grouped.get(category) || [];
316
+ await this.saveCategoryFile(category, patterns);
317
+ }
318
+ this.dirty = false;
319
+ this.dirtyCategories.clear();
320
+ }
321
+ groupPatternsByCategory() {
322
+ const grouped = new Map();
323
+ for (const category of PATTERN_CATEGORIES) {
324
+ grouped.set(category, []);
325
+ }
326
+ for (const pattern of this.patterns.values()) {
327
+ grouped.get(pattern.category).push(pattern);
328
+ }
329
+ return grouped;
330
+ }
331
+ async saveCategoryFile(category, patterns) {
332
+ const filePath = path.join(this.patternsDir, `${category}.json`);
333
+ if (patterns.length === 0) {
334
+ // Remove empty files
335
+ if (await fileExists(filePath)) {
336
+ await fs.unlink(filePath);
337
+ }
338
+ return;
339
+ }
340
+ const entries = patterns.map(patternToEntry);
341
+ const patternFile = {
342
+ version: UNIFIED_FILE_VERSION,
343
+ category,
344
+ patterns: entries,
345
+ lastUpdated: new Date().toISOString(),
346
+ checksum: generateChecksum(entries),
347
+ patternCount: entries.length,
348
+ statusCounts: computeStatusCounts(entries),
349
+ };
350
+ await fs.writeFile(filePath, JSON.stringify(patternFile, null, 2), 'utf-8');
351
+ }
352
+ scheduleSave() {
353
+ if (!this.config.autoSave)
354
+ return;
355
+ if (this.saveTimeout) {
356
+ clearTimeout(this.saveTimeout);
357
+ }
358
+ this.saveTimeout = setTimeout(() => {
359
+ this.saveIncremental().catch(console.error);
360
+ }, this.config.autoSaveDelayMs);
361
+ }
362
+ // ==========================================================================
363
+ // CRUD Operations
364
+ // ==========================================================================
365
+ async add(pattern) {
366
+ this.ensureInitialized();
367
+ if (this.patterns.has(pattern.id)) {
368
+ throw new PatternAlreadyExistsError(pattern.id);
369
+ }
370
+ const patternWithLevel = {
371
+ ...pattern,
372
+ confidenceLevel: computeConfidenceLevel(pattern.confidence),
373
+ };
374
+ this.patterns.set(pattern.id, patternWithLevel);
375
+ this.markDirty(pattern.category);
376
+ this.emit('pattern:added', patternWithLevel);
377
+ }
378
+ async addMany(patterns) {
379
+ for (const pattern of patterns) {
380
+ await this.add(pattern);
381
+ }
382
+ }
383
+ async get(id) {
384
+ this.ensureInitialized();
385
+ return this.patterns.get(id) ?? null;
386
+ }
387
+ async update(id, updates) {
388
+ this.ensureInitialized();
389
+ const existing = this.patterns.get(id);
390
+ if (!existing) {
391
+ throw new PatternNotFoundError(id);
392
+ }
393
+ const updated = {
394
+ ...existing,
395
+ ...updates,
396
+ id: existing.id,
397
+ lastSeen: new Date().toISOString(),
398
+ };
399
+ if (updates.confidence !== undefined) {
400
+ updated.confidenceLevel = computeConfidenceLevel(updates.confidence);
401
+ }
402
+ this.patterns.set(id, updated);
403
+ this.markDirty(updated.category);
404
+ // If category changed, mark old category dirty too
405
+ if (updates.category && updates.category !== existing.category) {
406
+ this.markDirty(existing.category);
407
+ }
408
+ this.emit('pattern:updated', updated);
409
+ return updated;
410
+ }
411
+ async delete(id) {
412
+ this.ensureInitialized();
413
+ const pattern = this.patterns.get(id);
414
+ if (!pattern) {
415
+ return false;
416
+ }
417
+ this.patterns.delete(id);
418
+ this.markDirty(pattern.category);
419
+ this.emit('pattern:deleted', pattern);
420
+ return true;
421
+ }
422
+ markDirty(category) {
423
+ this.dirty = true;
424
+ this.dirtyCategories.add(category);
425
+ this.scheduleSave();
426
+ }
427
+ // ==========================================================================
428
+ // Querying
429
+ // ==========================================================================
430
+ async query(options) {
431
+ this.ensureInitialized();
432
+ let patterns = Array.from(this.patterns.values());
433
+ if (options.filter) {
434
+ patterns = this.applyFilter(patterns, options.filter);
435
+ }
436
+ const total = patterns.length;
437
+ if (options.sort) {
438
+ patterns = this.applySort(patterns, options.sort);
439
+ }
440
+ if (options.pagination) {
441
+ const { offset, limit } = options.pagination;
442
+ patterns = patterns.slice(offset, offset + limit);
443
+ }
444
+ return {
445
+ patterns,
446
+ total,
447
+ hasMore: options.pagination
448
+ ? options.pagination.offset + patterns.length < total
449
+ : false,
450
+ };
451
+ }
452
+ applyFilter(patterns, filter) {
453
+ return patterns.filter((p) => {
454
+ if (filter.ids && !filter.ids.includes(p.id))
455
+ return false;
456
+ if (filter.categories && !filter.categories.includes(p.category))
457
+ return false;
458
+ if (filter.statuses && !filter.statuses.includes(p.status))
459
+ return false;
460
+ if (filter.minConfidence !== undefined && p.confidence < filter.minConfidence)
461
+ return false;
462
+ if (filter.maxConfidence !== undefined && p.confidence > filter.maxConfidence)
463
+ return false;
464
+ if (filter.confidenceLevels && !filter.confidenceLevels.includes(p.confidenceLevel))
465
+ return false;
466
+ if (filter.severities && !filter.severities.includes(p.severity))
467
+ return false;
468
+ if (filter.files) {
469
+ const hasFile = p.locations.some((loc) => filter.files.includes(loc.file));
470
+ if (!hasFile)
471
+ return false;
472
+ }
473
+ if (filter.hasOutliers !== undefined) {
474
+ const hasOutliers = p.outliers.length > 0;
475
+ if (filter.hasOutliers !== hasOutliers)
476
+ return false;
477
+ }
478
+ if (filter.tags) {
479
+ const hasTags = filter.tags.some((tag) => p.tags.includes(tag));
480
+ if (!hasTags)
481
+ return false;
482
+ }
483
+ if (filter.search) {
484
+ const searchLower = filter.search.toLowerCase();
485
+ const matches = p.name.toLowerCase().includes(searchLower) ||
486
+ p.description.toLowerCase().includes(searchLower);
487
+ if (!matches)
488
+ return false;
489
+ }
490
+ if (filter.createdAfter) {
491
+ const firstSeen = new Date(p.firstSeen);
492
+ if (firstSeen < filter.createdAfter)
493
+ return false;
494
+ }
495
+ if (filter.createdBefore) {
496
+ const firstSeen = new Date(p.firstSeen);
497
+ if (firstSeen > filter.createdBefore)
498
+ return false;
499
+ }
500
+ return true;
501
+ });
502
+ }
503
+ applySort(patterns, sort) {
504
+ const sorted = [...patterns];
505
+ const direction = sort.direction === 'asc' ? 1 : -1;
506
+ sorted.sort((a, b) => {
507
+ let comparison = 0;
508
+ switch (sort.field) {
509
+ case 'name':
510
+ comparison = a.name.localeCompare(b.name);
511
+ break;
512
+ case 'confidence':
513
+ comparison = a.confidence - b.confidence;
514
+ break;
515
+ case 'severity':
516
+ const severityOrder = { error: 4, warning: 3, info: 2, hint: 1 };
517
+ comparison = severityOrder[a.severity] - severityOrder[b.severity];
518
+ break;
519
+ case 'firstSeen':
520
+ comparison = new Date(a.firstSeen).getTime() - new Date(b.firstSeen).getTime();
521
+ break;
522
+ case 'lastSeen':
523
+ comparison = new Date(a.lastSeen).getTime() - new Date(b.lastSeen).getTime();
524
+ break;
525
+ case 'locationCount':
526
+ comparison = a.locations.length - b.locations.length;
527
+ break;
528
+ }
529
+ return comparison * direction;
530
+ });
531
+ return sorted;
532
+ }
533
+ async getByCategory(category) {
534
+ const result = await this.query({ filter: { categories: [category] } });
535
+ return result.patterns;
536
+ }
537
+ async getByStatus(status) {
538
+ const result = await this.query({ filter: { statuses: [status] } });
539
+ return result.patterns;
540
+ }
541
+ async getByFile(file) {
542
+ const result = await this.query({ filter: { files: [file] } });
543
+ return result.patterns;
544
+ }
545
+ async getAll() {
546
+ this.ensureInitialized();
547
+ return Array.from(this.patterns.values());
548
+ }
549
+ async count(filter) {
550
+ if (!filter) {
551
+ return this.patterns.size;
552
+ }
553
+ const result = await this.query({ filter });
554
+ return result.total;
555
+ }
556
+ // ==========================================================================
557
+ // Status Transitions
558
+ // ==========================================================================
559
+ async approve(id, approvedBy) {
560
+ this.ensureInitialized();
561
+ const pattern = this.patterns.get(id);
562
+ if (!pattern) {
563
+ throw new PatternNotFoundError(id);
564
+ }
565
+ if (!VALID_STATUS_TRANSITIONS[pattern.status].includes('approved')) {
566
+ throw new InvalidStatusTransitionError(id, pattern.status, 'approved');
567
+ }
568
+ const now = new Date().toISOString();
569
+ const updated = await this.update(id, {
570
+ status: 'approved',
571
+ approvedAt: now,
572
+ approvedBy,
573
+ metadata: {
574
+ ...pattern.metadata,
575
+ approvedAt: now,
576
+ approvedBy,
577
+ },
578
+ });
579
+ this.emit('pattern:approved', updated);
580
+ return updated;
581
+ }
582
+ async ignore(id) {
583
+ this.ensureInitialized();
584
+ const pattern = this.patterns.get(id);
585
+ if (!pattern) {
586
+ throw new PatternNotFoundError(id);
587
+ }
588
+ if (!VALID_STATUS_TRANSITIONS[pattern.status].includes('ignored')) {
589
+ throw new InvalidStatusTransitionError(id, pattern.status, 'ignored');
590
+ }
591
+ const updated = await this.update(id, { status: 'ignored' });
592
+ this.emit('pattern:ignored', updated);
593
+ return updated;
594
+ }
595
+ // ==========================================================================
596
+ // Batch Operations
597
+ // ==========================================================================
598
+ async clear() {
599
+ this.ensureInitialized();
600
+ this.patterns.clear();
601
+ this.dirty = true;
602
+ for (const category of PATTERN_CATEGORIES) {
603
+ this.dirtyCategories.add(category);
604
+ }
605
+ await this.saveAll();
606
+ }
607
+ // ==========================================================================
608
+ // Events
609
+ // ==========================================================================
610
+ on(event, handler) {
611
+ return super.on(event, handler);
612
+ }
613
+ off(event, handler) {
614
+ return super.off(event, handler);
615
+ }
616
+ // ==========================================================================
617
+ // Utilities
618
+ // ==========================================================================
619
+ async exists(id) {
620
+ this.ensureInitialized();
621
+ return this.patterns.has(id);
622
+ }
623
+ async getSummaries(options) {
624
+ const result = await this.query(options ?? {});
625
+ return result.patterns.map(toPatternSummary);
626
+ }
627
+ /**
628
+ * Get storage statistics
629
+ */
630
+ async getStorageStats() {
631
+ this.ensureInitialized();
632
+ const byCategory = {};
633
+ const byStatus = {
634
+ discovered: 0,
635
+ approved: 0,
636
+ ignored: 0,
637
+ };
638
+ for (const category of PATTERN_CATEGORIES) {
639
+ byCategory[category] = 0;
640
+ }
641
+ for (const pattern of this.patterns.values()) {
642
+ const catCount = byCategory[pattern.category];
643
+ if (catCount !== undefined) {
644
+ byCategory[pattern.category] = catCount + 1;
645
+ }
646
+ const statusCount = byStatus[pattern.status];
647
+ if (statusCount !== undefined) {
648
+ byStatus[pattern.status] = statusCount + 1;
649
+ }
650
+ }
651
+ // Count non-empty category files
652
+ let fileCount = 0;
653
+ for (const category of PATTERN_CATEGORIES) {
654
+ const count = byCategory[category];
655
+ if (count !== undefined && count > 0)
656
+ fileCount++;
657
+ }
658
+ return {
659
+ totalPatterns: this.patterns.size,
660
+ byCategory: byCategory,
661
+ byStatus,
662
+ fileCount,
663
+ };
664
+ }
665
+ ensureInitialized() {
666
+ if (!this.initialized) {
667
+ throw new Error('Repository not initialized. Call initialize() first.');
668
+ }
669
+ }
670
+ }
671
+ // ============================================================================
672
+ // Factory Function
673
+ // ============================================================================
674
+ export function createUnifiedFilePatternRepository(config = {}) {
675
+ return new UnifiedFilePatternRepository(config);
676
+ }
677
+ //# sourceMappingURL=unified-file-repository.js.map