@zivis/cli 0.1.0-alpha.1
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/dist/commands/app/index.d.ts +10 -0
- package/dist/commands/app/index.js +245 -0
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.d.ts +2 -0
- package/dist/commands/auth/index.js +41 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +8 -0
- package/dist/commands/auth/login.js +65 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +5 -0
- package/dist/commands/auth/logout.js +14 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/sessions.d.ts +4 -0
- package/dist/commands/auth/sessions.js +30 -0
- package/dist/commands/auth/sessions.js.map +1 -0
- package/dist/commands/auth/status.d.ts +4 -0
- package/dist/commands/auth/status.js +53 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/credits/index.d.ts +2 -0
- package/dist/commands/credits/index.js +51 -0
- package/dist/commands/credits/index.js.map +1 -0
- package/dist/commands/mcp/index.d.ts +2 -0
- package/dist/commands/mcp/index.js +70 -0
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/open/index.d.ts +10 -0
- package/dist/commands/open/index.js +57 -0
- package/dist/commands/open/index.js.map +1 -0
- package/dist/commands/scan/index.d.ts +2 -0
- package/dist/commands/scan/index.js +140 -0
- package/dist/commands/scan/index.js.map +1 -0
- package/dist/commands/target/index.d.ts +2 -0
- package/dist/commands/target/index.js +146 -0
- package/dist/commands/target/index.js.map +1 -0
- package/dist/commands/tm/index.d.ts +2 -0
- package/dist/commands/tm/index.js +266 -0
- package/dist/commands/tm/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/index.d.ts +7 -0
- package/dist/internal/extractor/adapters/go/index.js +71 -0
- package/dist/internal/extractor/adapters/go/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/manifest.d.ts +37 -0
- package/dist/internal/extractor/adapters/go/manifest.js +199 -0
- package/dist/internal/extractor/adapters/go/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/go/parser.d.ts +6 -0
- package/dist/internal/extractor/adapters/go/parser.js +23 -0
- package/dist/internal/extractor/adapters/go/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/go/scanner.d.ts +39 -0
- package/dist/internal/extractor/adapters/go/scanner.js +216 -0
- package/dist/internal/extractor/adapters/go/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/python/index.d.ts +5 -0
- package/dist/internal/extractor/adapters/python/index.js +68 -0
- package/dist/internal/extractor/adapters/python/index.js.map +1 -0
- package/dist/internal/extractor/adapters/python/manifest.d.ts +25 -0
- package/dist/internal/extractor/adapters/python/manifest.js +236 -0
- package/dist/internal/extractor/adapters/python/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/python/parser.d.ts +5 -0
- package/dist/internal/extractor/adapters/python/parser.js +22 -0
- package/dist/internal/extractor/adapters/python/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/python/scanner.d.ts +37 -0
- package/dist/internal/extractor/adapters/python/scanner.js +284 -0
- package/dist/internal/extractor/adapters/python/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/index.d.ts +9 -0
- package/dist/internal/extractor/adapters/typescript/index.js +84 -0
- package/dist/internal/extractor/adapters/typescript/index.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/manifest.d.ts +41 -0
- package/dist/internal/extractor/adapters/typescript/manifest.js +156 -0
- package/dist/internal/extractor/adapters/typescript/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/parser.d.ts +14 -0
- package/dist/internal/extractor/adapters/typescript/parser.js +33 -0
- package/dist/internal/extractor/adapters/typescript/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/scanner.d.ts +43 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js +188 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js.map +1 -0
- package/dist/internal/extractor/index.d.ts +22 -0
- package/dist/internal/extractor/index.js +107 -0
- package/dist/internal/extractor/index.js.map +1 -0
- package/dist/internal/extractor/types.d.ts +124 -0
- package/dist/internal/extractor/types.js +28 -0
- package/dist/internal/extractor/types.js.map +1 -0
- package/dist/internal/extractor/walker.d.ts +32 -0
- package/dist/internal/extractor/walker.js +110 -0
- package/dist/internal/extractor/walker.js.map +1 -0
- package/dist/internal/ide-setup.d.ts +7 -0
- package/dist/internal/ide-setup.js +131 -0
- package/dist/internal/ide-setup.js.map +1 -0
- package/dist/internal/orgs.d.ts +8 -0
- package/dist/internal/orgs.js +31 -0
- package/dist/internal/orgs.js.map +1 -0
- package/dist/internal/project-binding.d.ts +11 -0
- package/dist/internal/project-binding.js +96 -0
- package/dist/internal/project-binding.js.map +1 -0
- package/dist/internal/target-auth/api-config.d.ts +37 -0
- package/dist/internal/target-auth/api-config.js +40 -0
- package/dist/internal/target-auth/api-config.js.map +1 -0
- package/dist/internal/target-auth/config.d.ts +20 -0
- package/dist/internal/target-auth/config.js +58 -0
- package/dist/internal/target-auth/config.js.map +1 -0
- package/dist/internal/target-auth/index.d.ts +30 -0
- package/dist/internal/target-auth/index.js +101 -0
- package/dist/internal/target-auth/index.js.map +1 -0
- package/dist/internal/target-auth/keychain.d.ts +23 -0
- package/dist/internal/target-auth/keychain.js +150 -0
- package/dist/internal/target-auth/keychain.js.map +1 -0
- package/dist/internal/target-auth/types.d.ts +51 -0
- package/dist/internal/target-auth/types.js +11 -0
- package/dist/internal/target-auth/types.js.map +1 -0
- package/dist/internal/target-auth/workos.d.ts +20 -0
- package/dist/internal/target-auth/workos.js +196 -0
- package/dist/internal/target-auth/workos.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript / JavaScript language adapter.
|
|
3
|
+
*
|
|
4
|
+
* Handles .ts/.tsx/.js/.jsx + package.json. Combines manifest analysis
|
|
5
|
+
* (cheap, runs against package.json) with AST scanning (per source file)
|
|
6
|
+
* to produce components, external services, and data stores.
|
|
7
|
+
*/
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import { readManifests, summarizeManifests, findExternalServices, findDataStores, detectFrameworkFromManifest, } from "./manifest.js";
|
|
10
|
+
import { scanFile, aggregate } from "./scanner.js";
|
|
11
|
+
import { repoRelative } from "../../walker.js";
|
|
12
|
+
export const typescriptAdapter = {
|
|
13
|
+
language: "typescript",
|
|
14
|
+
extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"],
|
|
15
|
+
manifests: ["package.json"],
|
|
16
|
+
async extract(input) {
|
|
17
|
+
const { rootDir, sourceFiles, manifestFiles } = input;
|
|
18
|
+
// Manifest pass — fast, runs entirely on package.json contents.
|
|
19
|
+
const parsedManifests = await readManifests(rootDir, manifestFiles);
|
|
20
|
+
const manifestSummaries = summarizeManifests(parsedManifests);
|
|
21
|
+
const manifestExternalServices = findExternalServices(parsedManifests);
|
|
22
|
+
const manifestDataStores = findDataStores(parsedManifests);
|
|
23
|
+
// AST pass — only on source files. Cap at MAX_SOURCE_FILES per run
|
|
24
|
+
// for the Phase J <60s budget on a 100k-LOC monorepo.
|
|
25
|
+
const MAX_SOURCE_FILES = 5_000;
|
|
26
|
+
const filesToScan = sourceFiles.slice(0, MAX_SOURCE_FILES);
|
|
27
|
+
const scans = await Promise.all(filesToScan.map(async (abs) => {
|
|
28
|
+
try {
|
|
29
|
+
return await scanFile(abs, repoRelative(rootDir, abs));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return { file: repoRelative(rootDir, abs), imports: [], routes: [] };
|
|
33
|
+
}
|
|
34
|
+
}));
|
|
35
|
+
const agg = aggregate(scans);
|
|
36
|
+
// Map scanner output → ExtractedComponent shape.
|
|
37
|
+
const components = agg.components.map((c) => {
|
|
38
|
+
// Best-effort framework inference: scanner picks up imports; manifest
|
|
39
|
+
// picks up the dep. Either signal counts.
|
|
40
|
+
const framework = c.framework ?? frameworkFromOwningManifest(c.sourceFile, parsedManifests);
|
|
41
|
+
return {
|
|
42
|
+
name: c.name,
|
|
43
|
+
kind: "process",
|
|
44
|
+
language: "typescript",
|
|
45
|
+
framework,
|
|
46
|
+
sourceFiles: [c.sourceFile],
|
|
47
|
+
evidence: [...c.routes, ...c.imports],
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
// Augment manifest-derived ExternalServices with AST call sites.
|
|
51
|
+
for (const svc of manifestExternalServices) {
|
|
52
|
+
const sites = agg.aiSdkCallSites.get(svc.package);
|
|
53
|
+
if (sites)
|
|
54
|
+
svc.callSites.push(...sites);
|
|
55
|
+
}
|
|
56
|
+
// Augment manifest-derived DataStores with import-evidence from source.
|
|
57
|
+
for (const store of manifestDataStores) {
|
|
58
|
+
if (!store.client)
|
|
59
|
+
continue;
|
|
60
|
+
const ev = agg.dataStoreEvidence.get(store.client);
|
|
61
|
+
if (ev)
|
|
62
|
+
store.evidence.push(...ev);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
components,
|
|
66
|
+
externalServices: manifestExternalServices,
|
|
67
|
+
dataStores: manifestDataStores,
|
|
68
|
+
manifests: manifestSummaries,
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Walk up from a source file's path to find the closest package.json
|
|
74
|
+
* we parsed; return the framework hint from that manifest.
|
|
75
|
+
*/
|
|
76
|
+
function frameworkFromOwningManifest(sourceFile, manifests) {
|
|
77
|
+
const sourceDir = path.posix.dirname(sourceFile);
|
|
78
|
+
const candidates = manifests
|
|
79
|
+
.map((m) => ({ m, dir: path.posix.dirname(m.filePath) }))
|
|
80
|
+
.filter(({ dir }) => sourceDir === dir || sourceDir.startsWith(dir + "/"))
|
|
81
|
+
.sort((a, b) => b.dir.length - a.dir.length); // closest wins
|
|
82
|
+
return candidates[0] ? detectFrameworkFromManifest(candidates[0].m) : undefined;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/typescript/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,2BAA2B,GAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQ/C,MAAM,CAAC,MAAM,iBAAiB,GAAoB;IAChD,QAAQ,EAAE,YAAY;IACtB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAC1D,SAAS,EAAE,CAAC,cAAc,CAAC;IAC3B,KAAK,CAAC,OAAO,CAAC,KAAmB;QAC/B,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;QAEtD,gEAAgE;QAChE,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACpE,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;QAC9D,MAAM,wBAAwB,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACvE,MAAM,kBAAkB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;QAE3D,mEAAmE;QACnE,sDAAsD;QACtD,MAAM,gBAAgB,GAAG,KAAK,CAAC;QAC/B,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAE7B,iDAAiD;QACjD,MAAM,UAAU,GAAyB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChE,sEAAsE;YACtE,0CAA0C;YAC1C,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,2BAA2B,CAAC,CAAC,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAC5F,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,YAAY;gBACtB,SAAS;gBACT,WAAW,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC3B,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC;aACtC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,iEAAiE;QACjE,KAAK,MAAM,GAAG,IAAI,wBAAwB,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,KAAK;gBAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC1C,CAAC;QAED,wEAAwE;QACxE,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,SAAS;YAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,EAAE;gBAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,OAAO;YACL,UAAU;YACV,gBAAgB,EAAE,wBAAwB;YAC1C,UAAU,EAAE,kBAAkB;YAC9B,SAAS,EAAE,iBAAiB;SAC7B,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,SAAS,2BAA2B,CAClC,UAAkB,EAClB,SAAoD;IAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,SAAS;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;SACxD,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,SAAS,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;SACzE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe;IAC/D,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript / JavaScript manifest analysis.
|
|
3
|
+
*
|
|
4
|
+
* Reads package.json files (root + workspaces) to classify dependencies
|
|
5
|
+
* into the categories the threat-model graph cares about. Used both for
|
|
6
|
+
* the manifests block of the output and as a hint for which AST queries
|
|
7
|
+
* are worth running on which files.
|
|
8
|
+
*/
|
|
9
|
+
import type { ExtractedExternalService, ExtractedDataStore, ManifestSummary } from "../../types.js";
|
|
10
|
+
export interface PackageJson {
|
|
11
|
+
name?: string;
|
|
12
|
+
version?: string;
|
|
13
|
+
dependencies?: Record<string, string>;
|
|
14
|
+
devDependencies?: Record<string, string>;
|
|
15
|
+
peerDependencies?: Record<string, string>;
|
|
16
|
+
workspaces?: string[] | {
|
|
17
|
+
packages?: string[];
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare const WEB_FRAMEWORK_PACKAGES: Record<string, string>;
|
|
21
|
+
export declare const DATA_STORE_PACKAGES: Record<string, {
|
|
22
|
+
kind: ExtractedDataStore["kind"];
|
|
23
|
+
client: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare const AI_SDK_PACKAGES: Record<string, string>;
|
|
26
|
+
export interface ParsedManifest {
|
|
27
|
+
filePath: string;
|
|
28
|
+
packageName?: string;
|
|
29
|
+
deps: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Read every package.json, return per-file dependency maps. Combines
|
|
33
|
+
* dependencies + devDependencies (we want both — devDeps include things
|
|
34
|
+
* like @types that signal use, plus dev-only auth packages).
|
|
35
|
+
*/
|
|
36
|
+
export declare function readManifests(rootDir: string, manifestFiles: string[]): Promise<ParsedManifest[]>;
|
|
37
|
+
export declare function summarizeManifests(parsed: ParsedManifest[]): ManifestSummary[];
|
|
38
|
+
export declare function findExternalServices(parsed: ParsedManifest[]): ExtractedExternalService[];
|
|
39
|
+
export declare function findDataStores(parsed: ParsedManifest[]): ExtractedDataStore[];
|
|
40
|
+
/** Pick the most likely web framework for a manifest's owning package. */
|
|
41
|
+
export declare function detectFrameworkFromManifest(m: ParsedManifest): string | undefined;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript / JavaScript manifest analysis.
|
|
3
|
+
*
|
|
4
|
+
* Reads package.json files (root + workspaces) to classify dependencies
|
|
5
|
+
* into the categories the threat-model graph cares about. Used both for
|
|
6
|
+
* the manifests block of the output and as a hint for which AST queries
|
|
7
|
+
* are worth running on which files.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "node:fs/promises";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
export const WEB_FRAMEWORK_PACKAGES = {
|
|
12
|
+
express: "express",
|
|
13
|
+
fastify: "fastify",
|
|
14
|
+
next: "nextjs",
|
|
15
|
+
"@trpc/server": "trpc",
|
|
16
|
+
hono: "hono",
|
|
17
|
+
koa: "koa",
|
|
18
|
+
};
|
|
19
|
+
export const DATA_STORE_PACKAGES = {
|
|
20
|
+
"@prisma/client": { kind: "postgres", client: "@prisma/client" }, // assumes postgres; could be MySQL/SQLite via schema
|
|
21
|
+
pg: { kind: "postgres", client: "pg" },
|
|
22
|
+
postgres: { kind: "postgres", client: "postgres" },
|
|
23
|
+
mongoose: { kind: "mongo", client: "mongoose" },
|
|
24
|
+
mongodb: { kind: "mongo", client: "mongodb" },
|
|
25
|
+
ioredis: { kind: "redis", client: "ioredis" },
|
|
26
|
+
redis: { kind: "redis", client: "redis" },
|
|
27
|
+
mysql2: { kind: "mysql", client: "mysql2" },
|
|
28
|
+
"better-sqlite3": { kind: "sqlite", client: "better-sqlite3" },
|
|
29
|
+
};
|
|
30
|
+
export const AI_SDK_PACKAGES = {
|
|
31
|
+
"@anthropic-ai/sdk": "Anthropic",
|
|
32
|
+
openai: "OpenAI",
|
|
33
|
+
ai: "Vercel AI SDK",
|
|
34
|
+
"@google-ai/generativelanguage": "Google Generative Language",
|
|
35
|
+
"@google/generative-ai": "Google Generative AI",
|
|
36
|
+
"@aws-sdk/client-bedrock-runtime": "AWS Bedrock",
|
|
37
|
+
langchain: "LangChain",
|
|
38
|
+
"@langchain/core": "LangChain",
|
|
39
|
+
llamaindex: "LlamaIndex",
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Read every package.json, return per-file dependency maps. Combines
|
|
43
|
+
* dependencies + devDependencies (we want both — devDeps include things
|
|
44
|
+
* like @types that signal use, plus dev-only auth packages).
|
|
45
|
+
*/
|
|
46
|
+
export async function readManifests(rootDir, manifestFiles) {
|
|
47
|
+
const out = [];
|
|
48
|
+
for (const file of manifestFiles) {
|
|
49
|
+
try {
|
|
50
|
+
const raw = await fs.readFile(file, "utf8");
|
|
51
|
+
const json = JSON.parse(raw);
|
|
52
|
+
const deps = {};
|
|
53
|
+
for (const src of [json.dependencies, json.devDependencies, json.peerDependencies]) {
|
|
54
|
+
if (!src)
|
|
55
|
+
continue;
|
|
56
|
+
for (const [k, v] of Object.entries(src))
|
|
57
|
+
deps[k] = v;
|
|
58
|
+
}
|
|
59
|
+
out.push({
|
|
60
|
+
filePath: relPosix(rootDir, file),
|
|
61
|
+
packageName: json.name,
|
|
62
|
+
deps,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Skip broken JSON; not our job to validate the customer's manifests.
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
export function summarizeManifests(parsed) {
|
|
72
|
+
return parsed.map((m) => ({
|
|
73
|
+
language: "typescript",
|
|
74
|
+
file: m.filePath,
|
|
75
|
+
dependencies: m.deps,
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
export function findExternalServices(parsed) {
|
|
79
|
+
const seen = new Map();
|
|
80
|
+
for (const m of parsed) {
|
|
81
|
+
for (const [pkg, vendor] of Object.entries(AI_SDK_PACKAGES)) {
|
|
82
|
+
const ver = m.deps[pkg];
|
|
83
|
+
if (!ver)
|
|
84
|
+
continue;
|
|
85
|
+
const key = `ai_sdk::${pkg}`;
|
|
86
|
+
const existing = seen.get(key);
|
|
87
|
+
if (existing) {
|
|
88
|
+
existing.callSites.push({ file: m.filePath, line: 1 });
|
|
89
|
+
if (!existing.version)
|
|
90
|
+
existing.version = ver;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
seen.set(key, {
|
|
94
|
+
name: vendor,
|
|
95
|
+
kind: "ai_sdk",
|
|
96
|
+
package: pkg,
|
|
97
|
+
version: ver,
|
|
98
|
+
callSites: [{ file: m.filePath, line: 1 }],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return [...seen.values()];
|
|
103
|
+
}
|
|
104
|
+
export function findDataStores(parsed) {
|
|
105
|
+
const seen = new Map();
|
|
106
|
+
for (const m of parsed) {
|
|
107
|
+
for (const [pkg, info] of Object.entries(DATA_STORE_PACKAGES)) {
|
|
108
|
+
const ver = m.deps[pkg];
|
|
109
|
+
if (!ver)
|
|
110
|
+
continue;
|
|
111
|
+
const key = `${info.kind}::${info.client}`;
|
|
112
|
+
const existing = seen.get(key);
|
|
113
|
+
if (existing) {
|
|
114
|
+
existing.evidence.push({ file: m.filePath, line: 1, kind: "config" });
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
seen.set(key, {
|
|
118
|
+
name: defaultDataStoreName(info.kind),
|
|
119
|
+
kind: info.kind,
|
|
120
|
+
client: info.client,
|
|
121
|
+
version: ver,
|
|
122
|
+
evidence: [{ file: m.filePath, line: 1, kind: "config" }],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return [...seen.values()];
|
|
127
|
+
}
|
|
128
|
+
/** Pick the most likely web framework for a manifest's owning package. */
|
|
129
|
+
export function detectFrameworkFromManifest(m) {
|
|
130
|
+
for (const [pkg, framework] of Object.entries(WEB_FRAMEWORK_PACKAGES)) {
|
|
131
|
+
if (m.deps[pkg])
|
|
132
|
+
return framework;
|
|
133
|
+
}
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
function defaultDataStoreName(kind) {
|
|
137
|
+
switch (kind) {
|
|
138
|
+
case "postgres":
|
|
139
|
+
return "postgres";
|
|
140
|
+
case "mysql":
|
|
141
|
+
return "mysql";
|
|
142
|
+
case "mongo":
|
|
143
|
+
return "mongo";
|
|
144
|
+
case "redis":
|
|
145
|
+
return "redis";
|
|
146
|
+
case "sqlite":
|
|
147
|
+
return "sqlite";
|
|
148
|
+
default:
|
|
149
|
+
return "data-store";
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function relPosix(rootDir, abs) {
|
|
153
|
+
const rel = path.relative(rootDir, abs);
|
|
154
|
+
return rel.split(path.sep).join("/");
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/typescript/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tree-sitter-typescript loader. Initializes the WASM grammar lazily and
|
|
3
|
+
* caches the parser+language for the rest of the run.
|
|
4
|
+
*
|
|
5
|
+
* @vscode/tree-sitter-wasm bundles the prebuilt .wasm files so we don't
|
|
6
|
+
* need a build step on the user's machine. Loading a .wasm grammar is
|
|
7
|
+
* O(50ms); parsing a TS file is O(low ms) per file.
|
|
8
|
+
*/
|
|
9
|
+
import { Parser } from "web-tree-sitter";
|
|
10
|
+
export declare function getParsers(): Promise<{
|
|
11
|
+
parser: Parser;
|
|
12
|
+
tsx: Parser;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function pickParserForFile(file: string, parser: Parser, tsx: Parser): Parser;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tree-sitter-typescript loader. Initializes the WASM grammar lazily and
|
|
3
|
+
* caches the parser+language for the rest of the run.
|
|
4
|
+
*
|
|
5
|
+
* @vscode/tree-sitter-wasm bundles the prebuilt .wasm files so we don't
|
|
6
|
+
* need a build step on the user's machine. Loading a .wasm grammar is
|
|
7
|
+
* O(50ms); parsing a TS file is O(low ms) per file.
|
|
8
|
+
*/
|
|
9
|
+
import { createRequire } from "node:module";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import { Parser, Language } from "web-tree-sitter";
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
let parserPromise = null;
|
|
14
|
+
export function getParsers() {
|
|
15
|
+
if (!parserPromise) {
|
|
16
|
+
parserPromise = (async () => {
|
|
17
|
+
await Parser.init();
|
|
18
|
+
const wasmDir = path.dirname(require.resolve("@vscode/tree-sitter-wasm/package.json"));
|
|
19
|
+
const tsLang = await Language.load(path.join(wasmDir, "wasm", "tree-sitter-typescript.wasm"));
|
|
20
|
+
const tsxLang = await Language.load(path.join(wasmDir, "wasm", "tree-sitter-tsx.wasm"));
|
|
21
|
+
const parser = new Parser();
|
|
22
|
+
parser.setLanguage(tsLang);
|
|
23
|
+
const tsx = new Parser();
|
|
24
|
+
tsx.setLanguage(tsxLang);
|
|
25
|
+
return { parser, tsx };
|
|
26
|
+
})();
|
|
27
|
+
}
|
|
28
|
+
return parserPromise;
|
|
29
|
+
}
|
|
30
|
+
export function pickParserForFile(file, parser, tsx) {
|
|
31
|
+
return file.endsWith(".tsx") || file.endsWith(".jsx") ? tsx : parser;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/typescript/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,IAAI,aAAa,GAAoD,IAAI,CAAC;AAE1E,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,CAAC;YACvF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC;YAC9F,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;YACxF,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACzB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAc,EAAE,GAAW;IACzE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST scanner for TypeScript / JavaScript source files.
|
|
3
|
+
*
|
|
4
|
+
* For each file: parses with tree-sitter-typescript, walks the tree
|
|
5
|
+
* looking for:
|
|
6
|
+
*
|
|
7
|
+
* 1. `import` / `require` statements naming any tracked package
|
|
8
|
+
* (AI SDKs, web frameworks, DB clients) → import-evidence + extra
|
|
9
|
+
* ExternalService call sites
|
|
10
|
+
* 2. Express-style route declarations:
|
|
11
|
+
* app.METHOD("/path", ...)
|
|
12
|
+
* router.METHOD("/path", ...)
|
|
13
|
+
* server.METHOD("/path", ...)
|
|
14
|
+
* where METHOD is one of GET/POST/PUT/DELETE/PATCH/ALL/USE
|
|
15
|
+
* → HTTP-route-evidence on a component derived from the file
|
|
16
|
+
*
|
|
17
|
+
* Privacy invariant: we only ever emit identifier names, file paths,
|
|
18
|
+
* line numbers, dependency identifiers, and HTTP method/path strings.
|
|
19
|
+
* Function bodies and inline values are never read past the first arg
|
|
20
|
+
* of a route call.
|
|
21
|
+
*/
|
|
22
|
+
import type { EvidenceLocation, Evidence, HttpRouteEvidence, ImportEvidence } from "../../types.js";
|
|
23
|
+
export interface FileScanResult {
|
|
24
|
+
file: string;
|
|
25
|
+
imports: ImportEvidence[];
|
|
26
|
+
routes: HttpRouteEvidence[];
|
|
27
|
+
}
|
|
28
|
+
export declare function scanFile(absPath: string, repoRel: string): Promise<FileScanResult>;
|
|
29
|
+
export interface ScannedAggregates {
|
|
30
|
+
/** Per-component findings (one per source file with relevant evidence). */
|
|
31
|
+
components: Array<{
|
|
32
|
+
name: string;
|
|
33
|
+
sourceFile: string;
|
|
34
|
+
framework?: string;
|
|
35
|
+
routes: HttpRouteEvidence[];
|
|
36
|
+
imports: ImportEvidence[];
|
|
37
|
+
}>;
|
|
38
|
+
/** Extra ExternalService call-site evidence beyond what the manifests gave. */
|
|
39
|
+
aiSdkCallSites: Map<string, EvidenceLocation[]>;
|
|
40
|
+
/** Extra data-store evidence (when AST shows usage of e.g. `new Pool()` etc.; v1 just imports). */
|
|
41
|
+
dataStoreEvidence: Map<string, Evidence[]>;
|
|
42
|
+
}
|
|
43
|
+
export declare function aggregate(scans: FileScanResult[]): ScannedAggregates;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST scanner for TypeScript / JavaScript source files.
|
|
3
|
+
*
|
|
4
|
+
* For each file: parses with tree-sitter-typescript, walks the tree
|
|
5
|
+
* looking for:
|
|
6
|
+
*
|
|
7
|
+
* 1. `import` / `require` statements naming any tracked package
|
|
8
|
+
* (AI SDKs, web frameworks, DB clients) → import-evidence + extra
|
|
9
|
+
* ExternalService call sites
|
|
10
|
+
* 2. Express-style route declarations:
|
|
11
|
+
* app.METHOD("/path", ...)
|
|
12
|
+
* router.METHOD("/path", ...)
|
|
13
|
+
* server.METHOD("/path", ...)
|
|
14
|
+
* where METHOD is one of GET/POST/PUT/DELETE/PATCH/ALL/USE
|
|
15
|
+
* → HTTP-route-evidence on a component derived from the file
|
|
16
|
+
*
|
|
17
|
+
* Privacy invariant: we only ever emit identifier names, file paths,
|
|
18
|
+
* line numbers, dependency identifiers, and HTTP method/path strings.
|
|
19
|
+
* Function bodies and inline values are never read past the first arg
|
|
20
|
+
* of a route call.
|
|
21
|
+
*/
|
|
22
|
+
import * as fs from "node:fs/promises";
|
|
23
|
+
import { getParsers, pickParserForFile } from "./parser.js";
|
|
24
|
+
import { AI_SDK_PACKAGES, DATA_STORE_PACKAGES, WEB_FRAMEWORK_PACKAGES, } from "./manifest.js";
|
|
25
|
+
const HTTP_METHODS = new Set(["get", "post", "put", "delete", "patch", "all", "use", "head", "options"]);
|
|
26
|
+
const ROUTER_IDENTIFIERS = new Set(["app", "router", "server", "fastify", "hono"]);
|
|
27
|
+
const TRACKED_PACKAGES = new Set([
|
|
28
|
+
...Object.keys(AI_SDK_PACKAGES),
|
|
29
|
+
...Object.keys(DATA_STORE_PACKAGES),
|
|
30
|
+
...Object.keys(WEB_FRAMEWORK_PACKAGES),
|
|
31
|
+
]);
|
|
32
|
+
export async function scanFile(absPath, repoRel) {
|
|
33
|
+
const { parser, tsx } = await getParsers();
|
|
34
|
+
const source = await fs.readFile(absPath, "utf8");
|
|
35
|
+
const p = pickParserForFile(absPath, parser, tsx);
|
|
36
|
+
const tree = p.parse(source);
|
|
37
|
+
if (!tree) {
|
|
38
|
+
return { file: repoRel, imports: [], routes: [] };
|
|
39
|
+
}
|
|
40
|
+
const imports = [];
|
|
41
|
+
const routes = [];
|
|
42
|
+
walk(tree.rootNode, (node) => {
|
|
43
|
+
if (node.type === "import_statement") {
|
|
44
|
+
const pkg = extractImportSource(node);
|
|
45
|
+
if (pkg && trackedPackageMatch(pkg)) {
|
|
46
|
+
imports.push({
|
|
47
|
+
kind: "import",
|
|
48
|
+
file: repoRel,
|
|
49
|
+
line: node.startPosition.row + 1,
|
|
50
|
+
package: pkg,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (node.type === "call_expression") {
|
|
56
|
+
const route = extractRouteCall(node);
|
|
57
|
+
if (route) {
|
|
58
|
+
routes.push({
|
|
59
|
+
kind: "http_route",
|
|
60
|
+
file: repoRel,
|
|
61
|
+
line: node.startPosition.row + 1,
|
|
62
|
+
method: route.method,
|
|
63
|
+
path: route.path,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return { file: repoRel, imports, routes };
|
|
69
|
+
}
|
|
70
|
+
function walk(node, visit) {
|
|
71
|
+
visit(node);
|
|
72
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
73
|
+
const child = node.namedChild(i);
|
|
74
|
+
if (child)
|
|
75
|
+
walk(child, visit);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Pull the string literal from `import … from "<here>"`. */
|
|
79
|
+
function extractImportSource(node) {
|
|
80
|
+
// import_statement → ... → (string (string_fragment))
|
|
81
|
+
const stringNode = node.children.find((c) => c?.type === "string");
|
|
82
|
+
if (!stringNode)
|
|
83
|
+
return null;
|
|
84
|
+
const frag = stringNode.namedChildren.find((c) => c?.type === "string_fragment");
|
|
85
|
+
return frag?.text ?? null;
|
|
86
|
+
}
|
|
87
|
+
/** Map a package import to a tracked-package identifier, allowing for sub-paths. */
|
|
88
|
+
function trackedPackageMatch(pkg) {
|
|
89
|
+
if (TRACKED_PACKAGES.has(pkg))
|
|
90
|
+
return pkg;
|
|
91
|
+
// sub-paths: "@anthropic-ai/sdk/foo" → "@anthropic-ai/sdk"
|
|
92
|
+
for (const tracked of TRACKED_PACKAGES) {
|
|
93
|
+
if (pkg.startsWith(tracked + "/"))
|
|
94
|
+
return tracked;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Identify Express-style route calls. Only inspects the AST shape; never
|
|
100
|
+
* reads the handler-function body.
|
|
101
|
+
*
|
|
102
|
+
* Matches:
|
|
103
|
+
* <ROUTER_IDENT>.<METHOD>("/path", ...)
|
|
104
|
+
*
|
|
105
|
+
* Where the second-and-onward args are deliberately ignored.
|
|
106
|
+
*/
|
|
107
|
+
function extractRouteCall(node) {
|
|
108
|
+
const fn = node.namedChildren.find((c) => c?.type === "member_expression");
|
|
109
|
+
const args = node.namedChildren.find((c) => c?.type === "arguments");
|
|
110
|
+
if (!fn || !args)
|
|
111
|
+
return null;
|
|
112
|
+
const objectNode = fn.namedChildren.find((c) => c?.type === "identifier");
|
|
113
|
+
const methodNode = fn.namedChildren.find((c) => c?.type === "property_identifier");
|
|
114
|
+
if (!objectNode || !methodNode)
|
|
115
|
+
return null;
|
|
116
|
+
const objectName = objectNode.text.toLowerCase();
|
|
117
|
+
const methodName = methodNode.text.toLowerCase();
|
|
118
|
+
if (!ROUTER_IDENTIFIERS.has(objectName))
|
|
119
|
+
return null;
|
|
120
|
+
if (!HTTP_METHODS.has(methodName))
|
|
121
|
+
return null;
|
|
122
|
+
// First arg should be a string literal — the route path.
|
|
123
|
+
const firstArg = args.namedChildren[0];
|
|
124
|
+
if (!firstArg || firstArg.type !== "string")
|
|
125
|
+
return null;
|
|
126
|
+
const frag = firstArg.namedChildren.find((c) => c?.type === "string_fragment");
|
|
127
|
+
if (!frag)
|
|
128
|
+
return null;
|
|
129
|
+
return { method: methodName.toUpperCase(), path: frag.text };
|
|
130
|
+
}
|
|
131
|
+
export function aggregate(scans) {
|
|
132
|
+
const components = [];
|
|
133
|
+
const aiSdkCallSites = new Map();
|
|
134
|
+
const dataStoreEvidence = new Map();
|
|
135
|
+
for (const s of scans) {
|
|
136
|
+
if (s.routes.length === 0 && s.imports.length === 0)
|
|
137
|
+
continue;
|
|
138
|
+
// Tag SDK call sites. Each tracked import of an AI SDK package
|
|
139
|
+
// counts as a call site for that vendor, on top of the manifest hit.
|
|
140
|
+
for (const imp of s.imports) {
|
|
141
|
+
if (AI_SDK_PACKAGES[imp.package]) {
|
|
142
|
+
const arr = aiSdkCallSites.get(imp.package) ?? [];
|
|
143
|
+
arr.push({ file: imp.file, line: imp.line });
|
|
144
|
+
aiSdkCallSites.set(imp.package, arr);
|
|
145
|
+
}
|
|
146
|
+
if (DATA_STORE_PACKAGES[imp.package]) {
|
|
147
|
+
const key = DATA_STORE_PACKAGES[imp.package].client;
|
|
148
|
+
const arr = dataStoreEvidence.get(key) ?? [];
|
|
149
|
+
arr.push({ kind: "import", file: imp.file, line: imp.line, package: imp.package });
|
|
150
|
+
dataStoreEvidence.set(key, arr);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (s.routes.length === 0)
|
|
154
|
+
continue;
|
|
155
|
+
// Derive a friendly component name from the file path (the deepest
|
|
156
|
+
// meaningful directory). e.g. src/auth/login.ts → "auth".
|
|
157
|
+
const name = deriveComponentName(s.file);
|
|
158
|
+
const framework = detectFrameworkFromImports(s.imports);
|
|
159
|
+
components.push({
|
|
160
|
+
name,
|
|
161
|
+
sourceFile: s.file,
|
|
162
|
+
framework,
|
|
163
|
+
routes: s.routes,
|
|
164
|
+
imports: s.imports,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return { components, aiSdkCallSites, dataStoreEvidence };
|
|
168
|
+
}
|
|
169
|
+
function deriveComponentName(filePath) {
|
|
170
|
+
const segs = filePath.split("/");
|
|
171
|
+
// Drop "src" / "lib" / "app" prefixes so the name is meaningful.
|
|
172
|
+
const start = ["src", "lib", "app"].includes(segs[0]) ? 1 : 0;
|
|
173
|
+
// Use the parent directory as the component (e.g. "auth"), or the
|
|
174
|
+
// filename root if the file lives at the top level.
|
|
175
|
+
if (segs.length - start >= 2)
|
|
176
|
+
return segs[start];
|
|
177
|
+
const last = segs[segs.length - 1];
|
|
178
|
+
return last.replace(/\.(t|j)sx?$/, "");
|
|
179
|
+
}
|
|
180
|
+
function detectFrameworkFromImports(imports) {
|
|
181
|
+
for (const imp of imports) {
|
|
182
|
+
const fw = WEB_FRAMEWORK_PACKAGES[imp.package];
|
|
183
|
+
if (fw)
|
|
184
|
+
return fw;
|
|
185
|
+
}
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../../../src/internal/extractor/adapters/typescript/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extractor orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* Walks the customer's repo, dispatches matched files to per-language
|
|
5
|
+
* adapters, merges their findings into a single ExtractionResult.
|
|
6
|
+
*
|
|
7
|
+
* Adapters register their own file extensions + manifest filenames; the
|
|
8
|
+
* walker only reads files those filters claim. So adding a Go or Python
|
|
9
|
+
* adapter doesn't change anything here — register the adapter and the
|
|
10
|
+
* orchestrator picks up its files.
|
|
11
|
+
*/
|
|
12
|
+
import type { ExtractionResult } from "./types.js";
|
|
13
|
+
export interface RunOptions {
|
|
14
|
+
rootDir: string;
|
|
15
|
+
/** Subset of language adapters to run; defaults to all registered. */
|
|
16
|
+
languages?: Array<"typescript" | "go" | "python">;
|
|
17
|
+
/** Extra ignore patterns from --ignore flags. */
|
|
18
|
+
extraIgnores?: string[];
|
|
19
|
+
/** Version string for the extractor — usually @zivis-ai/cli's package version. */
|
|
20
|
+
extractorVersion: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function runExtractor(opts: RunOptions): Promise<ExtractionResult>;
|