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,132 @@
1
+ /**
2
+ * Sequelize Pattern Matcher
3
+ *
4
+ * Matches Sequelize patterns:
5
+ * - User.findAll()
6
+ * - User.findOne({ where: { id: 1 } })
7
+ * - User.create({ name: 'John' })
8
+ * - User.update({ name: 'Jane' }, { where: { id: 1 } })
9
+ * - User.destroy({ where: { id: 1 } })
10
+ */
11
+ import { BaseMatcher } from './base-matcher.js';
12
+ /**
13
+ * Sequelize pattern matcher
14
+ */
15
+ export class SequelizeMatcher extends BaseMatcher {
16
+ id = 'sequelize';
17
+ name = 'Sequelize';
18
+ languages = ['typescript', 'javascript'];
19
+ priority = 88;
20
+ readMethods = [
21
+ 'findAll', 'findOne', 'findByPk', 'findOrCreate', 'findAndCountAll',
22
+ 'findCreateFind', 'count', 'max', 'min', 'sum', 'aggregate',
23
+ ];
24
+ writeMethods = [
25
+ 'create', 'bulkCreate', 'update', 'upsert', 'increment', 'decrement',
26
+ ];
27
+ deleteMethods = [
28
+ 'destroy', 'truncate',
29
+ ];
30
+ match(chain) {
31
+ // Model must be PascalCase
32
+ if (!/^[A-Z][a-zA-Z0-9]*$/.test(chain.receiver))
33
+ return null;
34
+ // Skip common JS classes
35
+ const commonClasses = [
36
+ 'Array', 'Object', 'String', 'Number', 'Boolean', 'Promise',
37
+ 'Map', 'Set', 'Date', 'Error', 'RegExp', 'JSON', 'Math',
38
+ ];
39
+ if (commonClasses.includes(chain.receiver))
40
+ return null;
41
+ if (chain.segments.length < 1)
42
+ return null;
43
+ const methodSegment = chain.segments[0];
44
+ if (!methodSegment?.isCall)
45
+ return null;
46
+ const operation = this.getOperation(methodSegment.name);
47
+ if (!operation)
48
+ return null;
49
+ const table = this.inferTableName(chain.receiver);
50
+ const fields = this.extractFields(methodSegment.args, methodSegment.name);
51
+ return this.createMatch({
52
+ table,
53
+ fields,
54
+ operation,
55
+ confidence: 0.85,
56
+ metadata: { modelName: chain.receiver },
57
+ });
58
+ }
59
+ getOperation(methodName) {
60
+ if (this.readMethods.includes(methodName))
61
+ return 'read';
62
+ if (this.writeMethods.includes(methodName))
63
+ return 'write';
64
+ if (this.deleteMethods.includes(methodName))
65
+ return 'delete';
66
+ return null;
67
+ }
68
+ extractFields(args, methodName) {
69
+ if (args.length === 0)
70
+ return [];
71
+ const fields = [];
72
+ // For update, first arg is data, second is options
73
+ if (methodName === 'update' && args.length >= 1) {
74
+ const dataArg = args[0];
75
+ if (dataArg?.type === 'object' && dataArg.properties) {
76
+ fields.push(...Object.keys(dataArg.properties));
77
+ }
78
+ // Options with where clause
79
+ if (args[1]?.type === 'object' && args[1].properties) {
80
+ const whereArg = args[1].properties['where'];
81
+ if (whereArg?.type === 'object' && whereArg.properties) {
82
+ fields.push(...Object.keys(whereArg.properties));
83
+ }
84
+ }
85
+ return [...new Set(fields)];
86
+ }
87
+ const firstArg = args[0];
88
+ if (!firstArg)
89
+ return [];
90
+ // For create, the arg is the data object
91
+ if (methodName === 'create' || methodName === 'bulkCreate') {
92
+ if (firstArg.type === 'object' && firstArg.properties) {
93
+ return Object.keys(firstArg.properties);
94
+ }
95
+ if (firstArg.type === 'array' && firstArg.elements?.[0]?.type === 'object') {
96
+ return Object.keys(firstArg.elements[0].properties ?? {});
97
+ }
98
+ return [];
99
+ }
100
+ // For find methods, extract from options object
101
+ if (firstArg.type !== 'object' || !firstArg.properties) {
102
+ return [];
103
+ }
104
+ // Extract from 'where' option
105
+ const whereArg = firstArg.properties['where'];
106
+ if (whereArg?.type === 'object' && whereArg.properties) {
107
+ fields.push(...Object.keys(whereArg.properties));
108
+ }
109
+ // Extract from 'attributes' option
110
+ const attrsArg = firstArg.properties['attributes'];
111
+ if (attrsArg?.type === 'array' && attrsArg.elements) {
112
+ for (const elem of attrsArg.elements) {
113
+ if (elem.stringValue)
114
+ fields.push(elem.stringValue);
115
+ }
116
+ }
117
+ // Extract from 'include' option (relations)
118
+ const includeArg = firstArg.properties['include'];
119
+ if (includeArg?.type === 'array' && includeArg.elements) {
120
+ for (const elem of includeArg.elements) {
121
+ if (elem.type === 'object' && elem.properties?.['model']) {
122
+ const modelArg = elem.properties['model'];
123
+ if (modelArg.type === 'identifier') {
124
+ fields.push(modelArg.value);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return [...new Set(fields)];
130
+ }
131
+ }
132
+ //# sourceMappingURL=sequelize-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequelize-matcher.js","sourceRoot":"","sources":["../../../src/unified-provider/matching/sequelize-matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Spring Data JPA Pattern Matcher
3
+ *
4
+ * Matches Spring Data JPA patterns:
5
+ * - userRepository.findAll()
6
+ * - userRepository.findById(id)
7
+ * - userRepository.save(user)
8
+ * - userRepository.delete(user)
9
+ * - userRepository.findByEmailAndActive(email, true)
10
+ */
11
+ import type { UnifiedCallChain, PatternMatchResult, UnifiedLanguage } from '../types.js';
12
+ import { BaseMatcher } from './base-matcher.js';
13
+ /**
14
+ * Spring Data JPA pattern matcher
15
+ */
16
+ export declare class SpringDataMatcher extends BaseMatcher {
17
+ readonly id = "spring-data";
18
+ readonly name = "Spring Data JPA";
19
+ readonly languages: UnifiedLanguage[];
20
+ readonly priority = 92;
21
+ private readonly readMethods;
22
+ private readonly writeMethods;
23
+ private readonly deleteMethods;
24
+ match(chain: UnifiedCallChain): PatternMatchResult | null;
25
+ private getOperation;
26
+ /**
27
+ * Extract field names from Spring Data query derivation method names
28
+ * e.g., findByEmailAndActiveTrue -> ['email', 'active']
29
+ */
30
+ private extractFieldsFromMethodName;
31
+ }
32
+ //# sourceMappingURL=spring-data-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring-data-matcher.d.ts","sourceRoot":"","sources":["../../../src/unified-provider/matching/spring-data-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,CAAY;IACjD,QAAQ,CAAC,QAAQ,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAS1B;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAG3B;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAI5B;IAEF,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,IAAI;IA+BzD,OAAO,CAAC,YAAY;IAiBpB;;;OAGG;IACH,OAAO,CAAC,2BAA2B;CA2BpC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Spring Data JPA Pattern Matcher
3
+ *
4
+ * Matches Spring Data JPA patterns:
5
+ * - userRepository.findAll()
6
+ * - userRepository.findById(id)
7
+ * - userRepository.save(user)
8
+ * - userRepository.delete(user)
9
+ * - userRepository.findByEmailAndActive(email, true)
10
+ */
11
+ import { BaseMatcher } from './base-matcher.js';
12
+ /**
13
+ * Spring Data JPA pattern matcher
14
+ */
15
+ export class SpringDataMatcher extends BaseMatcher {
16
+ id = 'spring-data';
17
+ name = 'Spring Data JPA';
18
+ languages = ['java'];
19
+ priority = 92;
20
+ readMethods = [
21
+ 'findAll', 'findById', 'findOne', 'findAllById',
22
+ 'existsById', 'exists', 'count', 'getOne', 'getById',
23
+ // Query derivation patterns
24
+ 'findBy', 'findAllBy', 'findFirstBy', 'findTopBy',
25
+ 'readBy', 'readAllBy', 'getBy', 'getAllBy',
26
+ 'queryBy', 'queryAllBy', 'searchBy', 'searchAllBy',
27
+ 'streamBy', 'streamAllBy',
28
+ 'countBy', 'existsBy',
29
+ ];
30
+ writeMethods = [
31
+ 'save', 'saveAll', 'saveAndFlush', 'saveAllAndFlush',
32
+ 'flush',
33
+ ];
34
+ deleteMethods = [
35
+ 'delete', 'deleteById', 'deleteAll', 'deleteAllById',
36
+ 'deleteInBatch', 'deleteAllInBatch', 'deleteAllByIdInBatch',
37
+ 'removeBy', 'deleteBy',
38
+ ];
39
+ match(chain) {
40
+ // Look for repository pattern
41
+ const receiver = chain.receiver.toLowerCase();
42
+ if (!receiver.includes('repository') && !receiver.includes('repo') && !receiver.includes('dao')) {
43
+ return null;
44
+ }
45
+ if (chain.segments.length < 1)
46
+ return null;
47
+ const methodSegment = chain.segments[0];
48
+ if (!methodSegment?.isCall)
49
+ return null;
50
+ const methodName = methodSegment.name;
51
+ const operation = this.getOperation(methodName);
52
+ if (!operation)
53
+ return null;
54
+ // Infer table from repository name
55
+ const table = this.inferTableName(chain.receiver);
56
+ // Extract fields from query derivation method names
57
+ const fields = this.extractFieldsFromMethodName(methodName);
58
+ return this.createMatch({
59
+ table,
60
+ fields,
61
+ operation,
62
+ confidence: 0.9,
63
+ metadata: { methodName },
64
+ });
65
+ }
66
+ getOperation(methodName) {
67
+ // Check exact matches first
68
+ if (this.readMethods.includes(methodName))
69
+ return 'read';
70
+ if (this.writeMethods.includes(methodName))
71
+ return 'write';
72
+ if (this.deleteMethods.includes(methodName))
73
+ return 'delete';
74
+ // Check prefix patterns for query derivation
75
+ for (const prefix of this.readMethods) {
76
+ if (methodName.startsWith(prefix))
77
+ return 'read';
78
+ }
79
+ for (const prefix of this.deleteMethods) {
80
+ if (methodName.startsWith(prefix))
81
+ return 'delete';
82
+ }
83
+ return null;
84
+ }
85
+ /**
86
+ * Extract field names from Spring Data query derivation method names
87
+ * e.g., findByEmailAndActiveTrue -> ['email', 'active']
88
+ */
89
+ extractFieldsFromMethodName(methodName) {
90
+ const fields = [];
91
+ // Remove common prefixes
92
+ let remaining = methodName
93
+ .replace(/^(find|read|get|query|search|stream|count|exists|delete|remove)(All|First|Top\d*)?By/, '')
94
+ .replace(/^(OrderBy.*)$/, ''); // Remove OrderBy suffix
95
+ if (!remaining)
96
+ return fields;
97
+ // Split by And/Or
98
+ const parts = remaining.split(/(?:And|Or)/);
99
+ for (const part of parts) {
100
+ // Remove comparison suffixes
101
+ const fieldPart = part
102
+ .replace(/(Is|Equals|Not|IsNot|NotNull|Null|True|False|Before|After|LessThan|LessThanEqual|GreaterThan|GreaterThanEqual|Between|Like|NotLike|StartingWith|EndingWith|Containing|In|NotIn|IgnoreCase|OrderBy.*)$/, '');
103
+ if (fieldPart) {
104
+ // Convert to camelCase field name
105
+ const fieldName = fieldPart.charAt(0).toLowerCase() + fieldPart.slice(1);
106
+ fields.push(fieldName);
107
+ }
108
+ }
109
+ return [...new Set(fields)];
110
+ }
111
+ }
112
+ //# sourceMappingURL=spring-data-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring-data-matcher.js","sourceRoot":"","sources":["../../../src/unified-provider/matching/spring-data-matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * SQLAlchemy Pattern Matcher
3
+ *
4
+ * Matches SQLAlchemy patterns:
5
+ * - session.query(User).filter(User.id == 1).all()
6
+ * - session.query(User).filter_by(id=1).first()
7
+ * - session.add(user)
8
+ * - session.delete(user)
9
+ * - select(User).where(User.id == 1)
10
+ * - insert(users).values(name='John')
11
+ * - update(users).where(users.c.id == 1).values(name='Jane')
12
+ * - delete(users).where(users.c.id == 1)
13
+ */
14
+ import type { UnifiedCallChain, PatternMatchResult, UnifiedLanguage } from '../types.js';
15
+ import { BaseMatcher } from './base-matcher.js';
16
+ /**
17
+ * SQLAlchemy pattern matcher
18
+ */
19
+ export declare class SQLAlchemyMatcher extends BaseMatcher {
20
+ readonly id = "sqlalchemy";
21
+ readonly name = "SQLAlchemy";
22
+ readonly languages: UnifiedLanguage[];
23
+ readonly priority = 93;
24
+ match(chain: UnifiedCallChain): PatternMatchResult | null;
25
+ private matchSessionPattern;
26
+ private handleQueryPattern;
27
+ private handleAddPattern;
28
+ private handleDeletePattern;
29
+ private matchCorePattern;
30
+ private extractKwargs;
31
+ }
32
+ //# sourceMappingURL=sqlalchemy-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlalchemy-matcher.d.ts","sourceRoot":"","sources":["../../../src/unified-provider/matching/sqlalchemy-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,QAAQ,CAAC,EAAE,gBAAgB;IAC3B,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,CAAc;IACnD,QAAQ,CAAC,QAAQ,MAAM;IAOvB,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,IAAI;IAYzD,OAAO,CAAC,mBAAmB;IA0B3B,OAAO,CAAC,kBAAkB;IAyC1B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,gBAAgB;IAyDxB,OAAO,CAAC,aAAa;CAatB"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * SQLAlchemy Pattern Matcher
3
+ *
4
+ * Matches SQLAlchemy patterns:
5
+ * - session.query(User).filter(User.id == 1).all()
6
+ * - session.query(User).filter_by(id=1).first()
7
+ * - session.add(user)
8
+ * - session.delete(user)
9
+ * - select(User).where(User.id == 1)
10
+ * - insert(users).values(name='John')
11
+ * - update(users).where(users.c.id == 1).values(name='Jane')
12
+ * - delete(users).where(users.c.id == 1)
13
+ */
14
+ import { BaseMatcher } from './base-matcher.js';
15
+ /**
16
+ * SQLAlchemy pattern matcher
17
+ */
18
+ export class SQLAlchemyMatcher extends BaseMatcher {
19
+ id = 'sqlalchemy';
20
+ name = 'SQLAlchemy';
21
+ languages = ['python'];
22
+ priority = 93;
23
+ // Method lists for reference - actual detection uses inline checks
24
+ // Read: query, get, filter, filter_by, all, first, one, one_or_none, scalar, count, exists, select, join, outerjoin
25
+ // Write: add, add_all, merge, flush, commit, insert, update
26
+ // Delete: delete
27
+ match(chain) {
28
+ // Pattern 1: session.query(Model)
29
+ const sessionMatch = this.matchSessionPattern(chain);
30
+ if (sessionMatch)
31
+ return sessionMatch;
32
+ // Pattern 2: select(Model) / insert(table) / update(table) / delete(table)
33
+ const coreMatch = this.matchCorePattern(chain);
34
+ if (coreMatch)
35
+ return coreMatch;
36
+ return null;
37
+ }
38
+ matchSessionPattern(chain) {
39
+ const receiver = chain.receiver.toLowerCase();
40
+ if (!receiver.includes('session') && !receiver.includes('db')) {
41
+ return null;
42
+ }
43
+ // Look for query() or add/delete
44
+ const queryIndex = chain.segments.findIndex(s => s.name === 'query');
45
+ const addIndex = chain.segments.findIndex(s => s.name === 'add' || s.name === 'add_all');
46
+ const deleteIndex = chain.segments.findIndex(s => s.name === 'delete');
47
+ if (queryIndex !== -1) {
48
+ return this.handleQueryPattern(chain, queryIndex);
49
+ }
50
+ if (addIndex !== -1) {
51
+ return this.handleAddPattern(chain, addIndex);
52
+ }
53
+ if (deleteIndex !== -1) {
54
+ return this.handleDeletePattern(chain, deleteIndex);
55
+ }
56
+ return null;
57
+ }
58
+ handleQueryPattern(chain, queryIndex) {
59
+ const querySegment = chain.segments[queryIndex];
60
+ if (!querySegment?.args[0])
61
+ return null;
62
+ // Get model name from query(Model)
63
+ const modelArg = querySegment.args[0];
64
+ const modelName = modelArg.type === 'identifier'
65
+ ? modelArg.value
66
+ : 'unknown';
67
+ // Determine operation from subsequent methods
68
+ let operation = 'read';
69
+ const fields = [];
70
+ for (let i = queryIndex + 1; i < chain.segments.length; i++) {
71
+ const segment = chain.segments[i];
72
+ if (!segment)
73
+ continue;
74
+ if (segment.name === 'delete') {
75
+ operation = 'delete';
76
+ }
77
+ else if (segment.name === 'update') {
78
+ operation = 'write';
79
+ }
80
+ else if (segment.name === 'filter_by') {
81
+ // Extract fields from filter_by kwargs
82
+ this.extractKwargs(segment.args, fields);
83
+ }
84
+ else if (segment.name === 'filter') {
85
+ // filter() uses expressions, harder to extract
86
+ }
87
+ }
88
+ const table = this.inferTableName(modelName);
89
+ return this.createMatch({
90
+ table,
91
+ fields: [...new Set(fields)],
92
+ operation,
93
+ confidence: 0.9,
94
+ metadata: { pattern: 'session.query', modelName },
95
+ });
96
+ }
97
+ handleAddPattern(chain, addIndex) {
98
+ const addSegment = chain.segments[addIndex];
99
+ if (!addSegment?.args[0])
100
+ return null;
101
+ // Try to infer model from the argument
102
+ const arg = addSegment.args[0];
103
+ let modelName = 'unknown';
104
+ if (arg.type === 'identifier') {
105
+ // Might be a variable name like 'user'
106
+ modelName = arg.value;
107
+ }
108
+ const table = this.inferTableName(modelName);
109
+ return this.createMatch({
110
+ table,
111
+ fields: [],
112
+ operation: 'write',
113
+ confidence: 0.8,
114
+ metadata: { pattern: 'session.add' },
115
+ });
116
+ }
117
+ handleDeletePattern(chain, deleteIndex) {
118
+ const deleteSegment = chain.segments[deleteIndex];
119
+ if (!deleteSegment?.args[0])
120
+ return null;
121
+ const arg = deleteSegment.args[0];
122
+ let modelName = 'unknown';
123
+ if (arg.type === 'identifier') {
124
+ modelName = arg.value;
125
+ }
126
+ const table = this.inferTableName(modelName);
127
+ return this.createMatch({
128
+ table,
129
+ fields: [],
130
+ operation: 'delete',
131
+ confidence: 0.8,
132
+ metadata: { pattern: 'session.delete' },
133
+ });
134
+ }
135
+ matchCorePattern(chain) {
136
+ // Look for select/insert/update/delete as first segment
137
+ const firstSegment = chain.segments[0];
138
+ if (!firstSegment?.isCall)
139
+ return null;
140
+ const method = firstSegment.name;
141
+ if (!['select', 'insert', 'update', 'delete'].includes(method)) {
142
+ return null;
143
+ }
144
+ // Get table/model from first argument
145
+ const tableArg = firstSegment.args[0];
146
+ if (!tableArg)
147
+ return null;
148
+ const tableName = tableArg.type === 'identifier'
149
+ ? this.inferTableName(tableArg.value)
150
+ : tableArg.stringValue ?? 'unknown';
151
+ let operation;
152
+ const fields = [];
153
+ switch (method) {
154
+ case 'select':
155
+ operation = 'read';
156
+ break;
157
+ case 'insert':
158
+ operation = 'write';
159
+ // Look for values()
160
+ const valuesIndex = chain.segments.findIndex(s => s.name === 'values');
161
+ if (valuesIndex !== -1) {
162
+ this.extractKwargs(chain.segments[valuesIndex]?.args ?? [], fields);
163
+ }
164
+ break;
165
+ case 'update':
166
+ operation = 'write';
167
+ // Look for values()
168
+ const updateValuesIndex = chain.segments.findIndex(s => s.name === 'values');
169
+ if (updateValuesIndex !== -1) {
170
+ this.extractKwargs(chain.segments[updateValuesIndex]?.args ?? [], fields);
171
+ }
172
+ break;
173
+ case 'delete':
174
+ operation = 'delete';
175
+ break;
176
+ default:
177
+ return null;
178
+ }
179
+ return this.createMatch({
180
+ table: tableName,
181
+ fields: [...new Set(fields)],
182
+ operation,
183
+ confidence: 0.9,
184
+ metadata: { pattern: 'core' },
185
+ });
186
+ }
187
+ extractKwargs(args, fields) {
188
+ for (const arg of args) {
189
+ if (arg.value.includes('=')) {
190
+ const match = arg.value.match(/^(\w+)=/);
191
+ if (match?.[1]) {
192
+ fields.push(match[1]);
193
+ }
194
+ }
195
+ if (arg.type === 'object' && arg.properties) {
196
+ fields.push(...Object.keys(arg.properties));
197
+ }
198
+ }
199
+ }
200
+ }
201
+ //# sourceMappingURL=sqlalchemy-matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlalchemy-matcher.js","sourceRoot":"","sources":["../../../src/unified-provider/matching/sqlalchemy-matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Supabase Pattern Matcher
3
+ *
4
+ * Matches Supabase client patterns:
5
+ * - supabase.from('table').select('*')
6
+ * - supabase.from('table').insert({...})
7
+ * - supabase.from('table').update({...}).eq('id', 1)
8
+ * - supabase.from('table').delete().eq('id', 1)
9
+ */
10
+ import type { UnifiedCallChain, PatternMatchResult, UnifiedLanguage } from '../types.js';
11
+ import { BaseMatcher } from './base-matcher.js';
12
+ /**
13
+ * Supabase pattern matcher
14
+ */
15
+ export declare class SupabaseMatcher extends BaseMatcher {
16
+ readonly id = "supabase";
17
+ readonly name = "Supabase";
18
+ readonly languages: UnifiedLanguage[];
19
+ readonly priority = 100;
20
+ match(chain: UnifiedCallChain): PatternMatchResult | null;
21
+ private matchFromIndex;
22
+ /**
23
+ * Check if method is a Supabase where clause method
24
+ */
25
+ private isSupabaseWhereMethod;
26
+ }
27
+ //# sourceMappingURL=supabase-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-matcher.d.ts","sourceRoot":"","sources":["../../../src/unified-provider/matching/supabase-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,SAAS,EAAE,eAAe,EAAE,CAA0C;IAC/E,QAAQ,CAAC,QAAQ,OAAO;IAExB,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,IAAI;IAazD,OAAO,CAAC,cAAc;IAwEtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAmB9B"}