autodocs-engine 0.9.4 → 0.9.5
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/import-chain.js +89 -4
- package/dist/import-chain.js.map +1 -1
- package/package.json +1 -1
package/dist/import-chain.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// src/import-chain.ts — Compute file-to-file import coupling and generate workflow rules
|
|
2
2
|
// Answers: "When I modify file X, what other files do I need to check?"
|
|
3
3
|
// Captures the SymbolGraph's import graph before it's discarded.
|
|
4
|
-
import {
|
|
4
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
5
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
5
6
|
import { resolveModuleSpecifier } from "./symbol-graph.js";
|
|
6
7
|
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
7
8
|
const DEFAULT_MIN_SYMBOLS = 1; // Track all import edges for MCP tools (analyze_impact, plan_change)
|
|
@@ -18,19 +19,23 @@ const MAX_DISPLAY_IMPORTERS = 3;
|
|
|
18
19
|
export function computeImportChain(symbolGraph, packageDir, warnings, minSymbols = DEFAULT_MIN_SYMBOLS) {
|
|
19
20
|
const edges = [];
|
|
20
21
|
const specCache = new Map(); // Memoize path resolution
|
|
22
|
+
const workspaceMap = buildWorkspaceMap(packageDir);
|
|
21
23
|
for (const [importerFile, imports] of symbolGraph.importGraph) {
|
|
22
24
|
// Group imported symbols by resolved source file
|
|
23
25
|
const symbolsBySource = new Map();
|
|
24
26
|
const fromDir = dirname(resolve(packageDir, importerFile));
|
|
25
27
|
for (const imp of imports) {
|
|
26
|
-
if (!imp.moduleSpecifier.startsWith("."))
|
|
27
|
-
continue; // Skip external
|
|
28
28
|
if (imp.importedNames.length === 0)
|
|
29
29
|
continue; // Skip bare imports
|
|
30
30
|
const cacheKey = `${imp.moduleSpecifier}\0${fromDir}`;
|
|
31
31
|
let sourceFile = specCache.get(cacheKey);
|
|
32
32
|
if (sourceFile === undefined && !specCache.has(cacheKey)) {
|
|
33
|
-
|
|
33
|
+
if (imp.moduleSpecifier.startsWith(".")) {
|
|
34
|
+
sourceFile = resolveModuleSpecifier(imp.moduleSpecifier, fromDir, packageDir, warnings);
|
|
35
|
+
}
|
|
36
|
+
else if (workspaceMap.size > 0) {
|
|
37
|
+
sourceFile = resolveWorkspaceAlias(imp.moduleSpecifier, workspaceMap, packageDir);
|
|
38
|
+
}
|
|
34
39
|
specCache.set(cacheKey, sourceFile);
|
|
35
40
|
}
|
|
36
41
|
if (!sourceFile)
|
|
@@ -59,6 +64,86 @@ export function computeImportChain(symbolGraph, packageDir, warnings, minSymbols
|
|
|
59
64
|
}
|
|
60
65
|
return edges.sort((a, b) => b.symbolCount - a.symbolCount);
|
|
61
66
|
}
|
|
67
|
+
// ─── Workspace Alias Resolution ──────────────────────────────────────────────
|
|
68
|
+
/**
|
|
69
|
+
* Build a map from workspace package names to their directories.
|
|
70
|
+
* Scans common monorepo locations (packages/*, apps/*) for package.json files.
|
|
71
|
+
* E.g., "@calcom/features" → "packages/features"
|
|
72
|
+
*/
|
|
73
|
+
function buildWorkspaceMap(packageDir) {
|
|
74
|
+
const map = new Map();
|
|
75
|
+
const searchDirs = ["packages", "apps", "libs", "modules"];
|
|
76
|
+
for (const base of searchDirs) {
|
|
77
|
+
const baseDir = join(packageDir, base);
|
|
78
|
+
try {
|
|
79
|
+
for (const entry of readdirSync(baseDir, { withFileTypes: true })) {
|
|
80
|
+
if (!entry.isDirectory() || entry.name === "node_modules" || entry.name.startsWith("."))
|
|
81
|
+
continue;
|
|
82
|
+
const pkgJsonPath = join(baseDir, entry.name, "package.json");
|
|
83
|
+
try {
|
|
84
|
+
const name = JSON.parse(readFileSync(pkgJsonPath, "utf-8")).name;
|
|
85
|
+
if (typeof name === "string") {
|
|
86
|
+
map.set(name, relative(packageDir, join(baseDir, entry.name)));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* no package.json or invalid */
|
|
91
|
+
}
|
|
92
|
+
// Also check nested workspaces (e.g., packages/features/*)
|
|
93
|
+
try {
|
|
94
|
+
for (const nested of readdirSync(join(baseDir, entry.name), { withFileTypes: true })) {
|
|
95
|
+
if (!nested.isDirectory() || nested.name === "node_modules")
|
|
96
|
+
continue;
|
|
97
|
+
const nestedPkgJson = join(baseDir, entry.name, nested.name, "package.json");
|
|
98
|
+
try {
|
|
99
|
+
const name = JSON.parse(readFileSync(nestedPkgJson, "utf-8")).name;
|
|
100
|
+
if (typeof name === "string") {
|
|
101
|
+
map.set(name, relative(packageDir, join(baseDir, entry.name, nested.name)));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
/* skip */
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
/* not a directory with nested packages */
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* search dir doesn't exist */
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return map;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolve a workspace alias like "@calcom/features/auth/lib/getServerSession"
|
|
122
|
+
* to a repo-relative file path like "packages/features/auth/lib/getServerSession.ts".
|
|
123
|
+
*/
|
|
124
|
+
function resolveWorkspaceAlias(specifier, workspaceMap, packageDir) {
|
|
125
|
+
// Try longest match first (e.g., "@calcom/features/ee" before "@calcom/features")
|
|
126
|
+
for (const [pkgName, pkgDir] of [...workspaceMap.entries()].sort((a, b) => b[0].length - a[0].length)) {
|
|
127
|
+
if (!specifier.startsWith(pkgName))
|
|
128
|
+
continue;
|
|
129
|
+
// Exact match: "@calcom/prisma" → look for index file in package dir
|
|
130
|
+
// Subpath match: "@calcom/features/auth/lib/foo" → resolve subpath
|
|
131
|
+
const subpath = specifier.slice(pkgName.length).replace(/^\//, "");
|
|
132
|
+
const basePath = subpath ? join(pkgDir, subpath) : join(pkgDir, "index");
|
|
133
|
+
// Try common extensions
|
|
134
|
+
for (const ext of [".ts", ".tsx", "/index.ts", "/index.tsx"]) {
|
|
135
|
+
const candidate = basePath + ext;
|
|
136
|
+
if (existsSync(join(packageDir, candidate))) {
|
|
137
|
+
return candidate;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Try without extension (file might already have one)
|
|
141
|
+
if (existsSync(join(packageDir, basePath))) {
|
|
142
|
+
return basePath;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
62
147
|
// ─── Workflow Rule Generation ────────────────────────────────────────────────
|
|
63
148
|
/**
|
|
64
149
|
* Generate "when modifying X → check Y, Z, W" workflow rules from import chain data.
|
package/dist/import-chain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-chain.js","sourceRoot":"","sources":["../src/import-chain.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,wEAAwE;AACxE,iEAAiE;AAEjE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"import-chain.js","sourceRoot":"","sources":["../src/import-chain.ts"],"names":[],"mappings":"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"}
|