archmantic 1.0.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 +202 -0
- package/README.md +172 -0
- package/dist/agent.d.ts +20 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +239 -0
- package/dist/agent.js.map +1 -0
- package/dist/analyze/datamodel.d.ts +9 -0
- package/dist/analyze/datamodel.d.ts.map +1 -0
- package/dist/analyze/datamodel.js +19 -0
- package/dist/analyze/datamodel.js.map +1 -0
- package/dist/analyze/derive.d.ts +21 -0
- package/dist/analyze/derive.d.ts.map +1 -0
- package/dist/analyze/derive.js +211 -0
- package/dist/analyze/derive.js.map +1 -0
- package/dist/analyze/drizzle.d.ts +3 -0
- package/dist/analyze/drizzle.d.ts.map +1 -0
- package/dist/analyze/drizzle.js +83 -0
- package/dist/analyze/drizzle.js.map +1 -0
- package/dist/analyze/endpoints.d.ts +3 -0
- package/dist/analyze/endpoints.d.ts.map +1 -0
- package/dist/analyze/endpoints.js +167 -0
- package/dist/analyze/endpoints.js.map +1 -0
- package/dist/analyze/fs-util.d.ts +3 -0
- package/dist/analyze/fs-util.d.ts.map +1 -0
- package/dist/analyze/fs-util.js +44 -0
- package/dist/analyze/fs-util.js.map +1 -0
- package/dist/analyze/incremental.d.ts +12 -0
- package/dist/analyze/incremental.d.ts.map +1 -0
- package/dist/analyze/incremental.js +102 -0
- package/dist/analyze/incremental.js.map +1 -0
- package/dist/analyze/index.d.ts +5 -0
- package/dist/analyze/index.d.ts.map +1 -0
- package/dist/analyze/index.js +49 -0
- package/dist/analyze/index.js.map +1 -0
- package/dist/analyze/parse-util.d.ts +10 -0
- package/dist/analyze/parse-util.d.ts.map +1 -0
- package/dist/analyze/parse-util.js +47 -0
- package/dist/analyze/parse-util.js.map +1 -0
- package/dist/analyze/prisma.d.ts +4 -0
- package/dist/analyze/prisma.d.ts.map +1 -0
- package/dist/analyze/prisma.js +97 -0
- package/dist/analyze/prisma.js.map +1 -0
- package/dist/analyze/sql.d.ts +3 -0
- package/dist/analyze/sql.d.ts.map +1 -0
- package/dist/analyze/sql.js +110 -0
- package/dist/analyze/sql.js.map +1 -0
- package/dist/analyze/stack.d.ts +4 -0
- package/dist/analyze/stack.d.ts.map +1 -0
- package/dist/analyze/stack.js +94 -0
- package/dist/analyze/stack.js.map +1 -0
- package/dist/analyze/tier0.d.ts +7 -0
- package/dist/analyze/tier0.d.ts.map +1 -0
- package/dist/analyze/tier0.js +57 -0
- package/dist/analyze/tier0.js.map +1 -0
- package/dist/analyze/tier1.d.ts +13 -0
- package/dist/analyze/tier1.d.ts.map +1 -0
- package/dist/analyze/tier1.js +144 -0
- package/dist/analyze/tier1.js.map +1 -0
- package/dist/analyze/tier2.d.ts +14 -0
- package/dist/analyze/tier2.d.ts.map +1 -0
- package/dist/analyze/tier2.js +231 -0
- package/dist/analyze/tier2.js.map +1 -0
- package/dist/analyze/walk.d.ts +3 -0
- package/dist/analyze/walk.d.ts.map +1 -0
- package/dist/analyze/walk.js +50 -0
- package/dist/analyze/walk.js.map +1 -0
- package/dist/auth.d.ts +12 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +61 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +787 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud/api.d.ts +20 -0
- package/dist/cloud/api.d.ts.map +1 -0
- package/dist/cloud/api.js +81 -0
- package/dist/cloud/api.js.map +1 -0
- package/dist/cloud/index.d.ts +4 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +20 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/store.d.ts +34 -0
- package/dist/cloud/store.d.ts.map +1 -0
- package/dist/cloud/store.js +137 -0
- package/dist/cloud/store.js.map +1 -0
- package/dist/diff/history.d.ts +9 -0
- package/dist/diff/history.d.ts.map +1 -0
- package/dist/diff/history.js +44 -0
- package/dist/diff/history.js.map +1 -0
- package/dist/diff/index.d.ts +5 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +26 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/model-diff.d.ts +44 -0
- package/dist/diff/model-diff.d.ts.map +1 -0
- package/dist/diff/model-diff.js +153 -0
- package/dist/diff/model-diff.js.map +1 -0
- package/dist/diff/snapshot.d.ts +8 -0
- package/dist/diff/snapshot.d.ts.map +1 -0
- package/dist/diff/snapshot.js +50 -0
- package/dist/diff/snapshot.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +44 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/naming.d.ts +12 -0
- package/dist/ir/naming.d.ts.map +1 -0
- package/dist/ir/naming.js +31 -0
- package/dist/ir/naming.js.map +1 -0
- package/dist/ir/types.d.ts +149 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +72 -0
- package/dist/ir/types.js.map +1 -0
- package/dist/mcp/bench.d.ts +25 -0
- package/dist/mcp/bench.d.ts.map +1 -0
- package/dist/mcp/bench.js +115 -0
- package/dist/mcp/bench.js.map +1 -0
- package/dist/mcp/queries.d.ts +22 -0
- package/dist/mcp/queries.d.ts.map +1 -0
- package/dist/mcp/queries.js +147 -0
- package/dist/mcp/queries.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +147 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/usage.d.ts +23 -0
- package/dist/mcp/usage.d.ts.map +1 -0
- package/dist/mcp/usage.js +125 -0
- package/dist/mcp/usage.js.map +1 -0
- package/dist/project/bpmn-parse.d.ts +17 -0
- package/dist/project/bpmn-parse.d.ts.map +1 -0
- package/dist/project/bpmn-parse.js +60 -0
- package/dist/project/bpmn-parse.js.map +1 -0
- package/dist/project/bpmn.d.ts +11 -0
- package/dist/project/bpmn.d.ts.map +1 -0
- package/dist/project/bpmn.js +89 -0
- package/dist/project/bpmn.js.map +1 -0
- package/dist/project/capability.d.ts +16 -0
- package/dist/project/capability.d.ts.map +1 -0
- package/dist/project/capability.js +38 -0
- package/dist/project/capability.js.map +1 -0
- package/dist/project/erd.d.ts +17 -0
- package/dist/project/erd.d.ts.map +1 -0
- package/dist/project/erd.js +0 -0
- package/dist/project/erd.js.map +1 -0
- package/dist/project/html.d.ts +12 -0
- package/dist/project/html.d.ts.map +1 -0
- package/dist/project/html.js +166 -0
- package/dist/project/html.js.map +1 -0
- package/dist/project/index.d.ts +19 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +113 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/mermaid.d.ts +20 -0
- package/dist/project/mermaid.d.ts.map +1 -0
- package/dist/project/mermaid.js +89 -0
- package/dist/project/mermaid.js.map +1 -0
- package/dist/project/spec.d.ts +69 -0
- package/dist/project/spec.d.ts.map +1 -0
- package/dist/project/spec.js +164 -0
- package/dist/project/spec.js.map +1 -0
- package/dist/project/trust.d.ts +35 -0
- package/dist/project/trust.d.ts.map +1 -0
- package/dist/project/trust.js +48 -0
- package/dist/project/trust.js.map +1 -0
- package/dist/system.d.ts +61 -0
- package/dist/system.d.ts.map +1 -0
- package/dist/system.js +161 -0
- package/dist/system.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data-model detection orchestrator — the "what does it persist?" layer.
|
|
3
|
+
* Runs each source-specific parser (Prisma, Drizzle, SQL DDL) and merges the
|
|
4
|
+
* results into one DataEntity[]. A repo typically uses one of these; on a name
|
|
5
|
+
* clash the first source wins (Prisma → Drizzle → SQL).
|
|
6
|
+
*/
|
|
7
|
+
import { type DataEntity } from "../ir/types.js";
|
|
8
|
+
export declare function detectDataModel(root: string): DataEntity[];
|
|
9
|
+
//# sourceMappingURL=datamodel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datamodel.d.ts","sourceRoot":"","sources":["../../src/analyze/datamodel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAU1D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectDataModel = detectDataModel;
|
|
4
|
+
const prisma_js_1 = require("./prisma.js");
|
|
5
|
+
const drizzle_js_1 = require("./drizzle.js");
|
|
6
|
+
const sql_js_1 = require("./sql.js");
|
|
7
|
+
function detectDataModel(root) {
|
|
8
|
+
const all = [...(0, prisma_js_1.detectPrismaModel)(root), ...(0, drizzle_js_1.detectDrizzleModel)(root), ...(0, sql_js_1.detectSqlModel)(root)];
|
|
9
|
+
const seen = new Set();
|
|
10
|
+
const out = [];
|
|
11
|
+
for (const e of all) {
|
|
12
|
+
if (seen.has(e.id))
|
|
13
|
+
continue;
|
|
14
|
+
seen.add(e.id);
|
|
15
|
+
out.push(e);
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=datamodel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datamodel.js","sourceRoot":"","sources":["../../src/analyze/datamodel.ts"],"names":[],"mappings":";;AAWA,0CAUC;AAdD,2CAAgD;AAChD,6CAAkD;AAClD,qCAA0C;AAE1C,SAAgB,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAG,CAAC,GAAG,IAAA,6BAAiB,EAAC,IAAI,CAAC,EAAE,GAAG,IAAA,+BAAkB,EAAC,IAAI,CAAC,EAAE,GAAG,IAAA,uBAAc,EAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ArchitectureModel, type Capability } from "../ir/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* The export exists deterministically (file:line); only its plain-English
|
|
4
|
+
* reading is heuristic. Medium confidence: real and grounded, prose refined by
|
|
5
|
+
* the Tier-2 LLM pass. (Reserve the low/⚠ band for genuinely uncertain finds.)
|
|
6
|
+
*/
|
|
7
|
+
export declare const HEURISTIC_CONFIDENCE = 0.6;
|
|
8
|
+
/** Derive the Capabilities for a single file (reused by the incremental updater). */
|
|
9
|
+
export declare function extractFileCapabilities(root: string, rel: string): Capability[];
|
|
10
|
+
/**
|
|
11
|
+
* (Re)derive the single Process + Flow from the entry-point dependency chain.
|
|
12
|
+
* Replaces any existing processes/flows — safe to call on an already-populated
|
|
13
|
+
* model (the incremental updater does this after patching the import graph).
|
|
14
|
+
*/
|
|
15
|
+
export declare function deriveProcessAndFlow(root: string, model: ArchitectureModel): void;
|
|
16
|
+
/**
|
|
17
|
+
* Enrich the model in place with structural Capabilities, one Process and one
|
|
18
|
+
* Flow. Runs after Tier 1 (it needs the import graph). Pure structural — no network.
|
|
19
|
+
*/
|
|
20
|
+
export declare function deriveSemantics(root: string, sourceFiles: string[], model: ArchitectureModel): void;
|
|
21
|
+
//# sourceMappingURL=derive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../src/analyze/derive.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAKhB,MAAM,gBAAgB,CAAC;AAGxB;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAyGxC,qFAAqF;AACrF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CAgB/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CA+CjF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAKnG"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.HEURISTIC_CONFIDENCE = void 0;
|
|
7
|
+
exports.extractFileCapabilities = extractFileCapabilities;
|
|
8
|
+
exports.deriveProcessAndFlow = deriveProcessAndFlow;
|
|
9
|
+
exports.deriveSemantics = deriveSemantics;
|
|
10
|
+
/**
|
|
11
|
+
* Tier 1.5 — deterministic semantic derivation (no LLM yet; that's Tier 2 / M4).
|
|
12
|
+
*
|
|
13
|
+
* Two structural products, both grounded with `file:line` provenance:
|
|
14
|
+
* - Capabilities: exported functions/classes → "what can this system do?"
|
|
15
|
+
* (USP 1). Naming intent is heuristic, so these carry a *lower* confidence
|
|
16
|
+
* and are flagged for the Tier-2 LLM pass to refine.
|
|
17
|
+
* - One Process + one Flow: the dependency chain orchestrated from the main
|
|
18
|
+
* entry point → a BPMN process (USP 2) and a sequence (one model, many views).
|
|
19
|
+
*
|
|
20
|
+
* Everything here is reproducible from the AST + import graph; the LLM later
|
|
21
|
+
* rewrites the prose and raises confidence, it does not invent structure.
|
|
22
|
+
*/
|
|
23
|
+
const node_fs_1 = require("node:fs");
|
|
24
|
+
const node_path_1 = require("node:path");
|
|
25
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
26
|
+
const naming_js_1 = require("../ir/naming.js");
|
|
27
|
+
/**
|
|
28
|
+
* The export exists deterministically (file:line); only its plain-English
|
|
29
|
+
* reading is heuristic. Medium confidence: real and grounded, prose refined by
|
|
30
|
+
* the Tier-2 LLM pass. (Reserve the low/⚠ band for genuinely uncertain finds.)
|
|
31
|
+
*/
|
|
32
|
+
exports.HEURISTIC_CONFIDENCE = 0.6;
|
|
33
|
+
/** Cap process/flow length so a huge graph still yields a readable diagram. */
|
|
34
|
+
const MAX_PROCESS_TASKS = 12;
|
|
35
|
+
function scriptKindFor(rel) {
|
|
36
|
+
if (rel.endsWith(".tsx"))
|
|
37
|
+
return typescript_1.default.ScriptKind.TSX;
|
|
38
|
+
if (rel.endsWith(".ts"))
|
|
39
|
+
return typescript_1.default.ScriptKind.TS;
|
|
40
|
+
if (rel.endsWith(".jsx"))
|
|
41
|
+
return typescript_1.default.ScriptKind.JSX;
|
|
42
|
+
return typescript_1.default.ScriptKind.JS;
|
|
43
|
+
}
|
|
44
|
+
function hasExport(node) {
|
|
45
|
+
return (typescript_1.default.canHaveModifiers(node) ? typescript_1.default.getModifiers(node) : undefined)?.some((m) => m.kind === typescript_1.default.SyntaxKind.ExportKeyword) ?? false;
|
|
46
|
+
}
|
|
47
|
+
/** Collect top-level exported functions/classes (the value-level public surface). */
|
|
48
|
+
function collectExports(sf) {
|
|
49
|
+
const out = [];
|
|
50
|
+
const lineOf = (n) => sf.getLineAndCharacterOfPosition(n.getStart(sf)).line + 1;
|
|
51
|
+
sf.forEachChild((node) => {
|
|
52
|
+
if (!hasExport(node))
|
|
53
|
+
return;
|
|
54
|
+
if (typescript_1.default.isFunctionDeclaration(node) && node.name) {
|
|
55
|
+
out.push({ name: node.name.text, kind: "function", line: lineOf(node) });
|
|
56
|
+
}
|
|
57
|
+
else if (typescript_1.default.isClassDeclaration(node) && node.name) {
|
|
58
|
+
out.push({ name: node.name.text, kind: "class", line: lineOf(node) });
|
|
59
|
+
}
|
|
60
|
+
else if (typescript_1.default.isVariableStatement(node)) {
|
|
61
|
+
for (const decl of node.declarationList.declarations) {
|
|
62
|
+
if (typescript_1.default.isIdentifier(decl.name) &&
|
|
63
|
+
decl.initializer &&
|
|
64
|
+
(typescript_1.default.isArrowFunction(decl.initializer) || typescript_1.default.isFunctionExpression(decl.initializer))) {
|
|
65
|
+
out.push({ name: decl.name.text, kind: "function", line: lineOf(decl) });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/** Map the package.json bin/main entry to a known component path, else a sensible default. */
|
|
73
|
+
function findEntryComponent(root, componentPaths) {
|
|
74
|
+
const set = new Set(componentPaths);
|
|
75
|
+
const fromManifest = () => {
|
|
76
|
+
const pkgPath = (0, node_path_1.join)(root, "package.json");
|
|
77
|
+
if (!(0, node_fs_1.existsSync)(pkgPath))
|
|
78
|
+
return undefined;
|
|
79
|
+
let pkg = {};
|
|
80
|
+
try {
|
|
81
|
+
pkg = JSON.parse((0, node_fs_1.readFileSync)(pkgPath, "utf8"));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
const binVal = typeof pkg.bin === "string" ? pkg.bin : Object.values(pkg.bin ?? {})[0];
|
|
87
|
+
for (const hint of [binVal, pkg.main]) {
|
|
88
|
+
if (!hint)
|
|
89
|
+
continue;
|
|
90
|
+
const base = (0, node_path_1.basename)(hint).replace(/\.(js|mjs|cjs)$/, "");
|
|
91
|
+
const match = componentPaths.find((p) => (0, node_path_1.basename)(p).replace(/\.(ts|tsx|js|jsx)$/, "") === base);
|
|
92
|
+
if (match)
|
|
93
|
+
return match;
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
};
|
|
97
|
+
return (fromManifest() ??
|
|
98
|
+
["src/cli.ts", "src/index.ts", "src/main.ts", "index.ts"].find((p) => set.has(p)) ??
|
|
99
|
+
componentPaths[0]);
|
|
100
|
+
}
|
|
101
|
+
/** BFS from the entry over internal edges, neighbors ordered by import line.
|
|
102
|
+
* Ordering by the edge's source line (not the relations-array order) makes the
|
|
103
|
+
* chain deterministic — identical whether built by a full pass or incrementally. */
|
|
104
|
+
function orderedChain(entryId, model) {
|
|
105
|
+
const lineOf = (ref) => Number(ref.split(":").pop()) || 0;
|
|
106
|
+
const adjacency = new Map();
|
|
107
|
+
for (const r of model.relations) {
|
|
108
|
+
if (!r.to.startsWith("comp:"))
|
|
109
|
+
continue; // internal edges only
|
|
110
|
+
const list = adjacency.get(r.from) ?? adjacency.set(r.from, []).get(r.from);
|
|
111
|
+
list.push({ to: r.to, line: lineOf(r.provenance[0]?.ref ?? "") });
|
|
112
|
+
}
|
|
113
|
+
for (const list of adjacency.values())
|
|
114
|
+
list.sort((a, b) => a.line - b.line);
|
|
115
|
+
const visited = new Set();
|
|
116
|
+
const order = [];
|
|
117
|
+
const stack = [entryId];
|
|
118
|
+
while (stack.length && order.length < MAX_PROCESS_TASKS) {
|
|
119
|
+
const id = stack.shift(); // BFS, keeping import order readable
|
|
120
|
+
if (visited.has(id))
|
|
121
|
+
continue;
|
|
122
|
+
visited.add(id);
|
|
123
|
+
order.push(id);
|
|
124
|
+
for (const { to } of adjacency.get(id) ?? [])
|
|
125
|
+
if (!visited.has(to))
|
|
126
|
+
stack.push(to);
|
|
127
|
+
}
|
|
128
|
+
return order;
|
|
129
|
+
}
|
|
130
|
+
/** Derive the Capabilities for a single file (reused by the incremental updater). */
|
|
131
|
+
function extractFileCapabilities(root, rel) {
|
|
132
|
+
let text;
|
|
133
|
+
try {
|
|
134
|
+
text = (0, node_fs_1.readFileSync)((0, node_path_1.join)(root, rel), "utf8");
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
const sf = typescript_1.default.createSourceFile(rel, text, typescript_1.default.ScriptTarget.Latest, true, scriptKindFor(rel));
|
|
140
|
+
return collectExports(sf).map((sym) => ({
|
|
141
|
+
id: `cap:${rel}#${sym.name}`,
|
|
142
|
+
name: (0, naming_js_1.humanize)(sym.name),
|
|
143
|
+
description: `Exported ${sym.kind} \`${sym.name}\` in ${rel}`,
|
|
144
|
+
componentIds: [`comp:${rel}`],
|
|
145
|
+
provenance: [{ source: "code", ref: `${rel}:${sym.line}`, confidence: exports.HEURISTIC_CONFIDENCE }],
|
|
146
|
+
confidence: exports.HEURISTIC_CONFIDENCE,
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* (Re)derive the single Process + Flow from the entry-point dependency chain.
|
|
151
|
+
* Replaces any existing processes/flows — safe to call on an already-populated
|
|
152
|
+
* model (the incremental updater does this after patching the import graph).
|
|
153
|
+
*/
|
|
154
|
+
function deriveProcessAndFlow(root, model) {
|
|
155
|
+
model.processes = [];
|
|
156
|
+
model.flows = [];
|
|
157
|
+
const componentPaths = model.components.map((c) => c.id.slice("comp:".length));
|
|
158
|
+
const entryRel = findEntryComponent(root, componentPaths);
|
|
159
|
+
if (!entryRel)
|
|
160
|
+
return;
|
|
161
|
+
const entryId = `comp:${entryRel}`;
|
|
162
|
+
const chain = orderedChain(entryId, model);
|
|
163
|
+
if (chain.length < 2)
|
|
164
|
+
return; // not enough structure for a meaningful process
|
|
165
|
+
const nameOf = (id) => (0, naming_js_1.componentLabel)(id);
|
|
166
|
+
const provOf = (id) => ({
|
|
167
|
+
source: "code",
|
|
168
|
+
ref: `${id.slice("comp:".length)}:1`,
|
|
169
|
+
confidence: exports.HEURISTIC_CONFIDENCE,
|
|
170
|
+
});
|
|
171
|
+
const process = {
|
|
172
|
+
id: `proc:${entryRel}`,
|
|
173
|
+
name: `${nameOf(entryId)} flow`,
|
|
174
|
+
description: `Modules orchestrated from the ${entryRel} entry point (structural; refined by Tier 2).`,
|
|
175
|
+
tasks: chain.map((id) => ({ id: `task:${id}`, name: nameOf(id), provenance: [provOf(id)] })),
|
|
176
|
+
provenance: [provOf(entryId)],
|
|
177
|
+
confidence: exports.HEURISTIC_CONFIDENCE,
|
|
178
|
+
};
|
|
179
|
+
model.processes.push(process);
|
|
180
|
+
const steps = [];
|
|
181
|
+
for (let i = 0; i < chain.length - 1; i++) {
|
|
182
|
+
steps.push({
|
|
183
|
+
participant: chain[i],
|
|
184
|
+
action: "uses",
|
|
185
|
+
to: chain[i + 1],
|
|
186
|
+
provenance: [provOf(chain[i])],
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
const flow = {
|
|
190
|
+
id: `flow:${entryRel}`,
|
|
191
|
+
name: `${nameOf(entryId)} sequence`,
|
|
192
|
+
description: `Call/dependency sequence from ${entryRel} (structural).`,
|
|
193
|
+
participants: chain,
|
|
194
|
+
steps,
|
|
195
|
+
provenance: [provOf(entryId)],
|
|
196
|
+
confidence: exports.HEURISTIC_CONFIDENCE,
|
|
197
|
+
};
|
|
198
|
+
model.flows.push(flow);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Enrich the model in place with structural Capabilities, one Process and one
|
|
202
|
+
* Flow. Runs after Tier 1 (it needs the import graph). Pure structural — no network.
|
|
203
|
+
*/
|
|
204
|
+
function deriveSemantics(root, sourceFiles, model) {
|
|
205
|
+
for (const rel of sourceFiles) {
|
|
206
|
+
for (const cap of extractFileCapabilities(root, rel))
|
|
207
|
+
model.capabilities.push(cap);
|
|
208
|
+
}
|
|
209
|
+
deriveProcessAndFlow(root, model);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/analyze/derive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/analyze/drizzle.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,gBAAgB,CAAC;AAmCjE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAyC7D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectDrizzleModel = detectDrizzleModel;
|
|
4
|
+
/**
|
|
5
|
+
* Drizzle ORM data-model detection.
|
|
6
|
+
*
|
|
7
|
+
* Parses `pgTable`/`mysqlTable`/`sqliteTable(...)` definitions in TS source into
|
|
8
|
+
* DataEntity[]. Relations come from `.references(() => other.col)` foreign keys
|
|
9
|
+
* (Drizzle has no inverse "list" field — the FK is the relationship), grounded to
|
|
10
|
+
* `file:line`. Regex-based, dependency-light; the ERD derivation infers
|
|
11
|
+
* cardinality from FK direction. See docs/ROADMAP.md.
|
|
12
|
+
*/
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const tier0_js_1 = require("./tier0.js");
|
|
16
|
+
const fs_util_js_1 = require("./fs-util.js");
|
|
17
|
+
const parse_util_js_1 = require("./parse-util.js");
|
|
18
|
+
/** Drizzle column-builder names that aren't real columns (table-level helpers). */
|
|
19
|
+
const NON_COLUMN = new Set(["primaryKey", "unique", "uniqueIndex", "index", "foreignKey", "check"]);
|
|
20
|
+
function parseFields(body, varToTable) {
|
|
21
|
+
const fields = [];
|
|
22
|
+
for (const part of (0, parse_util_js_1.splitTopLevel)(body)) {
|
|
23
|
+
const m = /^\s*(\w+)\s*:\s*([\s\S]+)$/.exec(part);
|
|
24
|
+
if (!m)
|
|
25
|
+
continue;
|
|
26
|
+
const name = m[1];
|
|
27
|
+
const builder = m[2];
|
|
28
|
+
const fn = /^(\w+)\s*\(/.exec(builder);
|
|
29
|
+
if (!fn || NON_COLUMN.has(fn[1]))
|
|
30
|
+
continue;
|
|
31
|
+
const field = { name, type: fn[1] };
|
|
32
|
+
const isPk = /\.primaryKey\s*\(/.test(builder);
|
|
33
|
+
if (isPk)
|
|
34
|
+
field.isId = true;
|
|
35
|
+
if (/\.unique\s*\(/.test(builder))
|
|
36
|
+
field.isUnique = true;
|
|
37
|
+
if (!/\.notNull\s*\(/.test(builder) && !isPk)
|
|
38
|
+
field.optional = true;
|
|
39
|
+
const ref = /\.references\s*\(\s*\(\s*\)\s*=>\s*(\w+)\s*\./.exec(builder);
|
|
40
|
+
if (ref) {
|
|
41
|
+
const target = varToTable.get(ref[1]);
|
|
42
|
+
if (target) {
|
|
43
|
+
field.isForeignKey = true;
|
|
44
|
+
field.relationTo = `data:${target}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
fields.push(field);
|
|
48
|
+
}
|
|
49
|
+
return fields;
|
|
50
|
+
}
|
|
51
|
+
function detectDrizzleModel(root) {
|
|
52
|
+
const sources = (0, fs_util_js_1.findFiles)(root, (n) => /\.(ts|tsx|mts|cts)$/.test(n) && !n.endsWith(".d.ts"))
|
|
53
|
+
.map((f) => ({ rel: (0, node_path_1.relative)(root, f).split("\\").join("/"), text: (0, node_fs_1.readFileSync)(f, "utf8") }))
|
|
54
|
+
.filter((s) => /\b(?:pg|mysql|sqlite)Table\s*\(/.test(s.text));
|
|
55
|
+
if (!sources.length)
|
|
56
|
+
return [];
|
|
57
|
+
const tableRe = /export\s+const\s+(\w+)\s*=\s*(?:pg|mysql|sqlite)Table\s*\(\s*["'`]([^"'`]+)["'`]\s*,\s*\{/g;
|
|
58
|
+
const found = [];
|
|
59
|
+
const varToTable = new Map();
|
|
60
|
+
for (const s of sources) {
|
|
61
|
+
tableRe.lastIndex = 0;
|
|
62
|
+
let m;
|
|
63
|
+
while ((m = tableRe.exec(s.text))) {
|
|
64
|
+
varToTable.set(m[1], m[2]);
|
|
65
|
+
found.push({
|
|
66
|
+
tableName: m[2],
|
|
67
|
+
rel: s.rel,
|
|
68
|
+
bodyOpen: tableRe.lastIndex - 1, // at the '{'
|
|
69
|
+
declLine: s.text.slice(0, m.index).split("\n").length,
|
|
70
|
+
text: s.text,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Pass 2: parse each table body.
|
|
75
|
+
return found.map((t) => ({
|
|
76
|
+
id: `data:${t.tableName}`,
|
|
77
|
+
name: t.tableName,
|
|
78
|
+
fields: parseFields((0, parse_util_js_1.balancedBlock)(t.text, t.bodyOpen, "{", "}"), varToTable),
|
|
79
|
+
provenance: [{ source: "code", ref: `${t.rel}:${t.declLine}`, confidence: tier0_js_1.STRUCTURAL_CONFIDENCE }],
|
|
80
|
+
confidence: tier0_js_1.STRUCTURAL_CONFIDENCE,
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=drizzle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.js","sourceRoot":"","sources":["../../src/analyze/drizzle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/analyze/endpoints.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAwE/C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAqFxD"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectEndpoints = detectEndpoints;
|
|
4
|
+
/**
|
|
5
|
+
* API surface detection — the contract layer ("what can callers invoke?").
|
|
6
|
+
*
|
|
7
|
+
* Detects REST routes (Next.js App Router `route.ts`, Pages `pages/api`, and
|
|
8
|
+
* Express/Fastify/Koa/Hono `app.get("/…")` calls), tRPC procedures, and GraphQL
|
|
9
|
+
* `Query`/`Mutation`/`Subscription` fields (SDL files + inline `gql\`…\``).
|
|
10
|
+
* Grounded to `file:line`. Regex/structure-based, dependency-light. Pairs with the
|
|
11
|
+
* data-model ERD as the two halves of the contract. See docs/ROADMAP.md.
|
|
12
|
+
*/
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const tier0_js_1 = require("./tier0.js");
|
|
16
|
+
const walk_js_1 = require("./walk.js");
|
|
17
|
+
const fs_util_js_1 = require("./fs-util.js");
|
|
18
|
+
const parse_util_js_1 = require("./parse-util.js");
|
|
19
|
+
const HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
|
|
20
|
+
const TRPC_CONFIDENCE = 0.8;
|
|
21
|
+
const lineAt = (text, idx) => text.slice(0, idx).split("\n").length;
|
|
22
|
+
/** `[id]` → `:id`, `[...slug]`/`[[...slug]]` → `*`, route groups/parallel routes dropped. */
|
|
23
|
+
function dynamicSeg(s) {
|
|
24
|
+
if (/^\[\[?\.\.\..+\]\]?$/.test(s))
|
|
25
|
+
return "*";
|
|
26
|
+
const m = /^\[(.+)\]$/.exec(s);
|
|
27
|
+
return m ? ":" + m[1] : s;
|
|
28
|
+
}
|
|
29
|
+
/** Derive the route path of a Next.js App Router `route.*` file. */
|
|
30
|
+
function appRouterPath(rel) {
|
|
31
|
+
const parts = rel.split("/");
|
|
32
|
+
const i = parts.lastIndexOf("app");
|
|
33
|
+
if (i === -1)
|
|
34
|
+
return null;
|
|
35
|
+
const segs = parts
|
|
36
|
+
.slice(i + 1, -1) // between `app/` and the `route.*` filename
|
|
37
|
+
.filter((s) => !(s.startsWith("(") && s.endsWith(")"))) // route groups / interceptors
|
|
38
|
+
.filter((s) => !s.startsWith("@")) // parallel-route slots
|
|
39
|
+
.map(dynamicSeg);
|
|
40
|
+
return "/" + segs.join("/");
|
|
41
|
+
}
|
|
42
|
+
/** Derive the route path of a Next.js Pages API file (`pages/api/...`). */
|
|
43
|
+
function pagesApiPath(rel) {
|
|
44
|
+
const parts = rel.split("/");
|
|
45
|
+
const i = parts.lastIndexOf("pages");
|
|
46
|
+
if (i === -1 || parts[i + 1] !== "api")
|
|
47
|
+
return null;
|
|
48
|
+
const segs = parts.slice(i + 1); // ['api', ...dirs, 'file.ts']
|
|
49
|
+
const file = segs.pop().replace(/\.(tsx?|jsx?|mjs|cjs)$/, "");
|
|
50
|
+
if (file !== "index")
|
|
51
|
+
segs.push(file);
|
|
52
|
+
return "/" + segs.map(dynamicSeg).join("/");
|
|
53
|
+
}
|
|
54
|
+
/** Index of an exported HTTP-method handler (function/const/named re-export), or -1. */
|
|
55
|
+
function methodMatch(text, method) {
|
|
56
|
+
const re = new RegExp(`export\\s+(?:async\\s+)?function\\s+${method}\\b` +
|
|
57
|
+
`|export\\s+(?:const|let|var)\\s+${method}\\s*[:=]` +
|
|
58
|
+
`|export\\s*\\{[^}]*\\b${method}\\b[^}]*\\}`);
|
|
59
|
+
return text.search(re);
|
|
60
|
+
}
|
|
61
|
+
/** Parse GraphQL SDL for Query/Mutation/Subscription fields. Lines are 1-based within `text`. */
|
|
62
|
+
function parseSdl(text) {
|
|
63
|
+
const out = [];
|
|
64
|
+
const typeRe = /\btype\s+(Query|Mutation|Subscription)\b[^{]*\{/g;
|
|
65
|
+
let m;
|
|
66
|
+
while ((m = typeRe.exec(text))) {
|
|
67
|
+
const kind = m[1].toUpperCase();
|
|
68
|
+
const openIdx = text.indexOf("{", m.index);
|
|
69
|
+
if (openIdx === -1)
|
|
70
|
+
continue;
|
|
71
|
+
const body = (0, parse_util_js_1.balancedBlock)(text, openIdx, "{", "}");
|
|
72
|
+
const bodyStartLine = lineAt(text, openIdx);
|
|
73
|
+
body.split("\n").forEach((raw, i) => {
|
|
74
|
+
const line = raw.replace(/#.*$/, "").trim();
|
|
75
|
+
const fm = /^(\w+)\s*[(:]/.exec(line);
|
|
76
|
+
if (fm)
|
|
77
|
+
out.push({ method: kind, path: fm[1], line: bodyStartLine + i });
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
function detectEndpoints(root) {
|
|
83
|
+
const out = [];
|
|
84
|
+
const seen = new Set();
|
|
85
|
+
const push = (protocol, method, path, ref, conf = tier0_js_1.STRUCTURAL_CONFIDENCE) => {
|
|
86
|
+
const id = `endpoint:${protocol}:${method}:${path}`;
|
|
87
|
+
if (seen.has(id))
|
|
88
|
+
return;
|
|
89
|
+
seen.add(id);
|
|
90
|
+
out.push({
|
|
91
|
+
id,
|
|
92
|
+
name: `${method} ${path}`,
|
|
93
|
+
method,
|
|
94
|
+
path,
|
|
95
|
+
protocol,
|
|
96
|
+
provenance: [{ source: "code", ref, confidence: conf }],
|
|
97
|
+
confidence: conf,
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
const restCall = /\b[\w$]+\.(get|post|put|patch|delete|options|head|all)\s*\(\s*[`'"]([^`'"]+)[`'"]/gi;
|
|
101
|
+
const trpcRe = /(\w+)\s*:\s*[\w.]*[Pp]rocedure[\s\S]{0,400}?\.(query|mutation|subscription)\s*\(/g;
|
|
102
|
+
const gqlRe = /(?:gql|graphql)\s*`([\s\S]*?)`/g;
|
|
103
|
+
for (const rel of (0, walk_js_1.walkSourceFiles)(root)) {
|
|
104
|
+
let text;
|
|
105
|
+
try {
|
|
106
|
+
text = (0, node_fs_1.readFileSync)((0, node_path_1.join)(root, rel), "utf8");
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const base = rel.split("/").pop();
|
|
112
|
+
// Next.js App Router route handlers.
|
|
113
|
+
if (/^route\.(tsx?|jsx?|mjs|cjs)$/.test(base)) {
|
|
114
|
+
const p = appRouterPath(rel);
|
|
115
|
+
if (p)
|
|
116
|
+
for (const method of HTTP_METHODS) {
|
|
117
|
+
const idx = methodMatch(text, method);
|
|
118
|
+
if (idx >= 0)
|
|
119
|
+
push("rest", method, p, `${rel}:${lineAt(text, idx)}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Next.js Pages API.
|
|
123
|
+
const pa = pagesApiPath(rel);
|
|
124
|
+
if (pa)
|
|
125
|
+
push("rest", "ANY", pa, `${rel}:1`);
|
|
126
|
+
// Express / Fastify / Koa / Hono method calls (require a leading-slash path to
|
|
127
|
+
// avoid Map/Headers/`.get("x")` false positives).
|
|
128
|
+
restCall.lastIndex = 0;
|
|
129
|
+
let rm;
|
|
130
|
+
while ((rm = restCall.exec(text))) {
|
|
131
|
+
const path = rm[2];
|
|
132
|
+
if (!path.startsWith("/"))
|
|
133
|
+
continue;
|
|
134
|
+
const verb = rm[1].toUpperCase();
|
|
135
|
+
push("rest", verb === "ALL" ? "ANY" : verb, path, `${rel}:${lineAt(text, rm.index)}`);
|
|
136
|
+
}
|
|
137
|
+
// tRPC procedures (best-effort).
|
|
138
|
+
trpcRe.lastIndex = 0;
|
|
139
|
+
let tm;
|
|
140
|
+
while ((tm = trpcRe.exec(text))) {
|
|
141
|
+
push("trpc", tm[2].toUpperCase(), tm[1], `${rel}:${lineAt(text, tm.index)}`, TRPC_CONFIDENCE);
|
|
142
|
+
}
|
|
143
|
+
// Inline GraphQL SDL.
|
|
144
|
+
gqlRe.lastIndex = 0;
|
|
145
|
+
let gm;
|
|
146
|
+
while ((gm = gqlRe.exec(text))) {
|
|
147
|
+
const startLine = lineAt(text, gm.index) - 1;
|
|
148
|
+
for (const f of parseSdl(gm[1]))
|
|
149
|
+
push("graphql", f.method, f.path, `${rel}:${startLine + f.line}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// GraphQL SDL files.
|
|
153
|
+
for (const abs of (0, fs_util_js_1.findFiles)(root, (n) => n.endsWith(".graphql") || n.endsWith(".gql"))) {
|
|
154
|
+
let text;
|
|
155
|
+
try {
|
|
156
|
+
text = (0, node_fs_1.readFileSync)(abs, "utf8");
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const rel = (0, node_path_1.relative)(root, abs).split("\\").join("/");
|
|
162
|
+
for (const f of parseSdl(text))
|
|
163
|
+
push("graphql", f.method, f.path, `${rel}:${f.line}`);
|
|
164
|
+
}
|
|
165
|
+
return out;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/analyze/endpoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-util.d.ts","sourceRoot":"","sources":["../../src/analyze/fs-util.ts"],"names":[],"mappings":"AAeA,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,EAAE,CAsBlF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findFiles = findFiles;
|
|
4
|
+
/** Shared filesystem walk for the structural detectors (data model, etc.). */
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const IGNORE = new Set([
|
|
8
|
+
"node_modules",
|
|
9
|
+
".git",
|
|
10
|
+
"dist",
|
|
11
|
+
"build",
|
|
12
|
+
".next",
|
|
13
|
+
"coverage",
|
|
14
|
+
".vercel",
|
|
15
|
+
".archmantic",
|
|
16
|
+
]);
|
|
17
|
+
/** Find every file under root whose basename matches `match`, sorted. */
|
|
18
|
+
function findFiles(root, match) {
|
|
19
|
+
const out = [];
|
|
20
|
+
const stack = [root];
|
|
21
|
+
while (stack.length) {
|
|
22
|
+
const dir = stack.pop();
|
|
23
|
+
let entries;
|
|
24
|
+
try {
|
|
25
|
+
entries = (0, node_fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
for (const e of entries) {
|
|
31
|
+
const full = (0, node_path_1.join)(dir, e.name);
|
|
32
|
+
if (e.isDirectory()) {
|
|
33
|
+
if (IGNORE.has(e.name) || e.name.startsWith("."))
|
|
34
|
+
continue;
|
|
35
|
+
stack.push(full);
|
|
36
|
+
}
|
|
37
|
+
else if (e.isFile() && match(e.name)) {
|
|
38
|
+
out.push(full);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return out.sort();
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=fs-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-util.js","sourceRoot":"","sources":["../../src/analyze/fs-util.ts"],"names":[],"mappings":";;AAgBA,8BAsBC;AAtCD,8EAA8E;AAC9E,qCAAsC;AACtC,yCAAiC;AAEjC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;IACrB,cAAc;IACd,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,UAAU;IACV,SAAS;IACT,aAAa;CACd,CAAC,CAAC;AAEH,yEAAyE;AACzE,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAgC;IACtE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACzB,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,IAAA,qBAAW,EAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAC3D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
|