@backthread/extractor 0.1.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 (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/cluster/domain-grouping.d.ts +113 -0
  4. package/dist/cluster/domain-grouping.d.ts.map +1 -0
  5. package/dist/cluster/domain-grouping.js +277 -0
  6. package/dist/cluster/domain-grouping.js.map +1 -0
  7. package/dist/cluster/grouping-gate.d.ts +54 -0
  8. package/dist/cluster/grouping-gate.d.ts.map +1 -0
  9. package/dist/cluster/grouping-gate.js +0 -0
  10. package/dist/cluster/grouping-gate.js.map +1 -0
  11. package/dist/cluster/louvain.d.ts +88 -0
  12. package/dist/cluster/louvain.d.ts.map +1 -0
  13. package/dist/cluster/louvain.js +674 -0
  14. package/dist/cluster/louvain.js.map +1 -0
  15. package/dist/cluster/overrides.d.ts +19 -0
  16. package/dist/cluster/overrides.d.ts.map +1 -0
  17. package/dist/cluster/overrides.js +32 -0
  18. package/dist/cluster/overrides.js.map +1 -0
  19. package/dist/cluster/subsystem.d.ts +45 -0
  20. package/dist/cluster/subsystem.d.ts.map +1 -0
  21. package/dist/cluster/subsystem.js +299 -0
  22. package/dist/cluster/subsystem.js.map +1 -0
  23. package/dist/cluster/workspaces.d.ts +64 -0
  24. package/dist/cluster/workspaces.d.ts.map +1 -0
  25. package/dist/cluster/workspaces.js +739 -0
  26. package/dist/cluster/workspaces.js.map +1 -0
  27. package/dist/extract.d.ts +52 -0
  28. package/dist/extract.d.ts.map +1 -0
  29. package/dist/extract.js +48 -0
  30. package/dist/extract.js.map +1 -0
  31. package/dist/framework/celery/celery.d.ts +17 -0
  32. package/dist/framework/celery/celery.d.ts.map +1 -0
  33. package/dist/framework/celery/celery.js +524 -0
  34. package/dist/framework/celery/celery.js.map +1 -0
  35. package/dist/framework/contribute-step.d.ts +38 -0
  36. package/dist/framework/contribute-step.d.ts.map +1 -0
  37. package/dist/framework/contribute-step.js +403 -0
  38. package/dist/framework/contribute-step.js.map +1 -0
  39. package/dist/framework/detect-step.d.ts +8 -0
  40. package/dist/framework/detect-step.d.ts.map +1 -0
  41. package/dist/framework/detect-step.js +54 -0
  42. package/dist/framework/detect-step.js.map +1 -0
  43. package/dist/framework/detect-util.d.ts +24 -0
  44. package/dist/framework/detect-util.d.ts.map +1 -0
  45. package/dist/framework/detect-util.js +59 -0
  46. package/dist/framework/detect-util.js.map +1 -0
  47. package/dist/framework/django/django.d.ts +22 -0
  48. package/dist/framework/django/django.d.ts.map +1 -0
  49. package/dist/framework/django/django.js +940 -0
  50. package/dist/framework/django/django.js.map +1 -0
  51. package/dist/framework/fastapi/fastapi.d.ts +27 -0
  52. package/dist/framework/fastapi/fastapi.d.ts.map +1 -0
  53. package/dist/framework/fastapi/fastapi.js +477 -0
  54. package/dist/framework/fastapi/fastapi.js.map +1 -0
  55. package/dist/framework/faststream/faststream.d.ts +19 -0
  56. package/dist/framework/faststream/faststream.d.ts.map +1 -0
  57. package/dist/framework/faststream/faststream.js +765 -0
  58. package/dist/framework/faststream/faststream.js.map +1 -0
  59. package/dist/framework/flask/flask.d.ts +17 -0
  60. package/dist/framework/flask/flask.d.ts.map +1 -0
  61. package/dist/framework/flask/flask.js +507 -0
  62. package/dist/framework/flask/flask.js.map +1 -0
  63. package/dist/framework/graphql/graphql.d.ts +17 -0
  64. package/dist/framework/graphql/graphql.d.ts.map +1 -0
  65. package/dist/framework/graphql/graphql.js +708 -0
  66. package/dist/framework/graphql/graphql.js.map +1 -0
  67. package/dist/framework/grpc/grpc.d.ts +22 -0
  68. package/dist/framework/grpc/grpc.d.ts.map +1 -0
  69. package/dist/framework/grpc/grpc.js +618 -0
  70. package/dist/framework/grpc/grpc.js.map +1 -0
  71. package/dist/framework/litestar/litestar.d.ts +17 -0
  72. package/dist/framework/litestar/litestar.d.ts.map +1 -0
  73. package/dist/framework/litestar/litestar.js +536 -0
  74. package/dist/framework/litestar/litestar.js.map +1 -0
  75. package/dist/framework/nest/nest.d.ts +19 -0
  76. package/dist/framework/nest/nest.d.ts.map +1 -0
  77. package/dist/framework/nest/nest.js +613 -0
  78. package/dist/framework/nest/nest.js.map +1 -0
  79. package/dist/framework/next/next.d.ts +22 -0
  80. package/dist/framework/next/next.d.ts.map +1 -0
  81. package/dist/framework/next/next.js +449 -0
  82. package/dist/framework/next/next.js.map +1 -0
  83. package/dist/framework/node/node.d.ts +24 -0
  84. package/dist/framework/node/node.d.ts.map +1 -0
  85. package/dist/framework/node/node.js +1009 -0
  86. package/dist/framework/node/node.js.map +1 -0
  87. package/dist/framework/orchestrator/orchestrator.d.ts +34 -0
  88. package/dist/framework/orchestrator/orchestrator.d.ts.map +1 -0
  89. package/dist/framework/orchestrator/orchestrator.js +691 -0
  90. package/dist/framework/orchestrator/orchestrator.js.map +1 -0
  91. package/dist/framework/orm/orm.d.ts +61 -0
  92. package/dist/framework/orm/orm.d.ts.map +1 -0
  93. package/dist/framework/orm/orm.js +620 -0
  94. package/dist/framework/orm/orm.js.map +1 -0
  95. package/dist/framework/python/analyze.d.ts +38 -0
  96. package/dist/framework/python/analyze.d.ts.map +1 -0
  97. package/dist/framework/python/analyze.js +98 -0
  98. package/dist/framework/python/analyze.js.map +1 -0
  99. package/dist/framework/python/py-ast.d.ts +130 -0
  100. package/dist/framework/python/py-ast.d.ts.map +1 -0
  101. package/dist/framework/python/py-ast.js +344 -0
  102. package/dist/framework/python/py-ast.js.map +1 -0
  103. package/dist/framework/python-orm/python-orm.d.ts +19 -0
  104. package/dist/framework/python-orm/python-orm.d.ts.map +1 -0
  105. package/dist/framework/python-orm/python-orm.js +516 -0
  106. package/dist/framework/python-orm/python-orm.js.map +1 -0
  107. package/dist/framework/react-native/react-native.d.ts +35 -0
  108. package/dist/framework/react-native/react-native.d.ts.map +1 -0
  109. package/dist/framework/react-native/react-native.js +1181 -0
  110. package/dist/framework/react-native/react-native.js.map +1 -0
  111. package/dist/framework/register.d.ts +2 -0
  112. package/dist/framework/register.d.ts.map +1 -0
  113. package/dist/framework/register.js +59 -0
  114. package/dist/framework/register.js.map +1 -0
  115. package/dist/framework/registry.d.ts +31 -0
  116. package/dist/framework/registry.d.ts.map +1 -0
  117. package/dist/framework/registry.js +70 -0
  118. package/dist/framework/registry.js.map +1 -0
  119. package/dist/framework/routing/expo-router.d.ts +31 -0
  120. package/dist/framework/routing/expo-router.d.ts.map +1 -0
  121. package/dist/framework/routing/expo-router.js +356 -0
  122. package/dist/framework/routing/expo-router.js.map +1 -0
  123. package/dist/framework/routing/index.d.ts +4 -0
  124. package/dist/framework/routing/index.d.ts.map +1 -0
  125. package/dist/framework/routing/index.js +16 -0
  126. package/dist/framework/routing/index.js.map +1 -0
  127. package/dist/framework/routing/next-router.d.ts +45 -0
  128. package/dist/framework/routing/next-router.d.ts.map +1 -0
  129. package/dist/framework/routing/next-router.js +378 -0
  130. package/dist/framework/routing/next-router.js.map +1 -0
  131. package/dist/framework/routing/route-tree.d.ts +73 -0
  132. package/dist/framework/routing/route-tree.d.ts.map +1 -0
  133. package/dist/framework/routing/route-tree.js +120 -0
  134. package/dist/framework/routing/route-tree.js.map +1 -0
  135. package/dist/framework/types.d.ts +230 -0
  136. package/dist/framework/types.d.ts.map +1 -0
  137. package/dist/framework/types.js +25 -0
  138. package/dist/framework/types.js.map +1 -0
  139. package/dist/graph/cross-language.d.ts +11 -0
  140. package/dist/graph/cross-language.d.ts.map +1 -0
  141. package/dist/graph/cross-language.js +123 -0
  142. package/dist/graph/cross-language.js.map +1 -0
  143. package/dist/graph/extract.d.ts +13 -0
  144. package/dist/graph/extract.d.ts.map +1 -0
  145. package/dist/graph/extract.js +79 -0
  146. package/dist/graph/extract.js.map +1 -0
  147. package/dist/graph/file-graph.d.ts +186 -0
  148. package/dist/graph/file-graph.d.ts.map +1 -0
  149. package/dist/graph/file-graph.js +427 -0
  150. package/dist/graph/file-graph.js.map +1 -0
  151. package/dist/graph/http-callsites.d.ts +14 -0
  152. package/dist/graph/http-callsites.d.ts.map +1 -0
  153. package/dist/graph/http-callsites.js +107 -0
  154. package/dist/graph/http-callsites.js.map +1 -0
  155. package/dist/graph/incremental.d.ts +122 -0
  156. package/dist/graph/incremental.d.ts.map +1 -0
  157. package/dist/graph/incremental.js +448 -0
  158. package/dist/graph/incremental.js.map +1 -0
  159. package/dist/graph/language.d.ts +31 -0
  160. package/dist/graph/language.d.ts.map +1 -0
  161. package/dist/graph/language.js +146 -0
  162. package/dist/graph/language.js.map +1 -0
  163. package/dist/graph/noise-filter.d.ts +46 -0
  164. package/dist/graph/noise-filter.d.ts.map +1 -0
  165. package/dist/graph/noise-filter.js +199 -0
  166. package/dist/graph/noise-filter.js.map +1 -0
  167. package/dist/graph/python-adapter.d.ts +36 -0
  168. package/dist/graph/python-adapter.d.ts.map +1 -0
  169. package/dist/graph/python-adapter.js +402 -0
  170. package/dist/graph/python-adapter.js.map +1 -0
  171. package/dist/graph/python-manifest.d.ts +22 -0
  172. package/dist/graph/python-manifest.d.ts.map +1 -0
  173. package/dist/graph/python-manifest.js +137 -0
  174. package/dist/graph/python-manifest.js.map +1 -0
  175. package/dist/graph/python-stdlib.d.ts +2 -0
  176. package/dist/graph/python-stdlib.d.ts.map +1 -0
  177. package/dist/graph/python-stdlib.js +53 -0
  178. package/dist/graph/python-stdlib.js.map +1 -0
  179. package/dist/graph/ts-morph-adapter.d.ts +65 -0
  180. package/dist/graph/ts-morph-adapter.d.ts.map +1 -0
  181. package/dist/graph/ts-morph-adapter.js +265 -0
  182. package/dist/graph/ts-morph-adapter.js.map +1 -0
  183. package/dist/graph/types.d.ts +37 -0
  184. package/dist/graph/types.d.ts.map +1 -0
  185. package/dist/graph/types.js +50 -0
  186. package/dist/graph/types.js.map +1 -0
  187. package/dist/index.d.ts +45 -0
  188. package/dist/index.d.ts.map +1 -0
  189. package/dist/index.js +51 -0
  190. package/dist/index.js.map +1 -0
  191. package/dist/infra/aws/aws-parse.d.ts +39 -0
  192. package/dist/infra/aws/aws-parse.d.ts.map +1 -0
  193. package/dist/infra/aws/aws-parse.js +149 -0
  194. package/dist/infra/aws/aws-parse.js.map +1 -0
  195. package/dist/infra/aws/aws.d.ts +6 -0
  196. package/dist/infra/aws/aws.d.ts.map +1 -0
  197. package/dist/infra/aws/aws.js +425 -0
  198. package/dist/infra/aws/aws.js.map +1 -0
  199. package/dist/infra/azure/azure-parse.d.ts +73 -0
  200. package/dist/infra/azure/azure-parse.d.ts.map +1 -0
  201. package/dist/infra/azure/azure-parse.js +178 -0
  202. package/dist/infra/azure/azure-parse.js.map +1 -0
  203. package/dist/infra/azure/azure.d.ts +12 -0
  204. package/dist/infra/azure/azure.d.ts.map +1 -0
  205. package/dist/infra/azure/azure.js +673 -0
  206. package/dist/infra/azure/azure.js.map +1 -0
  207. package/dist/infra/cloudflare/cloudflare.d.ts +50 -0
  208. package/dist/infra/cloudflare/cloudflare.d.ts.map +1 -0
  209. package/dist/infra/cloudflare/cloudflare.js +382 -0
  210. package/dist/infra/cloudflare/cloudflare.js.map +1 -0
  211. package/dist/infra/cloudflare/wrangler-parse.d.ts +6 -0
  212. package/dist/infra/cloudflare/wrangler-parse.d.ts.map +1 -0
  213. package/dist/infra/cloudflare/wrangler-parse.js +278 -0
  214. package/dist/infra/cloudflare/wrangler-parse.js.map +1 -0
  215. package/dist/infra/compose/compose-parse.d.ts +24 -0
  216. package/dist/infra/compose/compose-parse.d.ts.map +1 -0
  217. package/dist/infra/compose/compose-parse.js +77 -0
  218. package/dist/infra/compose/compose-parse.js.map +1 -0
  219. package/dist/infra/compose/compose.d.ts +12 -0
  220. package/dist/infra/compose/compose.d.ts.map +1 -0
  221. package/dist/infra/compose/compose.js +201 -0
  222. package/dist/infra/compose/compose.js.map +1 -0
  223. package/dist/infra/convex/convex-parse.d.ts +28 -0
  224. package/dist/infra/convex/convex-parse.d.ts.map +1 -0
  225. package/dist/infra/convex/convex-parse.js +74 -0
  226. package/dist/infra/convex/convex-parse.js.map +1 -0
  227. package/dist/infra/convex/convex.d.ts +18 -0
  228. package/dist/infra/convex/convex.d.ts.map +1 -0
  229. package/dist/infra/convex/convex.js +199 -0
  230. package/dist/infra/convex/convex.js.map +1 -0
  231. package/dist/infra/digitalocean/digitalocean.d.ts +33 -0
  232. package/dist/infra/digitalocean/digitalocean.d.ts.map +1 -0
  233. package/dist/infra/digitalocean/digitalocean.js +204 -0
  234. package/dist/infra/digitalocean/digitalocean.js.map +1 -0
  235. package/dist/infra/firebase/firebase.d.ts +43 -0
  236. package/dist/infra/firebase/firebase.d.ts.map +1 -0
  237. package/dist/infra/firebase/firebase.js +271 -0
  238. package/dist/infra/firebase/firebase.js.map +1 -0
  239. package/dist/infra/fly/fly-parse.d.ts +52 -0
  240. package/dist/infra/fly/fly-parse.d.ts.map +1 -0
  241. package/dist/infra/fly/fly-parse.js +114 -0
  242. package/dist/infra/fly/fly-parse.js.map +1 -0
  243. package/dist/infra/fly/fly.d.ts +15 -0
  244. package/dist/infra/fly/fly.d.ts.map +1 -0
  245. package/dist/infra/fly/fly.js +265 -0
  246. package/dist/infra/fly/fly.js.map +1 -0
  247. package/dist/infra/gcp/gcp-parse.d.ts +24 -0
  248. package/dist/infra/gcp/gcp-parse.d.ts.map +1 -0
  249. package/dist/infra/gcp/gcp-parse.js +123 -0
  250. package/dist/infra/gcp/gcp-parse.js.map +1 -0
  251. package/dist/infra/gcp/gcp.d.ts +10 -0
  252. package/dist/infra/gcp/gcp.d.ts.map +1 -0
  253. package/dist/infra/gcp/gcp.js +502 -0
  254. package/dist/infra/gcp/gcp.js.map +1 -0
  255. package/dist/infra/heroku/heroku-parse.d.ts +33 -0
  256. package/dist/infra/heroku/heroku-parse.d.ts.map +1 -0
  257. package/dist/infra/heroku/heroku-parse.js +63 -0
  258. package/dist/infra/heroku/heroku-parse.js.map +1 -0
  259. package/dist/infra/heroku/heroku.d.ts +24 -0
  260. package/dist/infra/heroku/heroku.d.ts.map +1 -0
  261. package/dist/infra/heroku/heroku.js +253 -0
  262. package/dist/infra/heroku/heroku.js.map +1 -0
  263. package/dist/infra/image-resolve.d.ts +56 -0
  264. package/dist/infra/image-resolve.d.ts.map +1 -0
  265. package/dist/infra/image-resolve.js +229 -0
  266. package/dist/infra/image-resolve.js.map +1 -0
  267. package/dist/infra/infra-step.d.ts +39 -0
  268. package/dist/infra/infra-step.d.ts.map +1 -0
  269. package/dist/infra/infra-step.js +57 -0
  270. package/dist/infra/infra-step.js.map +1 -0
  271. package/dist/infra/k8s/index.d.ts +78 -0
  272. package/dist/infra/k8s/index.d.ts.map +1 -0
  273. package/dist/infra/k8s/index.js +251 -0
  274. package/dist/infra/k8s/index.js.map +1 -0
  275. package/dist/infra/kamal/kamal-parse.d.ts +23 -0
  276. package/dist/infra/kamal/kamal-parse.d.ts.map +1 -0
  277. package/dist/infra/kamal/kamal-parse.js +66 -0
  278. package/dist/infra/kamal/kamal-parse.js.map +1 -0
  279. package/dist/infra/kamal/kamal.d.ts +17 -0
  280. package/dist/infra/kamal/kamal.d.ts.map +1 -0
  281. package/dist/infra/kamal/kamal.js +162 -0
  282. package/dist/infra/kamal/kamal.js.map +1 -0
  283. package/dist/infra/netlify/netlify.d.ts +33 -0
  284. package/dist/infra/netlify/netlify.d.ts.map +1 -0
  285. package/dist/infra/netlify/netlify.js +247 -0
  286. package/dist/infra/netlify/netlify.js.map +1 -0
  287. package/dist/infra/opentofu/opentofu.d.ts +3 -0
  288. package/dist/infra/opentofu/opentofu.d.ts.map +1 -0
  289. package/dist/infra/opentofu/opentofu.js +157 -0
  290. package/dist/infra/opentofu/opentofu.js.map +1 -0
  291. package/dist/infra/pulumi/pulumi-parse.d.ts +60 -0
  292. package/dist/infra/pulumi/pulumi-parse.d.ts.map +1 -0
  293. package/dist/infra/pulumi/pulumi-parse.js +155 -0
  294. package/dist/infra/pulumi/pulumi-parse.js.map +1 -0
  295. package/dist/infra/pulumi/pulumi.d.ts +23 -0
  296. package/dist/infra/pulumi/pulumi.d.ts.map +1 -0
  297. package/dist/infra/pulumi/pulumi.js +260 -0
  298. package/dist/infra/pulumi/pulumi.js.map +1 -0
  299. package/dist/infra/railway/railway-parse.d.ts +54 -0
  300. package/dist/infra/railway/railway-parse.d.ts.map +1 -0
  301. package/dist/infra/railway/railway-parse.js +200 -0
  302. package/dist/infra/railway/railway-parse.js.map +1 -0
  303. package/dist/infra/railway/railway.d.ts +19 -0
  304. package/dist/infra/railway/railway.d.ts.map +1 -0
  305. package/dist/infra/railway/railway.js +397 -0
  306. package/dist/infra/railway/railway.js.map +1 -0
  307. package/dist/infra/register.d.ts +2 -0
  308. package/dist/infra/register.d.ts.map +1 -0
  309. package/dist/infra/register.js +81 -0
  310. package/dist/infra/register.js.map +1 -0
  311. package/dist/infra/registry.d.ts +64 -0
  312. package/dist/infra/registry.d.ts.map +1 -0
  313. package/dist/infra/registry.js +205 -0
  314. package/dist/infra/registry.js.map +1 -0
  315. package/dist/infra/relevance.d.ts +16 -0
  316. package/dist/infra/relevance.d.ts.map +1 -0
  317. package/dist/infra/relevance.js +132 -0
  318. package/dist/infra/relevance.js.map +1 -0
  319. package/dist/infra/render/render-parse.d.ts +76 -0
  320. package/dist/infra/render/render-parse.d.ts.map +1 -0
  321. package/dist/infra/render/render-parse.js +155 -0
  322. package/dist/infra/render/render-parse.js.map +1 -0
  323. package/dist/infra/render/render.d.ts +11 -0
  324. package/dist/infra/render/render.d.ts.map +1 -0
  325. package/dist/infra/render/render.js +303 -0
  326. package/dist/infra/render/render.js.map +1 -0
  327. package/dist/infra/sst/sst-parse.d.ts +25 -0
  328. package/dist/infra/sst/sst-parse.d.ts.map +1 -0
  329. package/dist/infra/sst/sst-parse.js +45 -0
  330. package/dist/infra/sst/sst-parse.js.map +1 -0
  331. package/dist/infra/sst/sst.d.ts +19 -0
  332. package/dist/infra/sst/sst.d.ts.map +1 -0
  333. package/dist/infra/sst/sst.js +236 -0
  334. package/dist/infra/sst/sst.js.map +1 -0
  335. package/dist/infra/supabase/supabase-parse.d.ts +34 -0
  336. package/dist/infra/supabase/supabase-parse.d.ts.map +1 -0
  337. package/dist/infra/supabase/supabase-parse.js +113 -0
  338. package/dist/infra/supabase/supabase-parse.js.map +1 -0
  339. package/dist/infra/supabase/supabase.d.ts +15 -0
  340. package/dist/infra/supabase/supabase.d.ts.map +1 -0
  341. package/dist/infra/supabase/supabase.js +198 -0
  342. package/dist/infra/supabase/supabase.js.map +1 -0
  343. package/dist/infra/terraform/hcl-parse.d.ts +34 -0
  344. package/dist/infra/terraform/hcl-parse.d.ts.map +1 -0
  345. package/dist/infra/terraform/hcl-parse.js +203 -0
  346. package/dist/infra/terraform/hcl-parse.js.map +1 -0
  347. package/dist/infra/terraform/terraform.d.ts +14 -0
  348. package/dist/infra/terraform/terraform.d.ts.map +1 -0
  349. package/dist/infra/terraform/terraform.js +264 -0
  350. package/dist/infra/terraform/terraform.js.map +1 -0
  351. package/dist/infra/types.d.ts +151 -0
  352. package/dist/infra/types.d.ts.map +1 -0
  353. package/dist/infra/types.js +14 -0
  354. package/dist/infra/types.js.map +1 -0
  355. package/dist/infra/vercel/vercel-parse.d.ts +70 -0
  356. package/dist/infra/vercel/vercel-parse.d.ts.map +1 -0
  357. package/dist/infra/vercel/vercel-parse.js +194 -0
  358. package/dist/infra/vercel/vercel-parse.js.map +1 -0
  359. package/dist/infra/vercel/vercel.d.ts +30 -0
  360. package/dist/infra/vercel/vercel.d.ts.map +1 -0
  361. package/dist/infra/vercel/vercel.js +523 -0
  362. package/dist/infra/vercel/vercel.js.map +1 -0
  363. package/dist/infra/walk.d.ts +36 -0
  364. package/dist/infra/walk.d.ts.map +1 -0
  365. package/dist/infra/walk.js +85 -0
  366. package/dist/infra/walk.js.map +1 -0
  367. package/dist/safety.d.ts +13 -0
  368. package/dist/safety.d.ts.map +1 -0
  369. package/dist/safety.js +67 -0
  370. package/dist/safety.js.map +1 -0
  371. package/dist/types.d.ts +47 -0
  372. package/dist/types.d.ts.map +1 -0
  373. package/dist/types.js +111 -0
  374. package/dist/types.js.map +1 -0
  375. package/dist/version.d.ts +2 -0
  376. package/dist/version.d.ts.map +1 -0
  377. package/dist/version.js +35 -0
  378. package/dist/version.js.map +1 -0
  379. package/package.json +65 -0
@@ -0,0 +1,620 @@
1
+ // (Slice 2) — the ORM FrameworkAdapter. DETECTION (Slice 2).
2
+ // the LIGHTWEIGHT data-model contribution (founder-scoped 2026-06-26).
3
+ //
4
+ // DETECTION: decides "does this repo use a database ORM, and which
5
+ // one(s)?" from package.json deps + ORM config-file existence — never source
6
+ // content (never-store-source). scoreOrm is PURE.
7
+ //
8
+ // CONTRIBUTION (, founder-scoped 2026-06-26 — LIGHTWEIGHT, NOT a full
9
+ // ERD): the data layer is made a legible box WITHOUT synthesizing an
10
+ // entity-node-per-model graph (the framework seam has no new-node hook, and
11
+ // entity-relation edges don't fit the locked 8-verb taxonomy). Two channels:
12
+ //
13
+ // 1. ROLE TAGS (this adapter, via the generic contribute-step) — schema/model
14
+ // definition modules → 'repository', query-call-site modules → 'data-access',
15
+ // migration modules → 'migration'. Each maps onto the LOCKED `service`
16
+ // Module-kind (roles are metadata, NEVER a new Module-kind).
17
+ //
18
+ // 2. DATASTORE ENRICHMENT + DATA-ACCESS EDGES (the assemble infra-join, NOT
19
+ // here) — the parsed entity/table list enriches the EXISTING datastore node
20
+ // (surfaced by the infra layer) and `reads`/`writes`/`stores-in` edges are
21
+ // drawn from the querying modules to it. That lives in assemble.ts because
22
+ // the edge endpoints are INFRA nodes (the datastore), which only exist after
23
+ // the infra-join — not code modules the contribute-step can resolve. This
24
+ // module EXPORTS the deterministic parse (`analyzeOrmDataModel`) that
25
+ // assemble consumes; it draws no edges itself.
26
+ //
27
+ // `analyzeOrmDataModel` is the single source of truth for both channels:
28
+ // * Prisma — parse schema.prisma (declarative; entities = `model`/`view`),
29
+ // plus `prisma.<model>.<method>()` query call sites.
30
+ // * Drizzle — `pgTable`/`sqliteTable`/`mysqlTable` table defs (entity = the SQL
31
+ // table name) + `db.select/insert/update/delete` / `db.query.X.find*`.
32
+ // * TypeORM — `@Entity` classes (entity = decorator arg or class name) + repo
33
+ // methods (find/findOne/save/… on a repository/manager receiver).
34
+ // * Mongoose— `model('Name', …)` defs + query methods on a known model.
35
+ // * Sequelize — DETECT-ONLY (parsing not implemented; logged, never silent).
36
+ //
37
+ // Detection signals (manifest + config existence only):
38
+ // * deps: prisma | @prisma/client | drizzle-orm | typeorm | mongoose | sequelize
39
+ // * config: schema.prisma (root or prisma/) → Prisma · drizzle.config.* → Drizzle
40
+ //
41
+ // A repo can use several ORMs (a Prisma app migrating to Drizzle); they all ride
42
+ // in metadata and all run their matchers.
43
+ import { readdirSync, readFileSync } from 'node:fs';
44
+ import { join } from 'node:path';
45
+ import { SyntaxKind, } from 'ts-morph';
46
+ import { addAllSourceFiles, buildExtractionProject, toId, } from '../../graph/ts-morph-adapter.js';
47
+ import { SOURCE_EXTENSIONS } from '../../graph/file-graph.js';
48
+ import { clampConfidence, existsAny, isDir, readDeps, resolveBase } from '../detect-util.js';
49
+ // Canonical ordering — deterministic `variant`/metadata order regardless of
50
+ // package.json key order or which signal fired.
51
+ const ORM_ORDER = ['prisma', 'drizzle', 'typeorm', 'mongoose', 'sequelize'];
52
+ // npm dep name → canonical ORM. Prisma ships as two packages (the CLI `prisma`
53
+ // and the runtime `@prisma/client`); either maps to one canonical 'prisma'.
54
+ const ORM_DEPS = {
55
+ prisma: 'prisma',
56
+ '@prisma/client': 'prisma',
57
+ 'drizzle-orm': 'drizzle',
58
+ typeorm: 'typeorm',
59
+ mongoose: 'mongoose',
60
+ sequelize: 'sequelize',
61
+ };
62
+ const PRISMA_SCHEMA_NAMES = ['schema.prisma', 'prisma/schema.prisma'];
63
+ const DRIZZLE_CONFIG_NAMES = [
64
+ 'drizzle.config.ts',
65
+ 'drizzle.config.js',
66
+ 'drizzle.config.mjs',
67
+ 'drizzle.config.cjs',
68
+ 'drizzle.config.json',
69
+ ];
70
+ /** Gather the signal set for a single root dir (fs only). */
71
+ export function gatherOrmSignals(baseDir) {
72
+ const deps = readDeps(baseDir);
73
+ const found = new Set();
74
+ for (const [dep, orm] of Object.entries(ORM_DEPS))
75
+ if (dep in deps)
76
+ found.add(orm);
77
+ return {
78
+ depOrms: ORM_ORDER.filter((o) => found.has(o)),
79
+ hasPrismaSchema: existsAny(baseDir, PRISMA_SCHEMA_NAMES),
80
+ hasDrizzleConfig: existsAny(baseDir, DRIZZLE_CONFIG_NAMES),
81
+ };
82
+ }
83
+ /**
84
+ * Decide ORM usage from the signal set. Returns a DetectMatch, or null when no
85
+ * ORM signal fires (generic-TS fallthrough intact).
86
+ *
87
+ * An ORM dep is SUFFICIENT (authoritative). A config file alone is ALSO
88
+ * sufficient — a `schema.prisma` / `drizzle.config.*` is ORM-specific — and
89
+ * implies its ORM even without the dep declared (config-only scores lower). The
90
+ * final `orms` set is the union of dep- and config-derived ORMs.
91
+ */
92
+ export function scoreOrm(s, rootPath = '') {
93
+ const set = new Set(s.depOrms);
94
+ if (s.hasPrismaSchema)
95
+ set.add('prisma');
96
+ if (s.hasDrizzleConfig)
97
+ set.add('drizzle');
98
+ if (set.size === 0)
99
+ return null;
100
+ let confidence = 0;
101
+ if (s.depOrms.length > 0)
102
+ confidence += 0.6 + 0.1 * (s.depOrms.length - 1);
103
+ if (s.hasPrismaSchema)
104
+ confidence += s.depOrms.includes('prisma') ? 0.2 : 0.4;
105
+ if (s.hasDrizzleConfig)
106
+ confidence += s.depOrms.includes('drizzle') ? 0.2 : 0.4;
107
+ const orms = ORM_ORDER.filter((o) => set.has(o));
108
+ return {
109
+ adapter: 'orm',
110
+ confidence: clampConfidence(confidence),
111
+ rootPath,
112
+ metadata: {
113
+ variant: orms.join('+'),
114
+ orms,
115
+ signals: {
116
+ depOrms: s.depOrms,
117
+ prismaSchema: s.hasPrismaSchema,
118
+ drizzleConfig: s.hasDrizzleConfig,
119
+ },
120
+ },
121
+ };
122
+ }
123
+ const ROLE_PRIORITY = {
124
+ 'data-access': 3,
125
+ repository: 2,
126
+ migration: 1,
127
+ };
128
+ const ROLE_KIND = 'service';
129
+ // Per-ORM query-method vocabularies. Generic names (find/create/update/delete/
130
+ // count/save/remove) are gated (model accessor / drizzle-client / repository-ish
131
+ // receiver / known model) to suppress the obvious false positives (Array.find,
132
+ // Map.delete, …). Distinctive names (findMany/upsert/findOneBy/…) match ungated.
133
+ const PRISMA_READ = new Set([
134
+ 'findMany', 'findUnique', 'findFirst', 'findUniqueOrThrow', 'findFirstOrThrow', 'count', 'aggregate', 'groupBy',
135
+ ]);
136
+ const PRISMA_WRITE = new Set([
137
+ 'create', 'createMany', 'createManyAndReturn', 'update', 'updateMany', 'updateManyAndReturn', 'upsert', 'delete', 'deleteMany',
138
+ ]);
139
+ // Distinctive ⇒ no model-accessor gate needed.
140
+ const PRISMA_DISTINCTIVE = new Set([
141
+ 'findMany', 'findUnique', 'findFirst', 'findUniqueOrThrow', 'findFirstOrThrow', 'aggregate', 'groupBy',
142
+ 'createMany', 'createManyAndReturn', 'updateMany', 'updateManyAndReturn', 'upsert', 'deleteMany',
143
+ ]);
144
+ const DRIZZLE_READ = new Set(['select', 'selectDistinct', '$count']);
145
+ const DRIZZLE_WRITE = new Set(['insert', 'update', 'delete']);
146
+ const DRIZZLE_FIND = new Set(['findMany', 'findFirst']); // under `<db>.query.<table>.`
147
+ const TYPEORM_READ = new Set([
148
+ 'find', 'findOne', 'findBy', 'findOneBy', 'findAndCount', 'findAndCountBy', 'findOneOrFail', 'findOneByOrFail',
149
+ 'findByIds', 'count', 'countBy', 'exist', 'exists', 'existsBy', 'getMany', 'getOne', 'getRawMany', 'getRawOne',
150
+ ]);
151
+ const TYPEORM_WRITE = new Set([
152
+ 'save', 'insert', 'update', 'delete', 'remove', 'softDelete', 'softRemove', 'restore', 'recover', 'upsert', 'increment', 'decrement',
153
+ ]);
154
+ const TYPEORM_DISTINCTIVE = new Set([
155
+ 'findBy', 'findOneBy', 'findAndCount', 'findAndCountBy', 'findOneOrFail', 'findOneByOrFail', 'findByIds',
156
+ 'countBy', 'existsBy', 'softDelete', 'softRemove', 'upsert', 'getMany', 'getOne', 'getRawMany', 'getRawOne',
157
+ ]);
158
+ const TYPEORM_RECV_RE = /repo|repository|manager|datasource/i;
159
+ const MONGOOSE_READ = new Set([
160
+ 'find', 'findOne', 'findById', 'countDocuments', 'estimatedDocumentCount', 'aggregate', 'exists', 'distinct',
161
+ ]);
162
+ const MONGOOSE_WRITE = new Set([
163
+ 'create', 'insertMany', 'updateOne', 'updateMany', 'replaceOne', 'deleteOne', 'deleteMany',
164
+ 'findOneAndUpdate', 'findByIdAndUpdate', 'findOneAndDelete', 'findByIdAndDelete', 'findByIdAndRemove',
165
+ 'findOneAndReplace', 'save', 'bulkWrite',
166
+ ]);
167
+ // Drizzle table-factory identifiers (used unaliased in the overwhelming common
168
+ // case; an aliased import is the rare miss we log rather than chase install-free).
169
+ const DRIZZLE_TABLE_FACTORIES = new Set([
170
+ 'pgTable', 'sqliteTable', 'mysqlTable',
171
+ 'pgView', 'mysqlView', 'sqliteView', 'pgMaterializedView',
172
+ ]);
173
+ // Conventional drizzle client identifier names, added so an imported `db`
174
+ // (the common `import { db } from './db'`) still gates query sites even when its
175
+ // `drizzle(...)` assignment lives in another file. Only consulted when Drizzle
176
+ // is detected, so the collision surface is an already-Drizzle repo.
177
+ const DRIZZLE_CONVENTIONAL_CLIENTS = ['db', 'database'];
178
+ const MIGRATION_PATH_RE = /(^|\/)migrations?(\/|$)/i;
179
+ const SOURCE_EXT_SET = new Set(SOURCE_EXTENSIONS);
180
+ const EMPTY_MODEL = {
181
+ orms: [],
182
+ entities: [],
183
+ dataAccess: new Map(),
184
+ schemaFiles: new Set(),
185
+ migrationFiles: new Set(),
186
+ roles: new Map(),
187
+ diagnostics: { unparsedOrms: [] },
188
+ };
189
+ function lowerFirst(s) {
190
+ return s ? s.charAt(0).toLowerCase() + s.slice(1) : s;
191
+ }
192
+ function staticString(node) {
193
+ if (!node)
194
+ return undefined;
195
+ const k = node.getKind();
196
+ if (k === SyntaxKind.StringLiteral || k === SyntaxKind.NoSubstitutionTemplateLiteral) {
197
+ return node.getLiteralText();
198
+ }
199
+ return undefined;
200
+ }
201
+ // Leftmost identifier of a receiver chain (`a.b.c` → `a`, `this.x` → 'this').
202
+ function rootIdent(node, depth = 0) {
203
+ if (depth > 24)
204
+ return undefined;
205
+ const k = node.getKind();
206
+ if (k === SyntaxKind.Identifier)
207
+ return node.getText();
208
+ if (k === SyntaxKind.ThisKeyword)
209
+ return 'this';
210
+ if (k === SyntaxKind.PropertyAccessExpression) {
211
+ return rootIdent(node.getExpression(), depth + 1);
212
+ }
213
+ if (k === SyntaxKind.CallExpression) {
214
+ return rootIdent(node.getExpression(), depth + 1);
215
+ }
216
+ if (k === SyntaxKind.NonNullExpression ||
217
+ k === SyntaxKind.ParenthesizedExpression ||
218
+ k === SyntaxKind.AsExpression ||
219
+ k === SyntaxKind.SatisfiesExpression) {
220
+ const inner = node.getExpression?.();
221
+ return inner ? rootIdent(inner, depth + 1) : undefined;
222
+ }
223
+ return undefined;
224
+ }
225
+ // The immediate receiver's leaf name (for the TypeORM repository-ish gate +
226
+ // the Mongoose known-model gate): an identifier's text, or a property access's
227
+ // trailing name (`this.userRepository` → 'userRepository').
228
+ function receiverLeafName(recv, depth = 0) {
229
+ if (depth > 8)
230
+ return undefined;
231
+ const k = recv.getKind();
232
+ if (k === SyntaxKind.Identifier)
233
+ return recv.getText();
234
+ if (k === SyntaxKind.PropertyAccessExpression)
235
+ return recv.getName();
236
+ // Data-mapper chains — `getRepository(User).find()` /
237
+ // `dataSource.getRepository(User).find()` — put a CallExpression in the
238
+ // receiver slot; use its callee's leaf name so the repository-ish gate
239
+ // (TYPEORM_RECV_RE) still recognizes `getRepository`.
240
+ if (k === SyntaxKind.CallExpression) {
241
+ return receiverLeafName(recv.getExpression(), depth + 1);
242
+ }
243
+ return undefined;
244
+ }
245
+ function inScope(fileId, rootPath) {
246
+ if (rootPath === '')
247
+ return true;
248
+ return fileId === rootPath || fileId.startsWith(`${rootPath}/`);
249
+ }
250
+ // ---------------------------------------------------------------------------
251
+ // Prisma schema parsing (file-based — schema.prisma is declarative, not TS).
252
+ function readFileSafe(path) {
253
+ try {
254
+ return readFileSync(path, 'utf8');
255
+ }
256
+ catch {
257
+ return undefined;
258
+ }
259
+ }
260
+ // Resolve the prisma schema file(s): the single-file `schema.prisma` /
261
+ // `prisma/schema.prisma`, plus the multi-file `prisma/schema/*.prisma` layout.
262
+ function prismaSchemaFiles(repoDir) {
263
+ const out = [];
264
+ for (const rel of PRISMA_SCHEMA_NAMES) {
265
+ const abs = join(repoDir, rel);
266
+ if (readFileSafe(abs) !== undefined)
267
+ out.push(abs);
268
+ }
269
+ const multiDir = join(repoDir, 'prisma', 'schema');
270
+ if (isDir(repoDir, 'prisma/schema')) {
271
+ try {
272
+ for (const name of readdirSync(multiDir).sort()) {
273
+ if (name.endsWith('.prisma'))
274
+ out.push(join(multiDir, name));
275
+ }
276
+ }
277
+ catch {
278
+ /* ignore — best-effort */
279
+ }
280
+ }
281
+ return out;
282
+ }
283
+ const PRISMA_MODEL_RE = /^\s*(?:model|view)\s+([A-Za-z_]\w*)\s*\{/gm;
284
+ // Parse model/view names out of the prisma schema(s). Views are queryable, so
285
+ // they count as entities + accessors. Returns entity names + the client
286
+ // accessors (lowercase-first) the generic prisma method gate consults.
287
+ function parsePrismaSchema(repoDir) {
288
+ const entities = new Set();
289
+ const accessors = new Set();
290
+ for (const abs of prismaSchemaFiles(repoDir)) {
291
+ const src = readFileSafe(abs);
292
+ if (!src)
293
+ continue;
294
+ PRISMA_MODEL_RE.lastIndex = 0;
295
+ let m;
296
+ while ((m = PRISMA_MODEL_RE.exec(src)) !== null) {
297
+ entities.add(m[1]);
298
+ accessors.add(lowerFirst(m[1]).toLowerCase());
299
+ }
300
+ }
301
+ return { entities: [...entities], accessors };
302
+ }
303
+ // ---------------------------------------------------------------------------
304
+ // The full analysis (one ts-morph project build + one descendant pass per file).
305
+ /**
306
+ * Parse the data model for a repo. Deterministic, install-free, source-reading
307
+ * (never-store-source: read server-side, persist only the derived entities/
308
+ * edges/roles). `rootPath` scopes a workspace package ('' = repo root).
309
+ *
310
+ * Unmemoized + pure-w.r.t.-fs: callers (assemble.ts; the roleTags hook) own
311
+ * their own memoization so this stays a plain function of (repoDir, tree).
312
+ */
313
+ export function analyzeOrmDataModel(repoDir, rootPath = '') {
314
+ const signals = gatherOrmSignals(repoDir);
315
+ const match = scoreOrm(signals, rootPath);
316
+ if (!match)
317
+ return EMPTY_MODEL;
318
+ const orms = new Set(match.metadata.orms ?? []);
319
+ if (orms.size === 0)
320
+ return EMPTY_MODEL;
321
+ const entities = new Set();
322
+ const schemaFiles = new Set();
323
+ const migrationFiles = new Set();
324
+ const drizzleClients = new Set();
325
+ const mongooseModels = new Set();
326
+ const dataAccess = new Map();
327
+ const candidates = [];
328
+ // Prisma: entities + client accessors come from the declarative schema file.
329
+ const prisma = orms.has('prisma') ? parsePrismaSchema(repoDir) : { entities: [], accessors: new Set() };
330
+ for (const e of prisma.entities)
331
+ entities.add(e);
332
+ const prismaAccessors = prisma.accessors;
333
+ // The union of method names worth capturing — pre-filters the candidate list
334
+ // so we never store a descriptor for an irrelevant call.
335
+ const relevantMethods = new Set();
336
+ const add = (s) => s.forEach((m) => relevantMethods.add(m));
337
+ if (orms.has('prisma')) {
338
+ add(PRISMA_READ);
339
+ add(PRISMA_WRITE);
340
+ relevantMethods.add('$queryRaw');
341
+ relevantMethods.add('$queryRawUnsafe');
342
+ relevantMethods.add('$executeRaw');
343
+ relevantMethods.add('$executeRawUnsafe');
344
+ }
345
+ if (orms.has('drizzle')) {
346
+ add(DRIZZLE_READ);
347
+ add(DRIZZLE_WRITE);
348
+ add(DRIZZLE_FIND);
349
+ }
350
+ if (orms.has('typeorm')) {
351
+ add(TYPEORM_READ);
352
+ add(TYPEORM_WRITE);
353
+ }
354
+ if (orms.has('mongoose')) {
355
+ add(MONGOOSE_READ);
356
+ add(MONGOOSE_WRITE);
357
+ }
358
+ const project = buildExtractionProject(repoDir);
359
+ addAllSourceFiles(project, repoDir);
360
+ // PASS 1 — defs + clients/models + migration paths + query-call candidates.
361
+ for (const sf of project.getSourceFiles()) {
362
+ const fileId = toId(repoDir, sf.getFilePath());
363
+ if (!inScope(fileId, rootPath))
364
+ continue;
365
+ if (MIGRATION_PATH_RE.test(fileId))
366
+ migrationFiles.add(fileId);
367
+ if (orms.has('typeorm'))
368
+ collectTypeormEntities(sf, fileId, entities, schemaFiles);
369
+ for (const call of sf.getDescendantsOfKind(SyntaxKind.CallExpression)) {
370
+ const callee = call.getExpression();
371
+ const calleeKind = callee.getKind();
372
+ // Drizzle table factories: `pgTable('users', {...})`.
373
+ if (orms.has('drizzle') &&
374
+ calleeKind === SyntaxKind.Identifier &&
375
+ DRIZZLE_TABLE_FACTORIES.has(callee.getText())) {
376
+ const name = staticString(call.getArguments()[0]);
377
+ const varName = call.getParentIfKind(SyntaxKind.VariableDeclaration)?.getName();
378
+ const entity = name ?? varName;
379
+ if (entity)
380
+ entities.add(entity);
381
+ schemaFiles.add(fileId);
382
+ continue;
383
+ }
384
+ // Drizzle client: `const db = drizzle(...)`.
385
+ if (orms.has('drizzle') &&
386
+ calleeKind === SyntaxKind.Identifier &&
387
+ callee.getText() === 'drizzle') {
388
+ const varName = call.getParentIfKind(SyntaxKind.VariableDeclaration)?.getName();
389
+ if (varName)
390
+ drizzleClients.add(varName);
391
+ continue;
392
+ }
393
+ // Mongoose model defs: `mongoose.model('User', …)` / `model('User', …)`.
394
+ if (orms.has('mongoose')) {
395
+ const isModelCall = (calleeKind === SyntaxKind.PropertyAccessExpression &&
396
+ callee.getName() === 'model') ||
397
+ (calleeKind === SyntaxKind.Identifier && callee.getText() === 'model');
398
+ if (isModelCall) {
399
+ const name = staticString(call.getArguments()[0]);
400
+ const varName = call.getParentIfKind(SyntaxKind.VariableDeclaration)?.getName();
401
+ if (name) {
402
+ entities.add(name);
403
+ mongooseModels.add(name);
404
+ }
405
+ if (varName)
406
+ mongooseModels.add(varName);
407
+ schemaFiles.add(fileId);
408
+ continue;
409
+ }
410
+ }
411
+ // Query-call candidate (property-access method calls only — bare calls have
412
+ // no receiver to attribute). Pre-filtered by the relevant-method union.
413
+ if (calleeKind !== SyntaxKind.PropertyAccessExpression)
414
+ continue;
415
+ const pa = callee;
416
+ const method = pa.getName();
417
+ if (!relevantMethods.has(method))
418
+ continue;
419
+ const recv = pa.getExpression();
420
+ const receiverIsPropAccess = recv.getKind() === SyntaxKind.PropertyAccessExpression;
421
+ candidates.push({
422
+ fileId,
423
+ method,
424
+ receiverIsPropAccess,
425
+ modelAccessor: receiverIsPropAccess ? recv.getName() : undefined,
426
+ recvRoot: rootIdent(recv),
427
+ recvLeaf: receiverLeafName(recv),
428
+ drizzleQueryDot: isDrizzleQueryDot(recv),
429
+ });
430
+ }
431
+ }
432
+ // Mongoose: `new Schema({...})` files are schema definitions too (the model()
433
+ // call may live elsewhere). Cheap second targeted scan, mongoose-only.
434
+ if (orms.has('mongoose')) {
435
+ for (const sf of project.getSourceFiles()) {
436
+ const fileId = toId(repoDir, sf.getFilePath());
437
+ if (!inScope(fileId, rootPath))
438
+ continue;
439
+ for (const ne of sf.getDescendantsOfKind(SyntaxKind.NewExpression)) {
440
+ if (ne.getExpression().getText() === 'Schema') {
441
+ schemaFiles.add(fileId);
442
+ break;
443
+ }
444
+ }
445
+ }
446
+ }
447
+ if (orms.has('drizzle'))
448
+ for (const c of DRIZZLE_CONVENTIONAL_CLIENTS)
449
+ drizzleClients.add(c);
450
+ // CLASSIFY — now the global gating sets are known.
451
+ for (const c of candidates) {
452
+ const verb = classify(c, orms, { prismaAccessors, drizzleClients, mongooseModels });
453
+ if (!verb)
454
+ continue;
455
+ const cur = dataAccess.get(c.fileId) ?? { reads: false, writes: false };
456
+ if (verb === 'reads')
457
+ cur.reads = true;
458
+ else
459
+ cur.writes = true;
460
+ dataAccess.set(c.fileId, cur);
461
+ }
462
+ // ROLES — collapse per file by priority (data-access > repository > migration).
463
+ const roles = new Map();
464
+ const setRole = (fileId, role) => {
465
+ const cur = roles.get(fileId);
466
+ const incoming = {
467
+ role,
468
+ kind: ROLE_KIND,
469
+ priority: ROLE_PRIORITY[role],
470
+ metadata: { framework: 'orm' },
471
+ };
472
+ if (!cur || ROLE_PRIORITY[role] > (cur.priority ?? 0))
473
+ roles.set(fileId, incoming);
474
+ };
475
+ for (const f of migrationFiles)
476
+ setRole(f, 'migration');
477
+ for (const f of schemaFiles)
478
+ setRole(f, 'repository');
479
+ for (const f of dataAccess.keys())
480
+ setRole(f, 'data-access');
481
+ const unparsedOrms = ORM_ORDER.filter((o) => orms.has(o) && o === 'sequelize');
482
+ return {
483
+ orms: ORM_ORDER.filter((o) => orms.has(o)),
484
+ entities: [...entities].sort(),
485
+ dataAccess,
486
+ schemaFiles,
487
+ migrationFiles,
488
+ roles,
489
+ diagnostics: { unparsedOrms },
490
+ };
491
+ }
492
+ // `<db>.query.<table>.<method>` — the drizzle relational-query shape. `recv` is
493
+ // the receiver of the terminal `.findMany()`/`.findFirst()` call (`db.query.x`).
494
+ function isDrizzleQueryDot(recv) {
495
+ if (recv.getKind() !== SyntaxKind.PropertyAccessExpression)
496
+ return false;
497
+ const mid = recv.getExpression(); // `db.query`
498
+ if (mid.getKind() !== SyntaxKind.PropertyAccessExpression)
499
+ return false;
500
+ return mid.getName() === 'query';
501
+ }
502
+ // TypeORM @Entity classes → entity name (decorator arg or class name) + the file
503
+ // is a schema/model definition.
504
+ function collectTypeormEntities(sf, fileId, entities, schemaFiles) {
505
+ for (const cls of sf.getClasses()) {
506
+ let isEntity = false;
507
+ let named;
508
+ for (const dec of cls.getDecorators()) {
509
+ if (dec.getName() !== 'Entity')
510
+ continue;
511
+ isEntity = true;
512
+ const arg = dec.getArguments()[0];
513
+ // `@Entity('users')` (string) or `@Entity({ name: 'users' })` (options).
514
+ named = staticString(arg) ?? entityNameFromOptions(arg);
515
+ }
516
+ if (!isEntity)
517
+ continue;
518
+ const name = named ?? cls.getName();
519
+ if (name)
520
+ entities.add(name);
521
+ schemaFiles.add(fileId);
522
+ }
523
+ }
524
+ // Read the table name from a `@Entity({ name: 'users' })` options object, or
525
+ // undefined when the arg isn't an object / has no static `name`.
526
+ function entityNameFromOptions(arg) {
527
+ if (!arg || arg.getKind() !== SyntaxKind.ObjectLiteralExpression)
528
+ return undefined;
529
+ const prop = arg.getProperty('name');
530
+ if (!prop || prop.getKind() !== SyntaxKind.PropertyAssignment)
531
+ return undefined;
532
+ return staticString(prop.getInitializer());
533
+ }
534
+ // Decide a candidate's data-access verb, or null. Returns the FIRST ORM that
535
+ // claims it (prisma → drizzle → typeorm → mongoose); no method is a read in one
536
+ // ORM and a write in another, so order only affects gating, never read-vs-write.
537
+ function classify(c, orms, gates) {
538
+ // Prisma — `client.<model>.<method>()` (a 3-level property-access call).
539
+ if (orms.has('prisma')) {
540
+ if (c.method === '$queryRaw' || c.method === '$queryRawUnsafe')
541
+ return 'reads';
542
+ if (c.method === '$executeRaw' || c.method === '$executeRawUnsafe')
543
+ return 'writes';
544
+ if (c.receiverIsPropAccess) {
545
+ const gated = (c.modelAccessor && gates.prismaAccessors.has(c.modelAccessor.toLowerCase())) || PRISMA_DISTINCTIVE.has(c.method);
546
+ if (gated) {
547
+ if (PRISMA_READ.has(c.method))
548
+ return 'reads';
549
+ if (PRISMA_WRITE.has(c.method))
550
+ return 'writes';
551
+ }
552
+ }
553
+ }
554
+ // Drizzle — gated on a known client (or the `.query.` namespace).
555
+ if (orms.has('drizzle')) {
556
+ const onClient = c.recvRoot !== undefined && gates.drizzleClients.has(c.recvRoot);
557
+ if (c.drizzleQueryDot && DRIZZLE_FIND.has(c.method) && onClient)
558
+ return 'reads';
559
+ if (onClient) {
560
+ if (DRIZZLE_READ.has(c.method))
561
+ return 'reads';
562
+ if (DRIZZLE_WRITE.has(c.method))
563
+ return 'writes';
564
+ }
565
+ }
566
+ // TypeORM — distinctive methods ungated; generic ones need a repo/manager-ish
567
+ // receiver (suppresses Array.find, etc.).
568
+ if (orms.has('typeorm')) {
569
+ const repoish = c.recvLeaf !== undefined && TYPEORM_RECV_RE.test(c.recvLeaf);
570
+ if (TYPEORM_READ.has(c.method) && (TYPEORM_DISTINCTIVE.has(c.method) || repoish))
571
+ return 'reads';
572
+ if (TYPEORM_WRITE.has(c.method) && (TYPEORM_DISTINCTIVE.has(c.method) || repoish))
573
+ return 'writes';
574
+ }
575
+ // Mongoose — gated on a known model receiver (precise; may under-detect).
576
+ if (orms.has('mongoose')) {
577
+ if (c.recvLeaf !== undefined && gates.mongooseModels.has(c.recvLeaf)) {
578
+ if (MONGOOSE_READ.has(c.method))
579
+ return 'reads';
580
+ if (MONGOOSE_WRITE.has(c.method))
581
+ return 'writes';
582
+ }
583
+ }
584
+ return null;
585
+ }
586
+ // ---------------------------------------------------------------------------
587
+ // The adapter. detect() + the roleTags hook. The datastore
588
+ // enrichment + data-access edges are an INFRA-JOIN concern (assemble.ts) — they
589
+ // are NOT a syntheticEdges contribution, because their target is the datastore
590
+ // INFRA node, which the contribute-step's code-module resolver can't reach.
591
+ const ROLE_CACHE = new WeakMap();
592
+ export const ormAdapter = {
593
+ name: 'orm',
594
+ async detect(ctx) {
595
+ const { base, rootPath } = resolveBase(ctx);
596
+ return scoreOrm(gatherOrmSignals(base), rootPath);
597
+ },
598
+ // schema/data-access/migration ROLE tags on existing code modules.
599
+ // File-id space; the generic contribute-step resolves to module ids + collapses
600
+ // to one role per module. (syntheticEdges stays ABSENT: the data-access edges go
601
+ // to the datastore infra node, drawn in the assemble infra-join, not here.)
602
+ async roleTags(ctx) {
603
+ let roles = ROLE_CACHE.get(ctx);
604
+ if (!roles) {
605
+ roles = analyzeOrmDataModel(ctx.repoDir, ctx.rootPath).roles;
606
+ ROLE_CACHE.set(ctx, roles);
607
+ }
608
+ return roles;
609
+ },
610
+ // The role pass reads SOURCE (model defs, query call sites) + the prisma schema,
611
+ // so the diff-driven hosted walk must re-run it on a relevant source/schema
612
+ // change. Never-store-source holds: read server-side, persist only roles/edges.
613
+ scansSourcePath(path) {
614
+ if (path.endsWith('.prisma'))
615
+ return true;
616
+ const ext = path.split('.').pop();
617
+ return ext !== undefined && SOURCE_EXT_SET.has(ext);
618
+ },
619
+ };
620
+ //# sourceMappingURL=orm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orm.js","sourceRoot":"","sources":["../../../src/framework/orm/orm.ts"],"names":[],"mappings":"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"}