@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.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/cluster/domain-grouping.d.ts +113 -0
- package/dist/cluster/domain-grouping.d.ts.map +1 -0
- package/dist/cluster/domain-grouping.js +277 -0
- package/dist/cluster/domain-grouping.js.map +1 -0
- package/dist/cluster/grouping-gate.d.ts +54 -0
- package/dist/cluster/grouping-gate.d.ts.map +1 -0
- package/dist/cluster/grouping-gate.js +0 -0
- package/dist/cluster/grouping-gate.js.map +1 -0
- package/dist/cluster/louvain.d.ts +88 -0
- package/dist/cluster/louvain.d.ts.map +1 -0
- package/dist/cluster/louvain.js +674 -0
- package/dist/cluster/louvain.js.map +1 -0
- package/dist/cluster/overrides.d.ts +19 -0
- package/dist/cluster/overrides.d.ts.map +1 -0
- package/dist/cluster/overrides.js +32 -0
- package/dist/cluster/overrides.js.map +1 -0
- package/dist/cluster/subsystem.d.ts +45 -0
- package/dist/cluster/subsystem.d.ts.map +1 -0
- package/dist/cluster/subsystem.js +299 -0
- package/dist/cluster/subsystem.js.map +1 -0
- package/dist/cluster/workspaces.d.ts +64 -0
- package/dist/cluster/workspaces.d.ts.map +1 -0
- package/dist/cluster/workspaces.js +739 -0
- package/dist/cluster/workspaces.js.map +1 -0
- package/dist/extract.d.ts +52 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +48 -0
- package/dist/extract.js.map +1 -0
- package/dist/framework/celery/celery.d.ts +17 -0
- package/dist/framework/celery/celery.d.ts.map +1 -0
- package/dist/framework/celery/celery.js +524 -0
- package/dist/framework/celery/celery.js.map +1 -0
- package/dist/framework/contribute-step.d.ts +38 -0
- package/dist/framework/contribute-step.d.ts.map +1 -0
- package/dist/framework/contribute-step.js +403 -0
- package/dist/framework/contribute-step.js.map +1 -0
- package/dist/framework/detect-step.d.ts +8 -0
- package/dist/framework/detect-step.d.ts.map +1 -0
- package/dist/framework/detect-step.js +54 -0
- package/dist/framework/detect-step.js.map +1 -0
- package/dist/framework/detect-util.d.ts +24 -0
- package/dist/framework/detect-util.d.ts.map +1 -0
- package/dist/framework/detect-util.js +59 -0
- package/dist/framework/detect-util.js.map +1 -0
- package/dist/framework/django/django.d.ts +22 -0
- package/dist/framework/django/django.d.ts.map +1 -0
- package/dist/framework/django/django.js +940 -0
- package/dist/framework/django/django.js.map +1 -0
- package/dist/framework/fastapi/fastapi.d.ts +27 -0
- package/dist/framework/fastapi/fastapi.d.ts.map +1 -0
- package/dist/framework/fastapi/fastapi.js +477 -0
- package/dist/framework/fastapi/fastapi.js.map +1 -0
- package/dist/framework/faststream/faststream.d.ts +19 -0
- package/dist/framework/faststream/faststream.d.ts.map +1 -0
- package/dist/framework/faststream/faststream.js +765 -0
- package/dist/framework/faststream/faststream.js.map +1 -0
- package/dist/framework/flask/flask.d.ts +17 -0
- package/dist/framework/flask/flask.d.ts.map +1 -0
- package/dist/framework/flask/flask.js +507 -0
- package/dist/framework/flask/flask.js.map +1 -0
- package/dist/framework/graphql/graphql.d.ts +17 -0
- package/dist/framework/graphql/graphql.d.ts.map +1 -0
- package/dist/framework/graphql/graphql.js +708 -0
- package/dist/framework/graphql/graphql.js.map +1 -0
- package/dist/framework/grpc/grpc.d.ts +22 -0
- package/dist/framework/grpc/grpc.d.ts.map +1 -0
- package/dist/framework/grpc/grpc.js +618 -0
- package/dist/framework/grpc/grpc.js.map +1 -0
- package/dist/framework/litestar/litestar.d.ts +17 -0
- package/dist/framework/litestar/litestar.d.ts.map +1 -0
- package/dist/framework/litestar/litestar.js +536 -0
- package/dist/framework/litestar/litestar.js.map +1 -0
- package/dist/framework/nest/nest.d.ts +19 -0
- package/dist/framework/nest/nest.d.ts.map +1 -0
- package/dist/framework/nest/nest.js +613 -0
- package/dist/framework/nest/nest.js.map +1 -0
- package/dist/framework/next/next.d.ts +22 -0
- package/dist/framework/next/next.d.ts.map +1 -0
- package/dist/framework/next/next.js +449 -0
- package/dist/framework/next/next.js.map +1 -0
- package/dist/framework/node/node.d.ts +24 -0
- package/dist/framework/node/node.d.ts.map +1 -0
- package/dist/framework/node/node.js +1009 -0
- package/dist/framework/node/node.js.map +1 -0
- package/dist/framework/orchestrator/orchestrator.d.ts +34 -0
- package/dist/framework/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/framework/orchestrator/orchestrator.js +691 -0
- package/dist/framework/orchestrator/orchestrator.js.map +1 -0
- package/dist/framework/orm/orm.d.ts +61 -0
- package/dist/framework/orm/orm.d.ts.map +1 -0
- package/dist/framework/orm/orm.js +620 -0
- package/dist/framework/orm/orm.js.map +1 -0
- package/dist/framework/python/analyze.d.ts +38 -0
- package/dist/framework/python/analyze.d.ts.map +1 -0
- package/dist/framework/python/analyze.js +98 -0
- package/dist/framework/python/analyze.js.map +1 -0
- package/dist/framework/python/py-ast.d.ts +130 -0
- package/dist/framework/python/py-ast.d.ts.map +1 -0
- package/dist/framework/python/py-ast.js +344 -0
- package/dist/framework/python/py-ast.js.map +1 -0
- package/dist/framework/python-orm/python-orm.d.ts +19 -0
- package/dist/framework/python-orm/python-orm.d.ts.map +1 -0
- package/dist/framework/python-orm/python-orm.js +516 -0
- package/dist/framework/python-orm/python-orm.js.map +1 -0
- package/dist/framework/react-native/react-native.d.ts +35 -0
- package/dist/framework/react-native/react-native.d.ts.map +1 -0
- package/dist/framework/react-native/react-native.js +1181 -0
- package/dist/framework/react-native/react-native.js.map +1 -0
- package/dist/framework/register.d.ts +2 -0
- package/dist/framework/register.d.ts.map +1 -0
- package/dist/framework/register.js +59 -0
- package/dist/framework/register.js.map +1 -0
- package/dist/framework/registry.d.ts +31 -0
- package/dist/framework/registry.d.ts.map +1 -0
- package/dist/framework/registry.js +70 -0
- package/dist/framework/registry.js.map +1 -0
- package/dist/framework/routing/expo-router.d.ts +31 -0
- package/dist/framework/routing/expo-router.d.ts.map +1 -0
- package/dist/framework/routing/expo-router.js +356 -0
- package/dist/framework/routing/expo-router.js.map +1 -0
- package/dist/framework/routing/index.d.ts +4 -0
- package/dist/framework/routing/index.d.ts.map +1 -0
- package/dist/framework/routing/index.js +16 -0
- package/dist/framework/routing/index.js.map +1 -0
- package/dist/framework/routing/next-router.d.ts +45 -0
- package/dist/framework/routing/next-router.d.ts.map +1 -0
- package/dist/framework/routing/next-router.js +378 -0
- package/dist/framework/routing/next-router.js.map +1 -0
- package/dist/framework/routing/route-tree.d.ts +73 -0
- package/dist/framework/routing/route-tree.d.ts.map +1 -0
- package/dist/framework/routing/route-tree.js +120 -0
- package/dist/framework/routing/route-tree.js.map +1 -0
- package/dist/framework/types.d.ts +230 -0
- package/dist/framework/types.d.ts.map +1 -0
- package/dist/framework/types.js +25 -0
- package/dist/framework/types.js.map +1 -0
- package/dist/graph/cross-language.d.ts +11 -0
- package/dist/graph/cross-language.d.ts.map +1 -0
- package/dist/graph/cross-language.js +123 -0
- package/dist/graph/cross-language.js.map +1 -0
- package/dist/graph/extract.d.ts +13 -0
- package/dist/graph/extract.d.ts.map +1 -0
- package/dist/graph/extract.js +79 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/file-graph.d.ts +186 -0
- package/dist/graph/file-graph.d.ts.map +1 -0
- package/dist/graph/file-graph.js +427 -0
- package/dist/graph/file-graph.js.map +1 -0
- package/dist/graph/http-callsites.d.ts +14 -0
- package/dist/graph/http-callsites.d.ts.map +1 -0
- package/dist/graph/http-callsites.js +107 -0
- package/dist/graph/http-callsites.js.map +1 -0
- package/dist/graph/incremental.d.ts +122 -0
- package/dist/graph/incremental.d.ts.map +1 -0
- package/dist/graph/incremental.js +448 -0
- package/dist/graph/incremental.js.map +1 -0
- package/dist/graph/language.d.ts +31 -0
- package/dist/graph/language.d.ts.map +1 -0
- package/dist/graph/language.js +146 -0
- package/dist/graph/language.js.map +1 -0
- package/dist/graph/noise-filter.d.ts +46 -0
- package/dist/graph/noise-filter.d.ts.map +1 -0
- package/dist/graph/noise-filter.js +199 -0
- package/dist/graph/noise-filter.js.map +1 -0
- package/dist/graph/python-adapter.d.ts +36 -0
- package/dist/graph/python-adapter.d.ts.map +1 -0
- package/dist/graph/python-adapter.js +402 -0
- package/dist/graph/python-adapter.js.map +1 -0
- package/dist/graph/python-manifest.d.ts +22 -0
- package/dist/graph/python-manifest.d.ts.map +1 -0
- package/dist/graph/python-manifest.js +137 -0
- package/dist/graph/python-manifest.js.map +1 -0
- package/dist/graph/python-stdlib.d.ts +2 -0
- package/dist/graph/python-stdlib.d.ts.map +1 -0
- package/dist/graph/python-stdlib.js +53 -0
- package/dist/graph/python-stdlib.js.map +1 -0
- package/dist/graph/ts-morph-adapter.d.ts +65 -0
- package/dist/graph/ts-morph-adapter.d.ts.map +1 -0
- package/dist/graph/ts-morph-adapter.js +265 -0
- package/dist/graph/ts-morph-adapter.js.map +1 -0
- package/dist/graph/types.d.ts +37 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +50 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/aws/aws-parse.d.ts +39 -0
- package/dist/infra/aws/aws-parse.d.ts.map +1 -0
- package/dist/infra/aws/aws-parse.js +149 -0
- package/dist/infra/aws/aws-parse.js.map +1 -0
- package/dist/infra/aws/aws.d.ts +6 -0
- package/dist/infra/aws/aws.d.ts.map +1 -0
- package/dist/infra/aws/aws.js +425 -0
- package/dist/infra/aws/aws.js.map +1 -0
- package/dist/infra/azure/azure-parse.d.ts +73 -0
- package/dist/infra/azure/azure-parse.d.ts.map +1 -0
- package/dist/infra/azure/azure-parse.js +178 -0
- package/dist/infra/azure/azure-parse.js.map +1 -0
- package/dist/infra/azure/azure.d.ts +12 -0
- package/dist/infra/azure/azure.d.ts.map +1 -0
- package/dist/infra/azure/azure.js +673 -0
- package/dist/infra/azure/azure.js.map +1 -0
- package/dist/infra/cloudflare/cloudflare.d.ts +50 -0
- package/dist/infra/cloudflare/cloudflare.d.ts.map +1 -0
- package/dist/infra/cloudflare/cloudflare.js +382 -0
- package/dist/infra/cloudflare/cloudflare.js.map +1 -0
- package/dist/infra/cloudflare/wrangler-parse.d.ts +6 -0
- package/dist/infra/cloudflare/wrangler-parse.d.ts.map +1 -0
- package/dist/infra/cloudflare/wrangler-parse.js +278 -0
- package/dist/infra/cloudflare/wrangler-parse.js.map +1 -0
- package/dist/infra/compose/compose-parse.d.ts +24 -0
- package/dist/infra/compose/compose-parse.d.ts.map +1 -0
- package/dist/infra/compose/compose-parse.js +77 -0
- package/dist/infra/compose/compose-parse.js.map +1 -0
- package/dist/infra/compose/compose.d.ts +12 -0
- package/dist/infra/compose/compose.d.ts.map +1 -0
- package/dist/infra/compose/compose.js +201 -0
- package/dist/infra/compose/compose.js.map +1 -0
- package/dist/infra/convex/convex-parse.d.ts +28 -0
- package/dist/infra/convex/convex-parse.d.ts.map +1 -0
- package/dist/infra/convex/convex-parse.js +74 -0
- package/dist/infra/convex/convex-parse.js.map +1 -0
- package/dist/infra/convex/convex.d.ts +18 -0
- package/dist/infra/convex/convex.d.ts.map +1 -0
- package/dist/infra/convex/convex.js +199 -0
- package/dist/infra/convex/convex.js.map +1 -0
- package/dist/infra/digitalocean/digitalocean.d.ts +33 -0
- package/dist/infra/digitalocean/digitalocean.d.ts.map +1 -0
- package/dist/infra/digitalocean/digitalocean.js +204 -0
- package/dist/infra/digitalocean/digitalocean.js.map +1 -0
- package/dist/infra/firebase/firebase.d.ts +43 -0
- package/dist/infra/firebase/firebase.d.ts.map +1 -0
- package/dist/infra/firebase/firebase.js +271 -0
- package/dist/infra/firebase/firebase.js.map +1 -0
- package/dist/infra/fly/fly-parse.d.ts +52 -0
- package/dist/infra/fly/fly-parse.d.ts.map +1 -0
- package/dist/infra/fly/fly-parse.js +114 -0
- package/dist/infra/fly/fly-parse.js.map +1 -0
- package/dist/infra/fly/fly.d.ts +15 -0
- package/dist/infra/fly/fly.d.ts.map +1 -0
- package/dist/infra/fly/fly.js +265 -0
- package/dist/infra/fly/fly.js.map +1 -0
- package/dist/infra/gcp/gcp-parse.d.ts +24 -0
- package/dist/infra/gcp/gcp-parse.d.ts.map +1 -0
- package/dist/infra/gcp/gcp-parse.js +123 -0
- package/dist/infra/gcp/gcp-parse.js.map +1 -0
- package/dist/infra/gcp/gcp.d.ts +10 -0
- package/dist/infra/gcp/gcp.d.ts.map +1 -0
- package/dist/infra/gcp/gcp.js +502 -0
- package/dist/infra/gcp/gcp.js.map +1 -0
- package/dist/infra/heroku/heroku-parse.d.ts +33 -0
- package/dist/infra/heroku/heroku-parse.d.ts.map +1 -0
- package/dist/infra/heroku/heroku-parse.js +63 -0
- package/dist/infra/heroku/heroku-parse.js.map +1 -0
- package/dist/infra/heroku/heroku.d.ts +24 -0
- package/dist/infra/heroku/heroku.d.ts.map +1 -0
- package/dist/infra/heroku/heroku.js +253 -0
- package/dist/infra/heroku/heroku.js.map +1 -0
- package/dist/infra/image-resolve.d.ts +56 -0
- package/dist/infra/image-resolve.d.ts.map +1 -0
- package/dist/infra/image-resolve.js +229 -0
- package/dist/infra/image-resolve.js.map +1 -0
- package/dist/infra/infra-step.d.ts +39 -0
- package/dist/infra/infra-step.d.ts.map +1 -0
- package/dist/infra/infra-step.js +57 -0
- package/dist/infra/infra-step.js.map +1 -0
- package/dist/infra/k8s/index.d.ts +78 -0
- package/dist/infra/k8s/index.d.ts.map +1 -0
- package/dist/infra/k8s/index.js +251 -0
- package/dist/infra/k8s/index.js.map +1 -0
- package/dist/infra/kamal/kamal-parse.d.ts +23 -0
- package/dist/infra/kamal/kamal-parse.d.ts.map +1 -0
- package/dist/infra/kamal/kamal-parse.js +66 -0
- package/dist/infra/kamal/kamal-parse.js.map +1 -0
- package/dist/infra/kamal/kamal.d.ts +17 -0
- package/dist/infra/kamal/kamal.d.ts.map +1 -0
- package/dist/infra/kamal/kamal.js +162 -0
- package/dist/infra/kamal/kamal.js.map +1 -0
- package/dist/infra/netlify/netlify.d.ts +33 -0
- package/dist/infra/netlify/netlify.d.ts.map +1 -0
- package/dist/infra/netlify/netlify.js +247 -0
- package/dist/infra/netlify/netlify.js.map +1 -0
- package/dist/infra/opentofu/opentofu.d.ts +3 -0
- package/dist/infra/opentofu/opentofu.d.ts.map +1 -0
- package/dist/infra/opentofu/opentofu.js +157 -0
- package/dist/infra/opentofu/opentofu.js.map +1 -0
- package/dist/infra/pulumi/pulumi-parse.d.ts +60 -0
- package/dist/infra/pulumi/pulumi-parse.d.ts.map +1 -0
- package/dist/infra/pulumi/pulumi-parse.js +155 -0
- package/dist/infra/pulumi/pulumi-parse.js.map +1 -0
- package/dist/infra/pulumi/pulumi.d.ts +23 -0
- package/dist/infra/pulumi/pulumi.d.ts.map +1 -0
- package/dist/infra/pulumi/pulumi.js +260 -0
- package/dist/infra/pulumi/pulumi.js.map +1 -0
- package/dist/infra/railway/railway-parse.d.ts +54 -0
- package/dist/infra/railway/railway-parse.d.ts.map +1 -0
- package/dist/infra/railway/railway-parse.js +200 -0
- package/dist/infra/railway/railway-parse.js.map +1 -0
- package/dist/infra/railway/railway.d.ts +19 -0
- package/dist/infra/railway/railway.d.ts.map +1 -0
- package/dist/infra/railway/railway.js +397 -0
- package/dist/infra/railway/railway.js.map +1 -0
- package/dist/infra/register.d.ts +2 -0
- package/dist/infra/register.d.ts.map +1 -0
- package/dist/infra/register.js +81 -0
- package/dist/infra/register.js.map +1 -0
- package/dist/infra/registry.d.ts +64 -0
- package/dist/infra/registry.d.ts.map +1 -0
- package/dist/infra/registry.js +205 -0
- package/dist/infra/registry.js.map +1 -0
- package/dist/infra/relevance.d.ts +16 -0
- package/dist/infra/relevance.d.ts.map +1 -0
- package/dist/infra/relevance.js +132 -0
- package/dist/infra/relevance.js.map +1 -0
- package/dist/infra/render/render-parse.d.ts +76 -0
- package/dist/infra/render/render-parse.d.ts.map +1 -0
- package/dist/infra/render/render-parse.js +155 -0
- package/dist/infra/render/render-parse.js.map +1 -0
- package/dist/infra/render/render.d.ts +11 -0
- package/dist/infra/render/render.d.ts.map +1 -0
- package/dist/infra/render/render.js +303 -0
- package/dist/infra/render/render.js.map +1 -0
- package/dist/infra/sst/sst-parse.d.ts +25 -0
- package/dist/infra/sst/sst-parse.d.ts.map +1 -0
- package/dist/infra/sst/sst-parse.js +45 -0
- package/dist/infra/sst/sst-parse.js.map +1 -0
- package/dist/infra/sst/sst.d.ts +19 -0
- package/dist/infra/sst/sst.d.ts.map +1 -0
- package/dist/infra/sst/sst.js +236 -0
- package/dist/infra/sst/sst.js.map +1 -0
- package/dist/infra/supabase/supabase-parse.d.ts +34 -0
- package/dist/infra/supabase/supabase-parse.d.ts.map +1 -0
- package/dist/infra/supabase/supabase-parse.js +113 -0
- package/dist/infra/supabase/supabase-parse.js.map +1 -0
- package/dist/infra/supabase/supabase.d.ts +15 -0
- package/dist/infra/supabase/supabase.d.ts.map +1 -0
- package/dist/infra/supabase/supabase.js +198 -0
- package/dist/infra/supabase/supabase.js.map +1 -0
- package/dist/infra/terraform/hcl-parse.d.ts +34 -0
- package/dist/infra/terraform/hcl-parse.d.ts.map +1 -0
- package/dist/infra/terraform/hcl-parse.js +203 -0
- package/dist/infra/terraform/hcl-parse.js.map +1 -0
- package/dist/infra/terraform/terraform.d.ts +14 -0
- package/dist/infra/terraform/terraform.d.ts.map +1 -0
- package/dist/infra/terraform/terraform.js +264 -0
- package/dist/infra/terraform/terraform.js.map +1 -0
- package/dist/infra/types.d.ts +151 -0
- package/dist/infra/types.d.ts.map +1 -0
- package/dist/infra/types.js +14 -0
- package/dist/infra/types.js.map +1 -0
- package/dist/infra/vercel/vercel-parse.d.ts +70 -0
- package/dist/infra/vercel/vercel-parse.d.ts.map +1 -0
- package/dist/infra/vercel/vercel-parse.js +194 -0
- package/dist/infra/vercel/vercel-parse.js.map +1 -0
- package/dist/infra/vercel/vercel.d.ts +30 -0
- package/dist/infra/vercel/vercel.d.ts.map +1 -0
- package/dist/infra/vercel/vercel.js +523 -0
- package/dist/infra/vercel/vercel.js.map +1 -0
- package/dist/infra/walk.d.ts +36 -0
- package/dist/infra/walk.d.ts.map +1 -0
- package/dist/infra/walk.js +85 -0
- package/dist/infra/walk.js.map +1 -0
- package/dist/safety.d.ts +13 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +67 -0
- package/dist/safety.js.map +1 -0
- package/dist/types.d.ts +47 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +111 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +35 -0
- package/dist/version.js.map +1 -0
- 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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"}
|