@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,17 @@
|
|
|
1
|
+
import type { DetectMatch, FrameworkAdapter } from '../types.js';
|
|
2
|
+
/** The deterministic Litestar signal set (dependency names only). */
|
|
3
|
+
export interface LitestarSignals {
|
|
4
|
+
hasLitestar: boolean;
|
|
5
|
+
hasLitestarPlugin: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** Gather the signal set for a single root dir (reads manifests only). */
|
|
8
|
+
export declare function gatherLitestarSignals(baseDir: string): LitestarSignals;
|
|
9
|
+
/**
|
|
10
|
+
* Decide Litestar from the signal set. `litestar` is REQUIRED; a `litestar-*`
|
|
11
|
+
* plugin raises confidence. Returns null → generic-Python fallthrough,
|
|
12
|
+
* byte-for-byte unchanged.
|
|
13
|
+
*/
|
|
14
|
+
export declare function scoreLitestar(s: LitestarSignals, rootPath?: string): DetectMatch | null;
|
|
15
|
+
export type LitestarRole = 'app' | 'controller' | 'route-handler' | 'provider';
|
|
16
|
+
export declare const litestarAdapter: FrameworkAdapter;
|
|
17
|
+
//# sourceMappingURL=litestar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"litestar.d.ts","sourceRoot":"","sources":["../../../src/framework/litestar/litestar.ts"],"names":[],"mappings":"AAmEA,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAOjB,MAAM,aAAa,CAAC;AAMrB,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAStE;AA6CD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,SAAK,GAAG,WAAW,GAAG,IAAI,CAYnF;AAMD,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,YAAY,GAAG,eAAe,GAAG,UAAU,CAAC;AAqc/E,eAAO,MAAM,eAAe,EAAE,gBA+C7B,CAAC"}
|
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
// the Litestar FrameworkAdapter. Net-new adapter following the FastAPI
|
|
2
|
+
// template, reusing the shared Python core (py-ast +
|
|
3
|
+
// parsePythonScope). Litestar's request surface is shaped very much like FastAPI's
|
|
4
|
+
// (module-level handlers + routers + an app object), but with three structural
|
|
5
|
+
// differences this adapter accounts for:
|
|
6
|
+
//
|
|
7
|
+
// * Route decorators are BARE imported functions (`from litestar import get`;
|
|
8
|
+
// `@get("/")`), not methods on a router object (FastAPI's `@router.get`), so
|
|
9
|
+
// handler detection keys off the decorator's imported-from-litestar identity.
|
|
10
|
+
// * Controllers are CLASSES (`class UserController(Controller)`) whose methods
|
|
11
|
+
// are the handlers — read via py-ast's shared class primitives (`classes` +
|
|
12
|
+
// `classBaseChains`, established by the ORM entity pass ).
|
|
13
|
+
// * Registration is by constructor list (`Litestar(route_handlers=[…])` /
|
|
14
|
+
// `Router(route_handlers=[…])`) or `.register(…)`, and dependency injection is
|
|
15
|
+
// layered (`dependencies={"x": Provide(fn)}` on the app / router / controller
|
|
16
|
+
// / handler) — both wirings the import graph doesn't name as verbs.
|
|
17
|
+
//
|
|
18
|
+
// All read STATICALLY (install-free, never-store-source — a pure syntactic Pyright
|
|
19
|
+
// parse; never executes repo code), persisting only the derived groups/edges/roles:
|
|
20
|
+
//
|
|
21
|
+
// * detect() — the `litestar` dependency (a `litestar-*` plugin raises
|
|
22
|
+
// confidence); shallow nested scan for a `backend/`|`server/`
|
|
23
|
+
// package (mirrors FastAPI's ).
|
|
24
|
+
// * groupingPrior — one FrameworkGroup per Controller and per Router → its own
|
|
25
|
+
// subsystem, authoritative over directory grouping (the
|
|
26
|
+
// FastAPI router / Nest @Module mechanism): the contribute-
|
|
27
|
+
// step makes each group its own subsystem.
|
|
28
|
+
// * syntheticEdges — `Litestar(route_handlers=[…])` / `Router(route_handlers=[…])`
|
|
29
|
+
// mounting + `.register(…)` (kind 'calls'), and layered
|
|
30
|
+
// `Provide(fn)` DI → consumer→provider (kind 'calls'). File-id
|
|
31
|
+
// endpoints; same-file wiring collapses (it's the role, not
|
|
32
|
+
// an edge).
|
|
33
|
+
// * roleTags — Litestar app + Controller subclass + `@get`/`@post`/… route
|
|
34
|
+
// handlers → `gateway`; a DI provider function → `service`.
|
|
35
|
+
// METADATA onto the LOCKED MODULE_KINDS enum; never a new kind
|
|
36
|
+
// (only `role` renders).
|
|
37
|
+
//
|
|
38
|
+
// Unresolvable registration / Provide targets DEGRADE + LOG — no silent caps.
|
|
39
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
40
|
+
import { join } from 'node:path';
|
|
41
|
+
import { clampConfidence, resolveBase } from '../detect-util.js';
|
|
42
|
+
import { readPythonDeps } from '../../graph/python-manifest.js';
|
|
43
|
+
import { parsePythonScope } from '../python/analyze.js';
|
|
44
|
+
import { callCallee, classAttr, classAttrString, classBaseChains, firstListString, keywordArg, listItems, memberChain, nameValue, positionalArgs, stringValue, PN, } from '../python/py-ast.js';
|
|
45
|
+
/** Gather the signal set for a single root dir (reads manifests only). */
|
|
46
|
+
export function gatherLitestarSignals(baseDir) {
|
|
47
|
+
const deps = readPythonDeps(baseDir);
|
|
48
|
+
return {
|
|
49
|
+
hasLitestar: deps.has('litestar'),
|
|
50
|
+
// A `litestar-*` plugin is a strong secondary signal that this really is a
|
|
51
|
+
// Litestar app (vs. `litestar` pulled in transitively). ASGI servers
|
|
52
|
+
// (uvicorn/granian/hypercorn) are SHARED with FastAPI, so they're not a signal.
|
|
53
|
+
hasLitestarPlugin: [...deps].some((d) => d.startsWith('litestar-')),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Non-source dirs the nested scan skips (cheap + can't hold a first-party manifest).
|
|
57
|
+
const NESTED_SKIP_DIRS = new Set([
|
|
58
|
+
'node_modules',
|
|
59
|
+
'dist',
|
|
60
|
+
'build',
|
|
61
|
+
'out',
|
|
62
|
+
'coverage',
|
|
63
|
+
'venv',
|
|
64
|
+
'.venv',
|
|
65
|
+
'__pycache__',
|
|
66
|
+
'site-packages',
|
|
67
|
+
]);
|
|
68
|
+
/** True if `dir` holds a Python manifest worth scanning for deps. */
|
|
69
|
+
function hasPythonManifest(dir) {
|
|
70
|
+
return (existsSync(join(dir, 'pyproject.toml')) ||
|
|
71
|
+
existsSync(join(dir, 'setup.py')) ||
|
|
72
|
+
existsSync(join(dir, 'setup.cfg')) ||
|
|
73
|
+
existsSync(join(dir, 'requirements.txt')));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Immediate subdirs (depth 1) that contain a Python manifest — the shallow search
|
|
77
|
+
* for a nested Litestar backend (`backend/` | `server/` | `api/`). Sorted, so the
|
|
78
|
+
* first-match pick is deterministic; skips dot-dirs + non-source dirs to stay cheap.
|
|
79
|
+
*/
|
|
80
|
+
function shallowManifestSubdirs(base) {
|
|
81
|
+
let entries;
|
|
82
|
+
try {
|
|
83
|
+
entries = readdirSync(base, { withFileTypes: true });
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
const out = [];
|
|
89
|
+
for (const e of entries) {
|
|
90
|
+
if (!e.isDirectory() || e.name.startsWith('.') || NESTED_SKIP_DIRS.has(e.name))
|
|
91
|
+
continue;
|
|
92
|
+
if (hasPythonManifest(join(base, e.name)))
|
|
93
|
+
out.push(e.name);
|
|
94
|
+
}
|
|
95
|
+
return out.sort();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Decide Litestar from the signal set. `litestar` is REQUIRED; a `litestar-*`
|
|
99
|
+
* plugin raises confidence. Returns null → generic-Python fallthrough,
|
|
100
|
+
* byte-for-byte unchanged.
|
|
101
|
+
*/
|
|
102
|
+
export function scoreLitestar(s, rootPath = '') {
|
|
103
|
+
if (!s.hasLitestar)
|
|
104
|
+
return null;
|
|
105
|
+
let confidence = 0.8;
|
|
106
|
+
if (s.hasLitestarPlugin)
|
|
107
|
+
confidence += 0.1;
|
|
108
|
+
return {
|
|
109
|
+
adapter: 'litestar',
|
|
110
|
+
confidence: clampConfidence(confidence),
|
|
111
|
+
rootPath,
|
|
112
|
+
metadata: {
|
|
113
|
+
signals: { litestar: s.hasLitestar, litestarPlugin: s.hasLitestarPlugin },
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Collapse priority when one FILE carries several roles, AND downstream when
|
|
118
|
+
// several files of different roles land in one module. app (the Litestar entry)
|
|
119
|
+
// outranks a Controller (a class that declares a domain's handlers) outranks a
|
|
120
|
+
// bare function-based route-handler; a DI provider is the lowest (a service, not
|
|
121
|
+
// a request entry). A file defining a Controller reads as `controller` even if it
|
|
122
|
+
// also holds a loose provider fn — the more informative request-surface label.
|
|
123
|
+
const ROLE_PRIORITY = {
|
|
124
|
+
app: 8,
|
|
125
|
+
controller: 7,
|
|
126
|
+
'route-handler': 6,
|
|
127
|
+
provider: 5,
|
|
128
|
+
};
|
|
129
|
+
const ROLE_KIND = {
|
|
130
|
+
app: 'gateway',
|
|
131
|
+
controller: 'gateway',
|
|
132
|
+
'route-handler': 'gateway',
|
|
133
|
+
provider: 'service',
|
|
134
|
+
};
|
|
135
|
+
// Litestar HTTP/websocket handler decorators (imported from `litestar` /
|
|
136
|
+
// `litestar.handlers`), used bare: `@get("/")`, `@route(...)`, `@websocket(...)`.
|
|
137
|
+
const HANDLER_DECORATORS = new Set([
|
|
138
|
+
'get',
|
|
139
|
+
'post',
|
|
140
|
+
'put',
|
|
141
|
+
'patch',
|
|
142
|
+
'delete',
|
|
143
|
+
'head',
|
|
144
|
+
'options',
|
|
145
|
+
'route',
|
|
146
|
+
'websocket',
|
|
147
|
+
'asgi',
|
|
148
|
+
]);
|
|
149
|
+
// Memoized on the FrameworkContext OBJECT (not repoDir) so groupingPrior +
|
|
150
|
+
// syntheticEdges + roleTags share ONE parse, while the merge walk's per-checkpoint
|
|
151
|
+
// ctx gets a fresh analysis — no cross-tree staleness. Mirrors fastapi / flask / nest.
|
|
152
|
+
const ANALYSIS_CACHE = new WeakMap();
|
|
153
|
+
function slugify(s) {
|
|
154
|
+
return s
|
|
155
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
156
|
+
.toLowerCase()
|
|
157
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
158
|
+
.replace(/^-+|-+$/g, '');
|
|
159
|
+
}
|
|
160
|
+
function humanize(s) {
|
|
161
|
+
const words = s
|
|
162
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
163
|
+
.replace(/[_\-.]+/g, ' ')
|
|
164
|
+
.trim()
|
|
165
|
+
.split(/\s+/)
|
|
166
|
+
.filter(Boolean);
|
|
167
|
+
if (words.length === 0)
|
|
168
|
+
return s;
|
|
169
|
+
return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
|
|
170
|
+
}
|
|
171
|
+
function baseName(fileId) {
|
|
172
|
+
const last = fileId.split('/').pop() ?? fileId;
|
|
173
|
+
return last.replace(/\.[^.]+$/, '');
|
|
174
|
+
}
|
|
175
|
+
function dirSegment(fileId) {
|
|
176
|
+
const slash = fileId.indexOf('/');
|
|
177
|
+
return slash > 0 ? slugify(fileId.slice(0, slash)) : 'root';
|
|
178
|
+
}
|
|
179
|
+
// Generic URL prefix segments that aren't a domain name (a leading `/api`,
|
|
180
|
+
// `/v1`, …). Skipped only on a MULTI-segment path, so a bare `path="/api"`
|
|
181
|
+
// (where 'api' IS the name) is preserved.
|
|
182
|
+
const GENERIC_PATH_SEGMENTS = new Set(['api']);
|
|
183
|
+
const isVersionSegment = (s) => /^v\d+$/.test(s);
|
|
184
|
+
// A URL path → a clean domain-name segment (`/api/tags/{id}` → 'tags',
|
|
185
|
+
// `/api` → 'api', `/` → undefined). Drops empty + parameter segments; on a
|
|
186
|
+
// multi-segment path also skips a leading generic/version prefix, so the domain
|
|
187
|
+
// segment wins over a common `/api` mount prefix.
|
|
188
|
+
function pathName(path) {
|
|
189
|
+
if (!path)
|
|
190
|
+
return undefined;
|
|
191
|
+
const segs = path.split('/').filter((s) => s && !s.startsWith('{') && !s.startsWith(':'));
|
|
192
|
+
if (segs.length === 0)
|
|
193
|
+
return undefined;
|
|
194
|
+
if (segs.length === 1)
|
|
195
|
+
return segs[0];
|
|
196
|
+
const meaningful = segs.find((s) => !GENERIC_PATH_SEGMENTS.has(s) && !isVersionSegment(s));
|
|
197
|
+
return meaningful ?? segs[segs.length - 1];
|
|
198
|
+
}
|
|
199
|
+
// Keep the highest-priority candidate role per file (deterministic, lexical
|
|
200
|
+
// tiebreak) — mirrors the fastapi/flask/nest addRole + the contribute-step collapse.
|
|
201
|
+
function addRole(map, fileId, role) {
|
|
202
|
+
const cur = map.get(fileId);
|
|
203
|
+
if (cur === undefined ||
|
|
204
|
+
ROLE_PRIORITY[role] > ROLE_PRIORITY[cur] ||
|
|
205
|
+
(ROLE_PRIORITY[role] === ROLE_PRIORITY[cur] && role < cur)) {
|
|
206
|
+
map.set(fileId, role);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function addEdge(edges, from, to, kind, relation) {
|
|
210
|
+
if (from === to)
|
|
211
|
+
return; // intra-file wiring collapses; the step drops self-edges too
|
|
212
|
+
const key = `${from}→${to}:${kind}`;
|
|
213
|
+
if (!edges.has(key)) {
|
|
214
|
+
edges.set(key, { source: from, target: to, kind, metadata: { framework: 'litestar', relation } });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// A dotted-name chain's canonical litestar symbol, or undefined (`get` via
|
|
218
|
+
// `from litestar import get`; `litestar.Controller` via `import litestar`).
|
|
219
|
+
function litestarCanonical(chain, imports) {
|
|
220
|
+
if (!chain)
|
|
221
|
+
return undefined;
|
|
222
|
+
if (chain.path.length === 0)
|
|
223
|
+
return imports.names.get(chain.root);
|
|
224
|
+
if (chain.path.length === 1 && imports.moduleAliases.has(chain.root))
|
|
225
|
+
return chain.path[0];
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
function collectLitestarImports(nodes) {
|
|
229
|
+
const names = new Map();
|
|
230
|
+
const moduleAliases = new Set();
|
|
231
|
+
for (const imp of nodes.imports) {
|
|
232
|
+
if (imp.nodeType === PN.ImportFrom) {
|
|
233
|
+
const from = imp;
|
|
234
|
+
if (from.d.module.d.leadingDots !== 0)
|
|
235
|
+
continue; // relative import — not the litestar pkg
|
|
236
|
+
const parts = from.d.module.d.nameParts.map((p) => p.d.value);
|
|
237
|
+
if (parts[0] !== 'litestar')
|
|
238
|
+
continue; // litestar / litestar.di / litestar.handlers …
|
|
239
|
+
for (const spec of from.d.imports) {
|
|
240
|
+
const imported = spec.d.name.d.value;
|
|
241
|
+
const local = spec.d.alias ? spec.d.alias.d.value : imported;
|
|
242
|
+
names.set(local, imported);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else if (imp.nodeType === PN.Import) {
|
|
246
|
+
const node = imp;
|
|
247
|
+
for (const entry of node.d.list) {
|
|
248
|
+
const parts = entry.d.module.d.nameParts.map((p) => p.d.value);
|
|
249
|
+
if (parts[0] !== 'litestar')
|
|
250
|
+
continue;
|
|
251
|
+
const local = entry.d.alias ? entry.d.alias.d.value : parts[0];
|
|
252
|
+
moduleAliases.add(local);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return { names, moduleAliases };
|
|
257
|
+
}
|
|
258
|
+
// The ctor name of an `x = Ctor(...)` RHS, resolved to its canonical litestar
|
|
259
|
+
// symbol (`Litestar` / `Router`), or undefined if the RHS isn't a litestar ctor.
|
|
260
|
+
function litestarCtor(rhs, imports) {
|
|
261
|
+
if (rhs.nodeType !== PN.Call)
|
|
262
|
+
return undefined;
|
|
263
|
+
return litestarCanonical(callCallee(rhs), imports);
|
|
264
|
+
}
|
|
265
|
+
// A decorator's callee chain (`@get(...)` → root 'get', path []; `@litestar.get(...)`
|
|
266
|
+
// → root 'litestar', path ['get']). The decorator expr is a call (route decorators
|
|
267
|
+
// are always called) or a bare name/attribute.
|
|
268
|
+
function decoratorChain(deco) {
|
|
269
|
+
const expr = deco.d.expr;
|
|
270
|
+
if (expr.nodeType === PN.Call)
|
|
271
|
+
return callCallee(expr);
|
|
272
|
+
return memberChain(expr);
|
|
273
|
+
}
|
|
274
|
+
function assignUnitGroups(seeds) {
|
|
275
|
+
const taken = new Set();
|
|
276
|
+
const byFileId = [...seeds].sort((a, b) => a.fileId < b.fileId ? -1 : a.fileId > b.fileId ? 1 : a.baseSlug < b.baseSlug ? -1 : a.baseSlug > b.baseSlug ? 1 : 0);
|
|
277
|
+
const groups = [];
|
|
278
|
+
for (const seed of byFileId) {
|
|
279
|
+
let id = seed.baseSlug;
|
|
280
|
+
if (taken.has(id))
|
|
281
|
+
id = `${seed.baseSlug}-${dirSegment(seed.fileId)}`;
|
|
282
|
+
let n = 2;
|
|
283
|
+
while (taken.has(id))
|
|
284
|
+
id = `${seed.baseSlug}-${n++}`;
|
|
285
|
+
taken.add(id);
|
|
286
|
+
groups.push({ id, label: seed.label, fileIds: [seed.fileId] });
|
|
287
|
+
}
|
|
288
|
+
return groups.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
289
|
+
}
|
|
290
|
+
function analyzeLitestar(ctx) {
|
|
291
|
+
const { parsed } = parsePythonScope(ctx);
|
|
292
|
+
// Pass 1 — per-file litestar imports + app / router variables + Controller
|
|
293
|
+
// classes (module-level singletons + class definitions, file-scoped).
|
|
294
|
+
const importsByFile = new Map();
|
|
295
|
+
const appVarsByFile = new Map();
|
|
296
|
+
const routerVarsByFile = new Map();
|
|
297
|
+
const controllersByFile = new Map();
|
|
298
|
+
// Names DEFINED locally in a file (classes / functions / assignment targets), so
|
|
299
|
+
// a same-file registration (`Litestar(route_handlers=[LocalController])`) resolves
|
|
300
|
+
// to self (a dropped self-edge), not a false "unresolvable mount".
|
|
301
|
+
const localNamesByFile = new Map();
|
|
302
|
+
for (const [id, file] of parsed) {
|
|
303
|
+
const imports = collectLitestarImports(file.nodes);
|
|
304
|
+
importsByFile.set(id, imports);
|
|
305
|
+
const appVars = new Set();
|
|
306
|
+
const routerVars = new Map();
|
|
307
|
+
const localNames = new Set();
|
|
308
|
+
for (const a of file.nodes.assignments) {
|
|
309
|
+
const target = nameValue(a.d.leftExpr);
|
|
310
|
+
if (target)
|
|
311
|
+
localNames.add(target);
|
|
312
|
+
if (!target)
|
|
313
|
+
continue;
|
|
314
|
+
const ctor = litestarCtor(a.d.rightExpr, imports);
|
|
315
|
+
if (ctor === 'Litestar')
|
|
316
|
+
appVars.add(target);
|
|
317
|
+
else if (ctor === 'Router') {
|
|
318
|
+
const call = a.d.rightExpr;
|
|
319
|
+
routerVars.set(target, { path: stringValue(keywordArg(call, 'path')), call });
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
for (const fn of file.nodes.functions) {
|
|
323
|
+
const fnName = nameValue(fn.d.name);
|
|
324
|
+
if (fnName)
|
|
325
|
+
localNames.add(fnName);
|
|
326
|
+
}
|
|
327
|
+
const controllers = [];
|
|
328
|
+
for (const cls of file.nodes.classes) {
|
|
329
|
+
const className = nameValue(cls.d.name);
|
|
330
|
+
if (className)
|
|
331
|
+
localNames.add(className);
|
|
332
|
+
// A Controller subclass: any DIRECT base resolves to litestar `Controller`.
|
|
333
|
+
const isController = classBaseChains(cls).some((b) => litestarCanonical(b, imports) === 'Controller');
|
|
334
|
+
if (isController && className) {
|
|
335
|
+
controllers.push({
|
|
336
|
+
className,
|
|
337
|
+
tag: firstListString(classAttr(cls, 'tags')),
|
|
338
|
+
path: classAttrString(cls, 'path'),
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
appVarsByFile.set(id, appVars);
|
|
343
|
+
routerVarsByFile.set(id, routerVars);
|
|
344
|
+
controllersByFile.set(id, controllers);
|
|
345
|
+
localNamesByFile.set(id, localNames);
|
|
346
|
+
}
|
|
347
|
+
// Pass 2 — roles, edges, grouping seeds.
|
|
348
|
+
const roleByFile = new Map();
|
|
349
|
+
const edges = new Map();
|
|
350
|
+
const groupSeeds = [];
|
|
351
|
+
const diag = { unresolvedMounts: new Set(), unresolvedProviders: new Set() };
|
|
352
|
+
// Resolve a registration/provider reference's ROOT name → a file id: an import
|
|
353
|
+
// binding (cross-file) else a same-file local definition (→ self). Undefined ⇒
|
|
354
|
+
// an external/unknown target (degrade + log).
|
|
355
|
+
const resolveRef = (root, thisFile, binds) => binds.get(root) ?? (localNamesByFile.get(thisFile)?.has(root) ? thisFile : undefined);
|
|
356
|
+
for (const [id, file] of parsed) {
|
|
357
|
+
const imports = importsByFile.get(id);
|
|
358
|
+
const appVars = appVarsByFile.get(id);
|
|
359
|
+
const routerVars = routerVarsByFile.get(id);
|
|
360
|
+
const controllers = controllersByFile.get(id);
|
|
361
|
+
const binds = file.bindings;
|
|
362
|
+
// Function-based route handlers: a top-level/def with a litestar handler
|
|
363
|
+
// decorator (`@get`, `@route`, …). Controller METHODS also match here, but
|
|
364
|
+
// the Controller role (below) already covers their file.
|
|
365
|
+
for (const fn of file.nodes.functions) {
|
|
366
|
+
for (const deco of fn.d.decorators) {
|
|
367
|
+
const canonical = litestarCanonical(decoratorChain(deco), imports);
|
|
368
|
+
if (canonical && HANDLER_DECORATORS.has(canonical)) {
|
|
369
|
+
addRole(roleByFile, id, 'route-handler');
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Litestar app file(s) → gateway (`app` role); Controller subclasses → gateway.
|
|
375
|
+
if (appVars.size > 0)
|
|
376
|
+
addRole(roleByFile, id, 'app');
|
|
377
|
+
if (controllers.length > 0)
|
|
378
|
+
addRole(roleByFile, id, 'controller');
|
|
379
|
+
// Grouping seeds: each Controller + each Router is its own subsystem. Name a
|
|
380
|
+
// Controller by its OpenAPI `tags=[…]` (the human group label — like FastAPI's
|
|
381
|
+
// router tags), else its path's domain segment, else its class name.
|
|
382
|
+
for (const c of controllers) {
|
|
383
|
+
const name = c.tag || pathName(c.path) || c.className;
|
|
384
|
+
groupSeeds.push({ fileId: id, baseSlug: slugify(name) || 'controller', label: humanize(name) || name });
|
|
385
|
+
}
|
|
386
|
+
for (const [varName, meta] of routerVars) {
|
|
387
|
+
const name = pathName(meta.path) || (varName !== 'router' ? varName : '') || baseName(id);
|
|
388
|
+
groupSeeds.push({ fileId: id, baseSlug: slugify(name) || 'router', label: humanize(name) || name });
|
|
389
|
+
}
|
|
390
|
+
// Registration edges from `route_handlers=[…]` on a Litestar()/Router() ctor.
|
|
391
|
+
const registrationCalls = [];
|
|
392
|
+
for (const [, meta] of routerVars)
|
|
393
|
+
registrationCalls.push({ call: meta.call, label: 'Router' });
|
|
394
|
+
// The Litestar() app ctor(s) — collected from assignments in pass 1 via appVars,
|
|
395
|
+
// but the CALL node is here in nodes.calls; match by canonical ctor.
|
|
396
|
+
for (const call of file.nodes.calls) {
|
|
397
|
+
const canonical = litestarCanonical(callCallee(call), imports);
|
|
398
|
+
if (canonical === 'Litestar')
|
|
399
|
+
registrationCalls.push({ call, label: 'Litestar' });
|
|
400
|
+
}
|
|
401
|
+
for (const { call, label } of registrationCalls) {
|
|
402
|
+
for (const item of listItems(keywordArg(call, 'route_handlers'))) {
|
|
403
|
+
const root = memberChain(item)?.root;
|
|
404
|
+
const target = root ? resolveRef(root, id, binds) : undefined;
|
|
405
|
+
if (target)
|
|
406
|
+
addEdge(edges, id, target, 'calls', 'route-handlers');
|
|
407
|
+
else if (root)
|
|
408
|
+
diag.unresolvedMounts.add(`${id}: ${label}(route_handlers=[…${root}…])`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// Registration edges from `.register(handler)` on an app/router var, and
|
|
412
|
+
// layered DI edges from `Provide(fn)` (consumer→provider). Both scanned from
|
|
413
|
+
// nodes.calls (recursive → also catches Provide inside a class-body
|
|
414
|
+
// `dependencies={…}` dict).
|
|
415
|
+
for (const call of file.nodes.calls) {
|
|
416
|
+
const callee = callCallee(call);
|
|
417
|
+
if (!callee)
|
|
418
|
+
continue;
|
|
419
|
+
if (callee.path.length === 1 && callee.path[0] === 'register' && (appVars.has(callee.root) || routerVars.has(callee.root))) {
|
|
420
|
+
const root = memberChain(positionalArgs(call)[0])?.root;
|
|
421
|
+
const target = root ? resolveRef(root, id, binds) : undefined;
|
|
422
|
+
if (target)
|
|
423
|
+
addEdge(edges, id, target, 'calls', 'register');
|
|
424
|
+
else if (root)
|
|
425
|
+
diag.unresolvedMounts.add(`${id}: ${callee.root}.register(${root})`);
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
if (callee.path.length === 0 && litestarCanonical(callee, imports) === 'Provide') {
|
|
429
|
+
const root = memberChain(positionalArgs(call)[0])?.root;
|
|
430
|
+
const providerFile = root ? resolveRef(root, id, binds) : undefined;
|
|
431
|
+
if (providerFile) {
|
|
432
|
+
addRole(roleByFile, providerFile, 'provider');
|
|
433
|
+
addEdge(edges, id, providerFile, 'calls', 'di-provider');
|
|
434
|
+
}
|
|
435
|
+
else if (root) {
|
|
436
|
+
diag.unresolvedProviders.add(`${id}: Provide(${root})`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
const groups = assignUnitGroups(groupSeeds);
|
|
442
|
+
const roles = new Map();
|
|
443
|
+
for (const [fileId, role] of roleByFile) {
|
|
444
|
+
roles.set(fileId, {
|
|
445
|
+
role,
|
|
446
|
+
kind: ROLE_KIND[role],
|
|
447
|
+
priority: ROLE_PRIORITY[role],
|
|
448
|
+
metadata: { framework: 'litestar' },
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
const sortedEdges = [...edges.values()].sort((a, b) => a.source < b.source
|
|
452
|
+
? -1
|
|
453
|
+
: a.source > b.source
|
|
454
|
+
? 1
|
|
455
|
+
: a.target < b.target
|
|
456
|
+
? -1
|
|
457
|
+
: a.target > b.target
|
|
458
|
+
? 1
|
|
459
|
+
: a.kind < b.kind
|
|
460
|
+
? -1
|
|
461
|
+
: a.kind > b.kind
|
|
462
|
+
? 1
|
|
463
|
+
: 0);
|
|
464
|
+
// Positive signal for validation (mirrors fastapi/flask/nest's log line).
|
|
465
|
+
if (groups.length > 0 || roleByFile.size > 0 || sortedEdges.length > 0) {
|
|
466
|
+
console.log(` [litestar] ${roleByFile.size} role(s) · ${groups.length} controller/router group(s) · ${sortedEdges.length} edge(s)`);
|
|
467
|
+
}
|
|
468
|
+
// No silent caps (locked): log everything that degraded.
|
|
469
|
+
if (diag.unresolvedMounts.size > 0 || diag.unresolvedProviders.size > 0) {
|
|
470
|
+
const parts = [];
|
|
471
|
+
if (diag.unresolvedMounts.size > 0) {
|
|
472
|
+
parts.push(`${diag.unresolvedMounts.size} unresolvable mount(s): ${[...diag.unresolvedMounts].sort().slice(0, 10).join(' · ')}`);
|
|
473
|
+
}
|
|
474
|
+
if (diag.unresolvedProviders.size > 0) {
|
|
475
|
+
parts.push(`${diag.unresolvedProviders.size} unresolvable provider(s): ${[...diag.unresolvedProviders].sort().slice(0, 10).join(' · ')}`);
|
|
476
|
+
}
|
|
477
|
+
console.log(` [litestar] degraded: ${parts.join(' · ')} (logged, not silently dropped)`);
|
|
478
|
+
}
|
|
479
|
+
return { groups, edges: sortedEdges, roles };
|
|
480
|
+
}
|
|
481
|
+
function getAnalysis(ctx) {
|
|
482
|
+
let a = ANALYSIS_CACHE.get(ctx);
|
|
483
|
+
if (!a) {
|
|
484
|
+
a = analyzeLitestar(ctx);
|
|
485
|
+
ANALYSIS_CACHE.set(ctx, a);
|
|
486
|
+
}
|
|
487
|
+
return a;
|
|
488
|
+
}
|
|
489
|
+
// ---------------------------------------------------------------------------
|
|
490
|
+
// The adapter.
|
|
491
|
+
export const litestarAdapter = {
|
|
492
|
+
name: 'litestar',
|
|
493
|
+
async detect(ctx) {
|
|
494
|
+
const { base, rootPath } = resolveBase(ctx);
|
|
495
|
+
// Root scan first (a repo whose manifest is at root reports rootPath '').
|
|
496
|
+
const rootMatch = scoreLitestar(gatherLitestarSignals(base), rootPath);
|
|
497
|
+
if (rootMatch)
|
|
498
|
+
return rootMatch;
|
|
499
|
+
// A Litestar backend often lives one dir down (a `backend/` | `server/` |
|
|
500
|
+
// `api/` package in a frontend+backend monorepo), so a root-only scan misses
|
|
501
|
+
// it. Shallow-scan immediate subdirs for a litestar manifest and scope to it.
|
|
502
|
+
// Only when NOT already scoped to a workspace package (the path).
|
|
503
|
+
if (!ctx.packageDir) {
|
|
504
|
+
for (const sub of shallowManifestSubdirs(base)) {
|
|
505
|
+
const m = scoreLitestar(gatherLitestarSignals(join(base, sub)), sub);
|
|
506
|
+
if (m)
|
|
507
|
+
return m;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return null;
|
|
511
|
+
},
|
|
512
|
+
// One grouping prior per Controller / Router → its own subsystem, authoritative
|
|
513
|
+
// over directory grouping (the fastapi/nest mechanism). Fully deterministic
|
|
514
|
+
// (path/name-derived) → no classificationsNeeded.
|
|
515
|
+
async groupingPrior(ctx) {
|
|
516
|
+
return { groups: getAnalysis(ctx).groups };
|
|
517
|
+
},
|
|
518
|
+
// route_handlers=[…] / .register(…) mounting + layered Provide(…) DI (kind
|
|
519
|
+
// 'calls'). File-id endpoints; the step resolves to modules, drops self-edges,
|
|
520
|
+
// dedupes, 8-verb-validates.
|
|
521
|
+
async syntheticEdges(ctx) {
|
|
522
|
+
return getAnalysis(ctx).edges;
|
|
523
|
+
},
|
|
524
|
+
// app / controller / route-handler → gateway; provider → service. METADATA; the
|
|
525
|
+
// module's `kind` is unchanged.
|
|
526
|
+
async roleTags(ctx) {
|
|
527
|
+
return getAnalysis(ctx).roles;
|
|
528
|
+
},
|
|
529
|
+
// The hooks READ SOURCE (Python). Declare the paths the diff-driven hosted walk
|
|
530
|
+
// must treat as framework-relevant. Never-store-source holds: parse server-side,
|
|
531
|
+
// persist only the derived groups/edges/roles.
|
|
532
|
+
scansSourcePath(path) {
|
|
533
|
+
return path.endsWith('.py') || path.endsWith('.pyi');
|
|
534
|
+
},
|
|
535
|
+
};
|
|
536
|
+
//# sourceMappingURL=litestar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"litestar.js","sourceRoot":"","sources":["../../../src/framework/litestar/litestar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DetectMatch, FrameworkAdapter } from '../types.js';
|
|
2
|
+
/** The deterministic NestJS signal set read from a repo (or workspace package). */
|
|
3
|
+
export interface NestSignals {
|
|
4
|
+
hasNestCoreDep: boolean;
|
|
5
|
+
hasNestCliJson: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** Gather the signal set for a single root dir (fs only). */
|
|
8
|
+
export declare function gatherNestSignals(baseDir: string): NestSignals;
|
|
9
|
+
/**
|
|
10
|
+
* Decide NestJS from the signal set. Returns a DetectMatch, or null when no
|
|
11
|
+
* signal fires (generic-TS fallthrough intact).
|
|
12
|
+
*
|
|
13
|
+
* Both signals are SUFFICIENT on their own (each is Nest-specific): the
|
|
14
|
+
* `@nestjs/core` dep, or a nest-cli.json file.
|
|
15
|
+
*/
|
|
16
|
+
export declare function scoreNest(s: NestSignals, rootPath?: string): DetectMatch | null;
|
|
17
|
+
export type NestRole = 'controller' | 'resolver' | 'guard' | 'interceptor' | 'pipe' | 'service' | 'module';
|
|
18
|
+
export declare const nestAdapter: FrameworkAdapter;
|
|
19
|
+
//# sourceMappingURL=nest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest.d.ts","sourceRoot":"","sources":["../../../src/framework/nest/nest.ts"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAOjB,MAAM,aAAa,CAAC;AAGrB,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAM9D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,SAAK,GAAG,WAAW,GAAG,IAAI,CAkB3E;AAkBD,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,UAAU,GACV,OAAO,GACP,aAAa,GACb,MAAM,GACN,SAAS,GACT,QAAQ,CAAC;AAilBb,eAAO,MAAM,WAAW,EAAE,gBAoCzB,CAAC"}
|