@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,402 @@
|
|
|
1
|
+
// Pyright-driven Python structural extractor — the first non-TS
|
|
2
|
+
// GraphExtractor. Mirrors the ts-morph adapter's contract: emit FileRecords, hand
|
|
3
|
+
// them to the shared graphFromState assembler, and let everything downstream
|
|
4
|
+
// (Louvain, stabilizeModuleIds, subsystem/domain grouping, the whole enrich stage)
|
|
5
|
+
// consume the identical NormalizedGraph unchanged.
|
|
6
|
+
//
|
|
7
|
+
// INSTALL-FREE + PURE-STATIC by construction — the two locked constraints:
|
|
8
|
+
// • We drive Pyright DIRECTLY (its ImportResolver, via a Program) as the
|
|
9
|
+
// semantic tier. Pyright resolves FIRST-PARTY (in-repo) imports from workspace
|
|
10
|
+
// source with NO venv — workspace-root + `src/` + namespace-package + relative
|
|
11
|
+
// resolution all work out of the box (verified). It is pure TypeScript: no
|
|
12
|
+
// native binary, so it runs identically local + in the destroy-on-exit
|
|
13
|
+
// container.
|
|
14
|
+
// • We use `NoAccessHost`, NOT FullAccessHost — FullAccessHost shells out to the
|
|
15
|
+
// host's Python interpreter to discover search paths (a subprocess + a host
|
|
16
|
+
// dependency + non-determinism). NoAccessHost never spawns anything and never
|
|
17
|
+
// touches a venv, so resolution depends ONLY on the repo's own source — the
|
|
18
|
+
// install-free promise, enforced. The toolchain never executes repo code
|
|
19
|
+
// (no setup.py, no import of target modules, no app boot).
|
|
20
|
+
//
|
|
21
|
+
// Third-party + stdlib imports resolve to nothing under NoAccessHost (there's no
|
|
22
|
+
// venv, and stdlib typeshed isn't on the path); we then DROP stdlib names (the
|
|
23
|
+
// analogue of the ts-morph Node-builtin drop) and turn the rest into EXTERNAL
|
|
24
|
+
// nodes — exactly the ts-morph "unresolved bare specifier = external" convention.
|
|
25
|
+
// Losing third-party SYMBOL resolution is expected and fine: the module/edge graph
|
|
26
|
+
// never needed it.
|
|
27
|
+
//
|
|
28
|
+
// Import edges are the reliable backbone. Typed cross-module CALL edges (the
|
|
29
|
+
// ts-morph adapter's expensive half) need a full type-evaluator pass and degrade
|
|
30
|
+
// to nothing here — an explicit, documented best-effort gap (import-only degrade,
|
|
31
|
+
// mirroring the ts-morph try/catch), left as a clean follow-on. A pure-static
|
|
32
|
+
// path-anchored SYNTACTIC fallback recovers first-party import edges for the rare
|
|
33
|
+
// repo whose root Pyright can't infer.
|
|
34
|
+
import { readFileSync } from 'node:fs';
|
|
35
|
+
import { resolve } from 'node:path';
|
|
36
|
+
import { createFromRealFileSystem, RealTempFile } from '@zzzen/pyright-internal/dist/common/realFileSystem.js';
|
|
37
|
+
import { createServiceProvider } from '@zzzen/pyright-internal/dist/common/serviceProviderExtensions.js';
|
|
38
|
+
import { ConfigOptions } from '@zzzen/pyright-internal/dist/common/configOptions.js';
|
|
39
|
+
import { NoAccessHost } from '@zzzen/pyright-internal/dist/common/host.js';
|
|
40
|
+
import { NullConsole } from '@zzzen/pyright-internal/dist/common/console.js';
|
|
41
|
+
import { Uri } from '@zzzen/pyright-internal/dist/common/uri/uri.js';
|
|
42
|
+
import { AnalyzerService } from '@zzzen/pyright-internal/dist/analyzer/service.js';
|
|
43
|
+
import { Program } from '@zzzen/pyright-internal/dist/analyzer/program.js';
|
|
44
|
+
import { ParseTreeWalker } from '@zzzen/pyright-internal/dist/analyzer/parseTreeWalker.js';
|
|
45
|
+
import { pythonExternalIdFor } from './types.js';
|
|
46
|
+
import { graphFromState } from './file-graph.js';
|
|
47
|
+
import { listSourceFiles } from './language.js';
|
|
48
|
+
import { PYTHON_STDLIB } from './python-stdlib.js';
|
|
49
|
+
// Pyright's ImportType is a `const enum` (erased at runtime), so we can't import
|
|
50
|
+
// it from the compiled .js — pin the value locally. BuiltIn = 0, ThirdParty = 1,
|
|
51
|
+
// Local = 2 (analyzer/importResult.ts). Only `Local` is a first-party candidate.
|
|
52
|
+
const IMPORT_TYPE_LOCAL = 2;
|
|
53
|
+
// Candidate source roots the syntactic fallback anchors absolute imports against —
|
|
54
|
+
// Pyright's own default first-party roots (workspace root, then `src/`).
|
|
55
|
+
// ADDS inferred package roots on top (inferSourceRoots), so a nested backend
|
|
56
|
+
// (`backend/app/` with imports rooted at `app`) resolves when the whole polyglot
|
|
57
|
+
// repo is ingested at its true root — the -deferred item, needed to make
|
|
58
|
+
// the multi-language merge produce a legible (not one-blob) backend.
|
|
59
|
+
const FALLBACK_ROOTS = ['', 'src'];
|
|
60
|
+
/**
|
|
61
|
+
* The first-party source roots for a Python file set — every default root plus
|
|
62
|
+
* each directory that CONTAINS a top-level package (a dir with `__init__.py`
|
|
63
|
+
* whose parent is not itself a package). For `backend/app/__init__.py` the
|
|
64
|
+
* top-level package is `backend/app` and its containing root is `backend`, so
|
|
65
|
+
* `from app.x import y` resolves against `backend/app/x/y.py`. Additive: a
|
|
66
|
+
* root-layout repo already infers `''` and a src-layout `'src'` (both defaults),
|
|
67
|
+
* so single-package output is unchanged; only a NESTED package gains a root.
|
|
68
|
+
* Deterministic (sorted).
|
|
69
|
+
*/
|
|
70
|
+
export function inferSourceRoots(internalIds) {
|
|
71
|
+
const packageDirs = new Set();
|
|
72
|
+
for (const id of internalIds) {
|
|
73
|
+
if (id.endsWith('/__init__.py') || id.endsWith('/__init__.pyi')) {
|
|
74
|
+
packageDirs.add(id.slice(0, id.lastIndexOf('/')));
|
|
75
|
+
}
|
|
76
|
+
else if (id === '__init__.py' || id === '__init__.pyi') {
|
|
77
|
+
packageDirs.add('');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const roots = new Set(FALLBACK_ROOTS);
|
|
81
|
+
for (const pkgDir of packageDirs) {
|
|
82
|
+
const parent = pkgDir.includes('/') ? pkgDir.slice(0, pkgDir.lastIndexOf('/')) : '';
|
|
83
|
+
// A top-level package's parent is NOT itself a package → it's a source root.
|
|
84
|
+
if (!packageDirs.has(parent))
|
|
85
|
+
roots.add(parent);
|
|
86
|
+
}
|
|
87
|
+
return [...roots].sort();
|
|
88
|
+
}
|
|
89
|
+
/** The line-of-code count for one source file (size/centrality signal). */
|
|
90
|
+
function locOf(absPath) {
|
|
91
|
+
try {
|
|
92
|
+
const text = readFileSync(absPath, 'utf8');
|
|
93
|
+
if (text.length === 0)
|
|
94
|
+
return 0;
|
|
95
|
+
return text.split('\n').length;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Top-level (leftmost) dotted segment of an absolute module name. */
|
|
102
|
+
function topLevel(moduleName) {
|
|
103
|
+
return moduleName.replace(/^\.+/, '').split('.')[0];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Pure, path-anchored SYNTACTIC resolution — the tree-sitter-fallback role
|
|
107
|
+
* (recover the import graph from the on-disk layout) implemented over Pyright's
|
|
108
|
+
* already-parsed import name, so no second parser / native grammar is needed. Used
|
|
109
|
+
* ONLY when Pyright resolved nothing internal. Returns a repo-relative id in
|
|
110
|
+
* `internalIds`, or undefined.
|
|
111
|
+
*
|
|
112
|
+
* `importName` carries leading dots for relative imports (`.util`, `..pkg.mod`);
|
|
113
|
+
* `fromId` is the importing file's repo-relative id. Absolute names try each
|
|
114
|
+
* FALLBACK_ROOT; relative names anchor on the importing file's package, ascending
|
|
115
|
+
* one level per leading dot beyond the first.
|
|
116
|
+
*/
|
|
117
|
+
// Order candidate roots so those that are ancestor dirs of `fromId` come first
|
|
118
|
+
// (deepest — most specific — first), then the rest in their given order. A tie
|
|
119
|
+
// among non-ancestors keeps input order (deterministic). Backward-compatible: a
|
|
120
|
+
// root/`src`-layout file has only `''` as an ancestor, so the order is unchanged.
|
|
121
|
+
function orderRootsByProximity(roots, fromId) {
|
|
122
|
+
const fromDir = fromId.includes('/') ? fromId.slice(0, fromId.lastIndexOf('/')) : '';
|
|
123
|
+
const isAncestor = (r) => r === '' || fromDir === r || fromDir.startsWith(`${r}/`);
|
|
124
|
+
const ancestors = roots.filter(isAncestor).sort((a, b) => b.length - a.length);
|
|
125
|
+
const others = roots.filter((r) => !isAncestor(r));
|
|
126
|
+
return [...ancestors, ...others];
|
|
127
|
+
}
|
|
128
|
+
export function syntacticResolve(importName, fromId, internalIds, roots = FALLBACK_ROOTS) {
|
|
129
|
+
const leadingDots = importName.match(/^\.*/)?.[0].length ?? 0;
|
|
130
|
+
const rest = importName.slice(leadingDots);
|
|
131
|
+
const parts = rest.length ? rest.split('.') : [];
|
|
132
|
+
const candidateBases = [];
|
|
133
|
+
if (leadingDots === 0) {
|
|
134
|
+
// Try roots that are ANCESTORS of the importing file first (deepest first), so
|
|
135
|
+
// a `backend/app/x.py` importing `app.y` prefers its own `backend` root over a
|
|
136
|
+
// second, unrelated top-level `app/` package at the repo root.
|
|
137
|
+
for (const root of orderRootsByProximity(roots, fromId))
|
|
138
|
+
candidateBases.push(root);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Relative: start from the importing file's directory (its package), then
|
|
142
|
+
// ascend (leadingDots - 1) more levels. A `from . import x` (no parts) can't
|
|
143
|
+
// be resolved to the submodule here — Pyright's implicit-import path already
|
|
144
|
+
// covers it — so we only anchor the package dir.
|
|
145
|
+
const fromDir = fromId.includes('/') ? fromId.slice(0, fromId.lastIndexOf('/')) : '';
|
|
146
|
+
let segs = fromDir.length ? fromDir.split('/') : [];
|
|
147
|
+
const up = leadingDots - 1;
|
|
148
|
+
if (up > segs.length)
|
|
149
|
+
return undefined; // ascends past the repo root
|
|
150
|
+
segs = segs.slice(0, segs.length - up);
|
|
151
|
+
candidateBases.push(segs.join('/'));
|
|
152
|
+
}
|
|
153
|
+
if (parts.length === 0)
|
|
154
|
+
return undefined; // nothing concrete to anchor to
|
|
155
|
+
for (const base of candidateBases) {
|
|
156
|
+
const prefix = [base, ...parts].filter(Boolean).join('/');
|
|
157
|
+
for (const cand of [`${prefix}.py`, `${prefix}.pyi`, `${prefix}/__init__.py`, `${prefix}/__init__.pyi`]) {
|
|
158
|
+
if (internalIds.has(cand))
|
|
159
|
+
return cand;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
/** Build a Program over `fileIds` (repo-relative posix) rooted at `absRoot`. */
|
|
165
|
+
function buildProgram(absRoot, fileIds) {
|
|
166
|
+
const tempFile = new RealTempFile();
|
|
167
|
+
const console = new NullConsole();
|
|
168
|
+
const fs = createFromRealFileSystem(tempFile, console);
|
|
169
|
+
const serviceProvider = createServiceProvider(fs, tempFile, console);
|
|
170
|
+
const rootUri = Uri.file(absRoot, serviceProvider);
|
|
171
|
+
const config = new ConfigOptions(rootUri);
|
|
172
|
+
const host = new NoAccessHost();
|
|
173
|
+
const importResolver = AnalyzerService.createImportResolver(serviceProvider, config, host);
|
|
174
|
+
// disableChecker = true: we only need parse + import resolution, never the
|
|
175
|
+
// type checker (call-edge type-eval is out of scope; import-only degrade).
|
|
176
|
+
const program = new Program(importResolver, config, serviceProvider, undefined, true);
|
|
177
|
+
const uriById = new Map();
|
|
178
|
+
for (const id of fileIds)
|
|
179
|
+
uriById.set(id, Uri.file(`${absRoot}/${id}`, serviceProvider));
|
|
180
|
+
program.addTrackedFiles([...uriById.values()]);
|
|
181
|
+
const relOf = (uri) => {
|
|
182
|
+
const p = uri.getFilePath();
|
|
183
|
+
const prefix = `${absRoot}/`;
|
|
184
|
+
return p.startsWith(prefix) ? p.slice(prefix.length) : '';
|
|
185
|
+
};
|
|
186
|
+
return { program, uriById, relOf, dispose: () => program.dispose() };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Extract ONE Python file: resolved internal import edges + external packages.
|
|
190
|
+
* `calls` is left empty (import-only degrade — see the module header). Never
|
|
191
|
+
* throws: a file Pyright can't parse/bind degrades to no edges rather than
|
|
192
|
+
* failing the whole extraction (mirrors the ts-morph adapter's defensive posture).
|
|
193
|
+
*/
|
|
194
|
+
function extractFileRecord(fromId, imports, absRoot, internalIds, relOf, roots, callTargets) {
|
|
195
|
+
const importWeights = new Map();
|
|
196
|
+
const externalWeights = new Map();
|
|
197
|
+
const addInternal = (toId) => {
|
|
198
|
+
if (toId === fromId)
|
|
199
|
+
return; // no self-edges
|
|
200
|
+
if (!internalIds.has(toId))
|
|
201
|
+
return;
|
|
202
|
+
importWeights.set(toId, (importWeights.get(toId) ?? 0) + 1);
|
|
203
|
+
};
|
|
204
|
+
for (const imp of imports) {
|
|
205
|
+
const name = imp.importName;
|
|
206
|
+
if (!name)
|
|
207
|
+
continue;
|
|
208
|
+
// The module/package named by the import clause = the last resolved uri
|
|
209
|
+
// (Pyright returns the package chain; the leaf is the module). Plus every
|
|
210
|
+
// SUBMODULE actually pulled in by `from pkg import submod` — Python `__init__`
|
|
211
|
+
// files are usually empty (unlike TS barrels), so without these the real
|
|
212
|
+
// dependency on `submod` would be lost.
|
|
213
|
+
const internalTargets = [];
|
|
214
|
+
if (imp.isImportFound && imp.importType === IMPORT_TYPE_LOCAL) {
|
|
215
|
+
if (imp.resolvedUris.length) {
|
|
216
|
+
const leaf = relOf(imp.resolvedUris[imp.resolvedUris.length - 1]);
|
|
217
|
+
if (leaf)
|
|
218
|
+
internalTargets.push(leaf);
|
|
219
|
+
}
|
|
220
|
+
for (const uri of imp.implicitSubmoduleUris) {
|
|
221
|
+
const id = relOf(uri);
|
|
222
|
+
if (id)
|
|
223
|
+
internalTargets.push(id);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (internalTargets.length) {
|
|
227
|
+
for (const id of internalTargets)
|
|
228
|
+
addInternal(id);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
// Pyright resolved nothing internal → syntactic fallback (path-anchored).
|
|
232
|
+
const fallback = syntacticResolve(name, fromId, internalIds, roots);
|
|
233
|
+
if (fallback) {
|
|
234
|
+
addInternal(fallback);
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
// Genuinely unresolved. Relative-but-unresolved is a missing/dynamic
|
|
238
|
+
// first-party import, NOT an external (mirrors the ts-morph relative-skip).
|
|
239
|
+
// The leading dot in the module name is the authoritative signal — Pyright's
|
|
240
|
+
// `isRelative` flag is unset when the relative import didn't resolve, so a
|
|
241
|
+
// dangling `from .gone import x` would otherwise leak as `ext:gone`.
|
|
242
|
+
if (imp.isRelative || name.startsWith('.'))
|
|
243
|
+
continue;
|
|
244
|
+
const top = topLevel(name);
|
|
245
|
+
if (!top || PYTHON_STDLIB.has(top))
|
|
246
|
+
continue; // stdlib → substrate, dropped
|
|
247
|
+
const ext = pythonExternalIdFor(name);
|
|
248
|
+
const existing = externalWeights.get(ext.id);
|
|
249
|
+
if (existing)
|
|
250
|
+
existing.weight += 1;
|
|
251
|
+
else
|
|
252
|
+
externalWeights.set(ext.id, { specifier: ext.specifier, weight: 1 });
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
loc: locOf(`${absRoot}/${fromId}`),
|
|
256
|
+
language: fromId.endsWith('.pyi') ? 'pyi' : 'py',
|
|
257
|
+
imports: [...importWeights].map(([to, weight]) => ({ to, weight })),
|
|
258
|
+
externals: [...externalWeights].map(([id, v]) => ({ id, specifier: v.specifier, weight: v.weight })),
|
|
259
|
+
calls: [...callTargets].map(([to, weight]) => ({ to, weight })),
|
|
260
|
+
reexports: [],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
// typed call edges (best-effort). The ts-morph adapter's expensive
|
|
265
|
+
// half: resolve each call site's callee to its DECLARING in-repo file via
|
|
266
|
+
// Pyright's type evaluator (getDeclInfoForNameNode). This works with the CHECKER
|
|
267
|
+
// DISABLED — the evaluator resolves lazily on demand (including a method call
|
|
268
|
+
// through an inferred receiver type), so we get typed call edges WITHOUT the
|
|
269
|
+
// full-check cost (staying inside the container watchdog budget). Every
|
|
270
|
+
// resolution is wrapped defensively: an unresolvable / erroring call degrades to
|
|
271
|
+
// no edge (mirrors the ts-morph extractFileCalls try/catch — import-only fallback).
|
|
272
|
+
// Pinned ParseNodeType values (parseNodes.js const enum — Call=9, MemberAccess=35,
|
|
273
|
+
// Name=38). Kept LOCAL (the graph layer must not import the framework's py-ast).
|
|
274
|
+
const NODE_CALL = 9;
|
|
275
|
+
const NODE_MEMBER_ACCESS = 35;
|
|
276
|
+
const NODE_NAME = 38;
|
|
277
|
+
// A DETERMINISTIC per-file bound on call-site type-eval, so a pathological
|
|
278
|
+
// god-file (thousands of calls) can't blow the container watchdog. Set high
|
|
279
|
+
// enough that no ordinary file is capped; a capped file is LOGGED (no silent
|
|
280
|
+
// caps), and the whole file degrades to import-only (call resolution is
|
|
281
|
+
// best-effort). A time budget would break snapshot determinism, so we bound by
|
|
282
|
+
// count in the (stable) tree order instead.
|
|
283
|
+
const MAX_CALL_SITES_PER_FILE = 2500;
|
|
284
|
+
// Every CallNode in a module (recursive — nested calls count).
|
|
285
|
+
function collectCallNodes(tree) {
|
|
286
|
+
const out = [];
|
|
287
|
+
class Walker extends ParseTreeWalker {
|
|
288
|
+
visitCall(node) {
|
|
289
|
+
out.push(node);
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
new Walker().walk(tree);
|
|
294
|
+
return out;
|
|
295
|
+
}
|
|
296
|
+
// The callee NAME node of a call: `foo(...)` → `foo`; `obj.method(...)` → `method`.
|
|
297
|
+
// A more complex callee (a subscript / a call result) → undefined (skipped).
|
|
298
|
+
function calleeNameNode(call) {
|
|
299
|
+
const callee = call.d.leftExpr;
|
|
300
|
+
if (callee.nodeType === NODE_CALL)
|
|
301
|
+
return undefined; // chained call result
|
|
302
|
+
if (callee.nodeType === NODE_NAME)
|
|
303
|
+
return callee;
|
|
304
|
+
if (callee.nodeType === NODE_MEMBER_ACCESS) {
|
|
305
|
+
return callee.d.member;
|
|
306
|
+
}
|
|
307
|
+
return undefined;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* The internal call-edge targets (target file id → weight) for one file: each
|
|
311
|
+
* call site's callee resolved to its declaring in-repo file. Never throws — a
|
|
312
|
+
* single unresolvable call is skipped, and a broken evaluator degrades the whole
|
|
313
|
+
* file to no call edges. Self-calls (same file) + external/stdlib targets are
|
|
314
|
+
* dropped; a call resolving to several decls in ONE file counts once.
|
|
315
|
+
*/
|
|
316
|
+
export function extractCallTargets(fromId, tree, evaluator, internalIds, relOf) {
|
|
317
|
+
const weights = new Map();
|
|
318
|
+
const calls = collectCallNodes(tree);
|
|
319
|
+
if (calls.length > MAX_CALL_SITES_PER_FILE) {
|
|
320
|
+
// A god-file — bounding call-edge extraction to protect the watchdog. Degrade
|
|
321
|
+
// to import-only for it (deterministic + logged; the module is one box anyway).
|
|
322
|
+
console.log(` [python] ${fromId}: ${calls.length} call sites exceed the ${MAX_CALL_SITES_PER_FILE} cap — call edges skipped for this file (import-only)`);
|
|
323
|
+
return weights;
|
|
324
|
+
}
|
|
325
|
+
for (const call of calls) {
|
|
326
|
+
try {
|
|
327
|
+
const nameNode = calleeNameNode(call);
|
|
328
|
+
if (!nameNode)
|
|
329
|
+
continue;
|
|
330
|
+
const info = evaluator.getDeclInfoForNameNode(nameNode);
|
|
331
|
+
if (!info)
|
|
332
|
+
continue;
|
|
333
|
+
const targets = new Set();
|
|
334
|
+
for (const decl of info.decls) {
|
|
335
|
+
const toId = relOf(decl.uri);
|
|
336
|
+
if (toId && toId !== fromId && internalIds.has(toId))
|
|
337
|
+
targets.add(toId);
|
|
338
|
+
}
|
|
339
|
+
for (const t of targets)
|
|
340
|
+
weights.set(t, (weights.get(t) ?? 0) + 1);
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// this call site failed to resolve — skip it (import-only degrade).
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return weights;
|
|
347
|
+
}
|
|
348
|
+
export class PythonExtractor {
|
|
349
|
+
language = 'python';
|
|
350
|
+
async extract(repoDir) {
|
|
351
|
+
const root = resolve(repoDir);
|
|
352
|
+
const fileIds = listSourceFiles(root, 'python');
|
|
353
|
+
const internalIds = new Set(fileIds);
|
|
354
|
+
// the first-party source roots (defaults + inferred nested package
|
|
355
|
+
// roots), so a `backend/app/` package resolves when the whole repo is the root.
|
|
356
|
+
const roots = inferSourceRoots(internalIds);
|
|
357
|
+
const files = {};
|
|
358
|
+
if (fileIds.length === 0) {
|
|
359
|
+
return graphFromState(root, { headSha: '', files });
|
|
360
|
+
}
|
|
361
|
+
const { program, uriById, relOf, dispose } = buildProgram(root, fileIds);
|
|
362
|
+
try {
|
|
363
|
+
for (const id of fileIds) {
|
|
364
|
+
const uri = uriById.get(id);
|
|
365
|
+
let imports = [];
|
|
366
|
+
let callTargets = new Map();
|
|
367
|
+
try {
|
|
368
|
+
const sf = program.getBoundSourceFile(uri);
|
|
369
|
+
imports = (sf?.getImports() ?? []).map((imp) => ({
|
|
370
|
+
importName: imp.importName,
|
|
371
|
+
isImportFound: imp.isImportFound,
|
|
372
|
+
isRelative: imp.isRelative,
|
|
373
|
+
importType: imp.importType,
|
|
374
|
+
resolvedUris: imp.resolvedUris,
|
|
375
|
+
implicitSubmoduleUris: imp.filteredImplicitImports
|
|
376
|
+
? [...imp.filteredImplicitImports.values()].map((v) => v.uri)
|
|
377
|
+
: [],
|
|
378
|
+
}));
|
|
379
|
+
// typed call edges (best-effort; degrades to none on error).
|
|
380
|
+
const tree = sf?.getParserOutput()?.parseTree;
|
|
381
|
+
if (tree && program.evaluator) {
|
|
382
|
+
callTargets = extractCallTargets(id, tree, program.evaluator, internalIds, relOf);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
// parse/bind failed for this file — import-only degrade to no edges.
|
|
387
|
+
imports = [];
|
|
388
|
+
callTargets = new Map();
|
|
389
|
+
}
|
|
390
|
+
files[id] = extractFileRecord(id, imports, root, internalIds, relOf, roots, callTargets);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
finally {
|
|
394
|
+
dispose();
|
|
395
|
+
}
|
|
396
|
+
// headSha is irrelevant for a one-shot batch extract; graphFromState only
|
|
397
|
+
// reads the per-file records.
|
|
398
|
+
const state = { headSha: '', files };
|
|
399
|
+
return graphFromState(root, state);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=python-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-adapter.js","sourceRoot":"","sources":["../../src/graph/python-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** PEP 503 normalized distribution name: lowercase, runs of `-_.` → single `-`. */
|
|
2
|
+
export declare function normalizePyName(raw: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* The distribution NAME from one PEP 508 / requirements requirement line:
|
|
5
|
+
* 'fastapi[standard]>=0.1; python_version<"3.9"' → 'fastapi'
|
|
6
|
+
* 'git+https://github.com/x/y#egg=foo' → 'foo'
|
|
7
|
+
* Returns undefined for a non-name line (blank, comment, `-r`/`-e`/option, or a
|
|
8
|
+
* bare URL with no `#egg=`).
|
|
9
|
+
*/
|
|
10
|
+
export declare function requirementName(spec: string): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Every declared third-party distribution name (PEP 503 normalized) under
|
|
13
|
+
* `baseDir`, across the layouts the Python ecosystem actually uses:
|
|
14
|
+
* • PEP 621 `[project].dependencies` + `[project.optional-dependencies].*`
|
|
15
|
+
* • PEP 735 `[dependency-groups].*` (string entries)
|
|
16
|
+
* • Poetry `[tool.poetry.dependencies]`, `.dev-dependencies`, `.group.*.dependencies`
|
|
17
|
+
* • pip `requirements*.txt` in the dir
|
|
18
|
+
* Never throws. Detection asks membership (`deps.has('fastapi')`); it does not
|
|
19
|
+
* need versions, so only names are returned.
|
|
20
|
+
*/
|
|
21
|
+
export declare function readPythonDeps(baseDir: string): Set<string>;
|
|
22
|
+
//# sourceMappingURL=python-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-manifest.d.ts","sourceRoot":"","sources":["../../src/graph/python-manifest.ts"],"names":[],"mappings":"AAgBA,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAchE;AAsBD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAkD3D"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Python manifest parsing ( FastAPI detect · workspaces) —
|
|
2
|
+
// install-free + deterministic. Reads dependency + workspace declarations from
|
|
3
|
+
// pyproject.toml / requirements*.txt WITHOUT installing anything, the Python
|
|
4
|
+
// analogue of the framework detect-util `readDeps` for package.json. PURE: it
|
|
5
|
+
// touches only the manifest, never application source (never-store-source), and
|
|
6
|
+
// never spawns a resolver.
|
|
7
|
+
//
|
|
8
|
+
// TOML is parsed with `smol-toml` (already in the tree as pyright-internal's own
|
|
9
|
+
// dep; declared as a direct devDependency so a pyright bump can't drop it). A
|
|
10
|
+
// malformed manifest degrades to empty rather than throwing — a broken pyproject
|
|
11
|
+
// must never sink detection.
|
|
12
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { parse as parseToml } from 'smol-toml';
|
|
15
|
+
/** PEP 503 normalized distribution name: lowercase, runs of `-_.` → single `-`. */
|
|
16
|
+
export function normalizePyName(raw) {
|
|
17
|
+
return raw
|
|
18
|
+
.trim()
|
|
19
|
+
.toLowerCase()
|
|
20
|
+
.replace(/[-_.]+/g, '-')
|
|
21
|
+
.replace(/^-+|-+$/g, '');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The distribution NAME from one PEP 508 / requirements requirement line:
|
|
25
|
+
* 'fastapi[standard]>=0.1; python_version<"3.9"' → 'fastapi'
|
|
26
|
+
* 'git+https://github.com/x/y#egg=foo' → 'foo'
|
|
27
|
+
* Returns undefined for a non-name line (blank, comment, `-r`/`-e`/option, or a
|
|
28
|
+
* bare URL with no `#egg=`).
|
|
29
|
+
*/
|
|
30
|
+
export function requirementName(spec) {
|
|
31
|
+
let s = spec.trim();
|
|
32
|
+
if (!s || s.startsWith('#'))
|
|
33
|
+
return undefined;
|
|
34
|
+
// Strip a trailing inline comment (` #…`), then reject option/include lines.
|
|
35
|
+
const cmt = s.indexOf(' #');
|
|
36
|
+
if (cmt >= 0)
|
|
37
|
+
s = s.slice(0, cmt).trim();
|
|
38
|
+
if (!s || s.startsWith('-'))
|
|
39
|
+
return undefined;
|
|
40
|
+
// A URL/VCS requirement only names a package via `#egg=`.
|
|
41
|
+
if (s.includes('://')) {
|
|
42
|
+
const egg = /[#&]egg=([A-Za-z0-9._-]+)/.exec(s);
|
|
43
|
+
return egg ? normalizePyName(egg[1]) : undefined;
|
|
44
|
+
}
|
|
45
|
+
const m = /^([A-Za-z0-9][A-Za-z0-9._-]*)/.exec(s);
|
|
46
|
+
return m ? normalizePyName(m[1]) : undefined;
|
|
47
|
+
}
|
|
48
|
+
// A poetry-style dependency table: keys are distribution names (values are
|
|
49
|
+
// version constraints / tables). `python` is the interpreter pin, not a dep.
|
|
50
|
+
function addPoetryTableNames(table, into) {
|
|
51
|
+
if (!table || typeof table !== 'object')
|
|
52
|
+
return;
|
|
53
|
+
for (const name of Object.keys(table)) {
|
|
54
|
+
if (name.toLowerCase() === 'python')
|
|
55
|
+
continue;
|
|
56
|
+
const n = normalizePyName(name);
|
|
57
|
+
if (n)
|
|
58
|
+
into.add(n);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function addRequirementList(list, into) {
|
|
62
|
+
if (!Array.isArray(list))
|
|
63
|
+
return;
|
|
64
|
+
for (const item of list) {
|
|
65
|
+
if (typeof item !== 'string')
|
|
66
|
+
continue; // PEP 735 {include-group} entries skipped
|
|
67
|
+
const n = requirementName(item);
|
|
68
|
+
if (n)
|
|
69
|
+
into.add(n);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Every declared third-party distribution name (PEP 503 normalized) under
|
|
74
|
+
* `baseDir`, across the layouts the Python ecosystem actually uses:
|
|
75
|
+
* • PEP 621 `[project].dependencies` + `[project.optional-dependencies].*`
|
|
76
|
+
* • PEP 735 `[dependency-groups].*` (string entries)
|
|
77
|
+
* • Poetry `[tool.poetry.dependencies]`, `.dev-dependencies`, `.group.*.dependencies`
|
|
78
|
+
* • pip `requirements*.txt` in the dir
|
|
79
|
+
* Never throws. Detection asks membership (`deps.has('fastapi')`); it does not
|
|
80
|
+
* need versions, so only names are returned.
|
|
81
|
+
*/
|
|
82
|
+
export function readPythonDeps(baseDir) {
|
|
83
|
+
const names = new Set();
|
|
84
|
+
try {
|
|
85
|
+
const pyprojectPath = join(baseDir, 'pyproject.toml');
|
|
86
|
+
if (existsSync(pyprojectPath)) {
|
|
87
|
+
const t = parseToml(readFileSync(pyprojectPath, 'utf8'));
|
|
88
|
+
const project = t.project ?? {};
|
|
89
|
+
addRequirementList(project.dependencies, names);
|
|
90
|
+
const optional = project['optional-dependencies'];
|
|
91
|
+
if (optional && typeof optional === 'object') {
|
|
92
|
+
for (const grp of Object.values(optional))
|
|
93
|
+
addRequirementList(grp, names);
|
|
94
|
+
}
|
|
95
|
+
const groups = t['dependency-groups'];
|
|
96
|
+
if (groups && typeof groups === 'object') {
|
|
97
|
+
for (const grp of Object.values(groups))
|
|
98
|
+
addRequirementList(grp, names);
|
|
99
|
+
}
|
|
100
|
+
const poetry = t.tool?.poetry ?? {};
|
|
101
|
+
addPoetryTableNames(poetry.dependencies, names);
|
|
102
|
+
addPoetryTableNames(poetry['dev-dependencies'], names);
|
|
103
|
+
const poetryGroups = poetry.group;
|
|
104
|
+
if (poetryGroups && typeof poetryGroups === 'object') {
|
|
105
|
+
for (const g of Object.values(poetryGroups)) {
|
|
106
|
+
addPoetryTableNames(g?.dependencies, names);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Malformed pyproject → skip it; requirements*.txt may still name deps.
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
for (const entry of readdirSync(baseDir)) {
|
|
116
|
+
if (!/^requirements.*\.txt$/i.test(entry))
|
|
117
|
+
continue;
|
|
118
|
+
let text;
|
|
119
|
+
try {
|
|
120
|
+
text = readFileSync(join(baseDir, entry), 'utf8');
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
for (const line of text.split('\n')) {
|
|
126
|
+
const n = requirementName(line);
|
|
127
|
+
if (n)
|
|
128
|
+
names.add(n);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// baseDir unreadable — return whatever pyproject gave.
|
|
134
|
+
}
|
|
135
|
+
return names;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=python-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-manifest.js","sourceRoot":"","sources":["../../src/graph/python-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-stdlib.d.ts","sourceRoot":"","sources":["../../src/graph/python-stdlib.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,CAwC5C,CAAC"}
|