@telora/mcp-products 0.22.3 → 0.22.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/package.json +1 -1
- package/dist/scanner/ast-extraction.d.ts +0 -10
- package/dist/scanner/ast-extraction.js +0 -156
- package/dist/scanner/ast-extraction.js.map +0 -1
- package/dist/scanner/file-discovery.d.ts +0 -9
- package/dist/scanner/file-discovery.js +0 -134
- package/dist/scanner/file-discovery.js.map +0 -1
- package/dist/scanner/index.d.ts +0 -19
- package/dist/scanner/index.js +0 -193
- package/dist/scanner/index.js.map +0 -1
- package/dist/scanner/relationship-extraction.d.ts +0 -11
- package/dist/scanner/relationship-extraction.js +0 -187
- package/dist/scanner/relationship-extraction.js.map +0 -1
- package/dist/scanner/types.d.ts +0 -45
- package/dist/scanner/types.js +0 -3
- package/dist/scanner/types.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Project, type SourceFile } from 'ts-morph';
|
|
2
|
-
import type { ExtractedMember } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Create a ts-morph Project configured for the given repo.
|
|
5
|
-
*/
|
|
6
|
-
export declare function createProject(repoRoot: string): Project;
|
|
7
|
-
/**
|
|
8
|
-
* Extract public API members from a source file.
|
|
9
|
-
*/
|
|
10
|
-
export declare function extractMembers(sourceFile: SourceFile): ExtractedMember[];
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
// AST-based extraction of component members using ts-morph.
|
|
2
|
-
import { Project, SyntaxKind, } from 'ts-morph';
|
|
3
|
-
/**
|
|
4
|
-
* Create a ts-morph Project configured for the given repo.
|
|
5
|
-
*/
|
|
6
|
-
export function createProject(repoRoot) {
|
|
7
|
-
const project = new Project({
|
|
8
|
-
tsConfigFilePath: `${repoRoot}/tsconfig.json`,
|
|
9
|
-
skipAddingFilesFromTsConfig: true,
|
|
10
|
-
skipFileDependencyResolution: true,
|
|
11
|
-
});
|
|
12
|
-
return project;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Extract public API members from a source file.
|
|
16
|
-
*/
|
|
17
|
-
export function extractMembers(sourceFile) {
|
|
18
|
-
const members = [];
|
|
19
|
-
// Extract exported functions
|
|
20
|
-
for (const fn of sourceFile.getFunctions()) {
|
|
21
|
-
if (!fn.isExported())
|
|
22
|
-
continue;
|
|
23
|
-
const name = fn.getName();
|
|
24
|
-
if (!name)
|
|
25
|
-
continue;
|
|
26
|
-
const memberType = detectFunctionMemberType(name, fn);
|
|
27
|
-
members.push({
|
|
28
|
-
memberType,
|
|
29
|
-
name,
|
|
30
|
-
signature: getSignatureText(fn),
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
// Extract exported variable declarations (arrow functions, consts)
|
|
34
|
-
for (const varStmt of sourceFile.getVariableStatements()) {
|
|
35
|
-
if (!varStmt.isExported())
|
|
36
|
-
continue;
|
|
37
|
-
for (const decl of varStmt.getDeclarations()) {
|
|
38
|
-
const name = decl.getName();
|
|
39
|
-
const initializer = decl.getInitializer();
|
|
40
|
-
if (initializer) {
|
|
41
|
-
const kind = initializer.getKind();
|
|
42
|
-
if (kind === SyntaxKind.ArrowFunction || kind === SyntaxKind.FunctionExpression) {
|
|
43
|
-
const memberType = detectFunctionMemberType(name, decl);
|
|
44
|
-
members.push({
|
|
45
|
-
memberType,
|
|
46
|
-
name,
|
|
47
|
-
signature: getVarSignature(decl),
|
|
48
|
-
});
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// Regular exported const
|
|
53
|
-
members.push({
|
|
54
|
-
memberType: 'export_const',
|
|
55
|
-
name,
|
|
56
|
-
signature: getVarSignature(decl),
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// Extract exported interfaces
|
|
61
|
-
for (const iface of sourceFile.getInterfaces()) {
|
|
62
|
-
if (!iface.isExported())
|
|
63
|
-
continue;
|
|
64
|
-
members.push({
|
|
65
|
-
memberType: 'export_type',
|
|
66
|
-
name: iface.getName(),
|
|
67
|
-
signature: `interface ${iface.getName()}`,
|
|
68
|
-
});
|
|
69
|
-
// If this looks like a Props interface, extract individual props
|
|
70
|
-
if (iface.getName().endsWith('Props') || iface.getName().endsWith('Properties')) {
|
|
71
|
-
extractPropsFromInterface(iface, members);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Extract exported type aliases
|
|
75
|
-
for (const typeAlias of sourceFile.getTypeAliases()) {
|
|
76
|
-
if (!typeAlias.isExported())
|
|
77
|
-
continue;
|
|
78
|
-
members.push({
|
|
79
|
-
memberType: 'export_type',
|
|
80
|
-
name: typeAlias.getName(),
|
|
81
|
-
signature: getTypeAliasSignature(typeAlias),
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
// Extract exported enums
|
|
85
|
-
for (const enumDecl of sourceFile.getEnums()) {
|
|
86
|
-
if (!enumDecl.isExported())
|
|
87
|
-
continue;
|
|
88
|
-
members.push({
|
|
89
|
-
memberType: 'export_type',
|
|
90
|
-
name: enumDecl.getName(),
|
|
91
|
-
signature: `enum ${enumDecl.getName()}`,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
return members;
|
|
95
|
-
}
|
|
96
|
-
function detectFunctionMemberType(name, _node) {
|
|
97
|
-
// Hook detection
|
|
98
|
-
if (name.startsWith('use') && name.length > 3 && name[3] === name[3].toUpperCase()) {
|
|
99
|
-
return 'hook_return';
|
|
100
|
-
}
|
|
101
|
-
return 'export_function';
|
|
102
|
-
}
|
|
103
|
-
function getSignatureText(fn) {
|
|
104
|
-
const params = fn.getParameters().map(p => {
|
|
105
|
-
const name = p.getName();
|
|
106
|
-
const type = p.getTypeNode()?.getText() ?? 'unknown';
|
|
107
|
-
const optional = p.isOptional() ? '?' : '';
|
|
108
|
-
return `${name}${optional}: ${type}`;
|
|
109
|
-
});
|
|
110
|
-
const returnType = fn.getReturnTypeNode()?.getText() ?? 'unknown';
|
|
111
|
-
return `(${params.join(', ')}) => ${returnType}`;
|
|
112
|
-
}
|
|
113
|
-
function getVarSignature(decl) {
|
|
114
|
-
const typeNode = decl.getTypeNode();
|
|
115
|
-
if (typeNode)
|
|
116
|
-
return typeNode.getText();
|
|
117
|
-
// Try to infer from initializer
|
|
118
|
-
try {
|
|
119
|
-
const type = decl.getType();
|
|
120
|
-
const text = type.getText(decl);
|
|
121
|
-
// Truncate long types
|
|
122
|
-
if (text.length > 200)
|
|
123
|
-
return text.substring(0, 197) + '...';
|
|
124
|
-
return text;
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
return 'unknown';
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
function getTypeAliasSignature(typeAlias) {
|
|
131
|
-
const typeNode = typeAlias.getTypeNode();
|
|
132
|
-
if (!typeNode)
|
|
133
|
-
return `type ${typeAlias.getName()}`;
|
|
134
|
-
const text = typeNode.getText();
|
|
135
|
-
if (text.length > 200)
|
|
136
|
-
return `type ${typeAlias.getName()} = ${text.substring(0, 150)}...`;
|
|
137
|
-
return `type ${typeAlias.getName()} = ${text}`;
|
|
138
|
-
}
|
|
139
|
-
function extractPropsFromInterface(iface, members) {
|
|
140
|
-
for (const prop of iface.getProperties()) {
|
|
141
|
-
extractPropMember(prop, members);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
function extractPropMember(prop, members) {
|
|
145
|
-
const name = prop.getName();
|
|
146
|
-
const typeNode = prop.getTypeNode();
|
|
147
|
-
const signature = typeNode ? typeNode.getText() : 'unknown';
|
|
148
|
-
const required = !prop.hasQuestionToken();
|
|
149
|
-
members.push({
|
|
150
|
-
memberType: 'prop',
|
|
151
|
-
name,
|
|
152
|
-
signature,
|
|
153
|
-
required,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=ast-extraction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ast-extraction.js","sourceRoot":"","sources":["../../src/scanner/ast-extraction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { ComponentType, DiscoveredFile } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Classify a directory component type based on its path.
|
|
4
|
-
*/
|
|
5
|
-
export declare function classifyDirectory(relPath: string): ComponentType;
|
|
6
|
-
/**
|
|
7
|
-
* Walk the source tree and discover all TypeScript/JavaScript files.
|
|
8
|
-
*/
|
|
9
|
-
export declare function discoverFiles(repoRoot: string, sourceRoot: string): DiscoveredFile[];
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
// File discovery and classification for the component scanner.
|
|
2
|
-
import * as fs from 'node:fs';
|
|
3
|
-
import * as path from 'node:path';
|
|
4
|
-
const SKIP_DIRS = new Set([
|
|
5
|
-
'node_modules', 'dist', 'coverage', '.vite', '.git', '.telora',
|
|
6
|
-
'__tests__', '__mocks__', '.next', 'build',
|
|
7
|
-
]);
|
|
8
|
-
const SKIP_FILE_PATTERNS = [
|
|
9
|
-
/\.test\.[jt]sx?$/,
|
|
10
|
-
/\.spec\.[jt]sx?$/,
|
|
11
|
-
/\.stories\.[jt]sx?$/,
|
|
12
|
-
/\.d\.ts$/,
|
|
13
|
-
];
|
|
14
|
-
const TS_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);
|
|
15
|
-
/**
|
|
16
|
-
* Classify a file based on its directory path and content patterns.
|
|
17
|
-
*/
|
|
18
|
-
function classifyFile(relPath, content) {
|
|
19
|
-
const parts = relPath.split('/');
|
|
20
|
-
// Check if this is a barrel file (index.ts with only re-exports)
|
|
21
|
-
if (path.basename(relPath).match(/^index\.[jt]sx?$/)) {
|
|
22
|
-
const hasExportFrom = /export\s+\{[^}]*\}\s+from\s+/m.test(content);
|
|
23
|
-
const hasExportStar = /export\s+\*\s+from\s+/m.test(content);
|
|
24
|
-
const hasOwnCode = /^(?:const|let|var|function|class|interface|type)\s/m.test(content);
|
|
25
|
-
if ((hasExportFrom || hasExportStar) && !hasOwnCode) {
|
|
26
|
-
return 'barrel';
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
// Directory-based classification
|
|
30
|
-
for (const part of parts) {
|
|
31
|
-
if (part === 'pages' || part === 'routes')
|
|
32
|
-
return 'page';
|
|
33
|
-
if (part === 'hooks')
|
|
34
|
-
return 'hook';
|
|
35
|
-
if (part === 'contexts')
|
|
36
|
-
return 'context';
|
|
37
|
-
if (part === 'types')
|
|
38
|
-
return 'type_definition';
|
|
39
|
-
}
|
|
40
|
-
// Check for component directories
|
|
41
|
-
if (parts.includes('components') || parts.includes('ui'))
|
|
42
|
-
return 'component';
|
|
43
|
-
// Check for lib/utils
|
|
44
|
-
if (parts.includes('lib') || parts.includes('utils'))
|
|
45
|
-
return 'library';
|
|
46
|
-
// Content-based heuristics for ambiguous files
|
|
47
|
-
const hasJsx = /(?:React\.createElement|<[A-Z]|\breturn\s+\(?\s*<)/m.test(content);
|
|
48
|
-
const hasUsePrefix = /^export\s+(?:function|const)\s+use[A-Z]/m.test(content);
|
|
49
|
-
if (hasUsePrefix)
|
|
50
|
-
return 'hook';
|
|
51
|
-
if (hasJsx)
|
|
52
|
-
return 'component';
|
|
53
|
-
// Type-only files
|
|
54
|
-
if (relPath.endsWith('.ts') && !relPath.endsWith('.tsx')) {
|
|
55
|
-
const hasOnlyTypes = /^(?:export\s+)?(?:type|interface)\s/m.test(content) &&
|
|
56
|
-
!/^(?:export\s+)?(?:function|const|let|var|class)\s/m.test(content);
|
|
57
|
-
if (hasOnlyTypes)
|
|
58
|
-
return 'type_definition';
|
|
59
|
-
}
|
|
60
|
-
return 'utility';
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Classify a directory component type based on its path.
|
|
64
|
-
*/
|
|
65
|
-
export function classifyDirectory(relPath) {
|
|
66
|
-
const name = path.basename(relPath);
|
|
67
|
-
if (name === 'pages' || name === 'routes')
|
|
68
|
-
return 'page';
|
|
69
|
-
if (name === 'hooks')
|
|
70
|
-
return 'hook';
|
|
71
|
-
if (name === 'contexts')
|
|
72
|
-
return 'context';
|
|
73
|
-
if (name === 'types')
|
|
74
|
-
return 'type_definition';
|
|
75
|
-
if (name === 'components' || name === 'ui')
|
|
76
|
-
return 'component';
|
|
77
|
-
if (name === 'lib' || name === 'utils')
|
|
78
|
-
return 'library';
|
|
79
|
-
return 'library'; // default for directories
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Walk the source tree and discover all TypeScript/JavaScript files.
|
|
83
|
-
*/
|
|
84
|
-
export function discoverFiles(repoRoot, sourceRoot) {
|
|
85
|
-
const absSourceRoot = path.resolve(repoRoot, sourceRoot);
|
|
86
|
-
const files = [];
|
|
87
|
-
function walk(dir) {
|
|
88
|
-
let entries;
|
|
89
|
-
try {
|
|
90
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
for (const entry of entries) {
|
|
96
|
-
const absPath = path.join(dir, entry.name);
|
|
97
|
-
const relPath = path.relative(repoRoot, absPath);
|
|
98
|
-
if (entry.isDirectory()) {
|
|
99
|
-
if (SKIP_DIRS.has(entry.name))
|
|
100
|
-
continue;
|
|
101
|
-
walk(absPath);
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
if (!entry.isFile())
|
|
105
|
-
continue;
|
|
106
|
-
const ext = path.extname(entry.name);
|
|
107
|
-
if (!TS_EXTENSIONS.has(ext))
|
|
108
|
-
continue;
|
|
109
|
-
// Skip test/story files
|
|
110
|
-
if (SKIP_FILE_PATTERNS.some(p => p.test(entry.name)))
|
|
111
|
-
continue;
|
|
112
|
-
let content;
|
|
113
|
-
try {
|
|
114
|
-
content = fs.readFileSync(absPath, 'utf-8');
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
const lineCount = content.split('\n').length;
|
|
120
|
-
const componentType = classifyFile(relPath, content);
|
|
121
|
-
const displayName = path.basename(entry.name, ext);
|
|
122
|
-
files.push({
|
|
123
|
-
path: relPath,
|
|
124
|
-
name: displayName,
|
|
125
|
-
componentType,
|
|
126
|
-
lineCount,
|
|
127
|
-
parentDir: path.dirname(relPath),
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
walk(absSourceRoot);
|
|
132
|
-
return files;
|
|
133
|
-
}
|
|
134
|
-
//# sourceMappingURL=file-discovery.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-discovery.js","sourceRoot":"","sources":["../../src/scanner/file-discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/scanner/index.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { type TrackerConfig } from '../shared.js';
|
|
2
|
-
export interface ScanOptions {
|
|
3
|
-
productId: string;
|
|
4
|
-
repoPath: string;
|
|
5
|
-
sourceRoot?: string;
|
|
6
|
-
maxScans?: number;
|
|
7
|
-
}
|
|
8
|
-
export interface ScanResult {
|
|
9
|
-
scanId: string;
|
|
10
|
-
componentCount: number;
|
|
11
|
-
memberCount: number;
|
|
12
|
-
relationshipCount: number;
|
|
13
|
-
commitSha: string | null;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Run a full component scan: discover files, parse AST, extract relationships,
|
|
17
|
-
* persist to DB via product API.
|
|
18
|
-
*/
|
|
19
|
-
export declare function runScan(creds: TrackerConfig, options: ScanOptions): Promise<ScanResult>;
|
package/dist/scanner/index.js
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
// Scanner orchestrator: runs file discovery, AST extraction, relationship
|
|
2
|
-
// extraction, and persists results via the product API.
|
|
3
|
-
import * as path from 'node:path';
|
|
4
|
-
import { execSync } from 'node:child_process';
|
|
5
|
-
import { discoverFiles, classifyDirectory } from './file-discovery.js';
|
|
6
|
-
import { createProject, extractMembers } from './ast-extraction.js';
|
|
7
|
-
import { extractRelationships, parseTsconfigPaths } from './relationship-extraction.js';
|
|
8
|
-
import { callProductApi } from '../shared.js';
|
|
9
|
-
/**
|
|
10
|
-
* Run a full component scan: discover files, parse AST, extract relationships,
|
|
11
|
-
* persist to DB via product API.
|
|
12
|
-
*/
|
|
13
|
-
export async function runScan(creds, options) {
|
|
14
|
-
const { productId, repoPath, sourceRoot = 'src/', maxScans } = options;
|
|
15
|
-
// Get current commit SHA
|
|
16
|
-
let commitSha = null;
|
|
17
|
-
try {
|
|
18
|
-
commitSha = execSync('git rev-parse HEAD', { cwd: repoPath, encoding: 'utf-8' }).trim();
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
// Not a git repo or no commits — continue without SHA
|
|
22
|
-
}
|
|
23
|
-
// Step 1: Create scan record
|
|
24
|
-
const createResult = await callProductApi(creds, {
|
|
25
|
-
action: 'component_scan_create',
|
|
26
|
-
productId,
|
|
27
|
-
sourceRoot,
|
|
28
|
-
fields: { commitSha },
|
|
29
|
-
});
|
|
30
|
-
const scanId = createResult.scan.id;
|
|
31
|
-
try {
|
|
32
|
-
// Step 2: Discover files
|
|
33
|
-
const files = discoverFiles(repoPath, sourceRoot);
|
|
34
|
-
// Step 3: Build directory hierarchy
|
|
35
|
-
const { components } = buildComponentHierarchy(files, sourceRoot);
|
|
36
|
-
// Step 4: Extract members via AST
|
|
37
|
-
const members = [];
|
|
38
|
-
const project = createProject(repoPath);
|
|
39
|
-
const knownPaths = new Set(files.map(f => f.path));
|
|
40
|
-
for (const file of files) {
|
|
41
|
-
const absPath = path.resolve(repoPath, file.path);
|
|
42
|
-
const tempId = file.path; // path is the temp ID
|
|
43
|
-
try {
|
|
44
|
-
const sourceFile = project.addSourceFileAtPath(absPath);
|
|
45
|
-
const extractedMembers = extractMembers(sourceFile);
|
|
46
|
-
for (const m of extractedMembers) {
|
|
47
|
-
members.push({
|
|
48
|
-
componentTempId: tempId,
|
|
49
|
-
memberType: m.memberType,
|
|
50
|
-
name: m.name,
|
|
51
|
-
signature: m.signature,
|
|
52
|
-
required: m.required,
|
|
53
|
-
defaultValue: m.defaultValue,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
// Skip files that can't be parsed
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
// Step 5: Extract relationships
|
|
63
|
-
const relationships = [];
|
|
64
|
-
const pathAliases = parseTsconfigPaths(repoPath);
|
|
65
|
-
const tempIdByPath = new Map();
|
|
66
|
-
for (const c of components) {
|
|
67
|
-
tempIdByPath.set(c.path, c.tempId);
|
|
68
|
-
}
|
|
69
|
-
for (const file of files) {
|
|
70
|
-
const absPath = path.resolve(repoPath, file.path);
|
|
71
|
-
try {
|
|
72
|
-
const sourceFile = project.getSourceFile(absPath);
|
|
73
|
-
if (!sourceFile)
|
|
74
|
-
continue;
|
|
75
|
-
const extracted = extractRelationships(sourceFile, file.path, knownPaths, repoPath, pathAliases);
|
|
76
|
-
for (const rel of extracted) {
|
|
77
|
-
const sourceTempId = tempIdByPath.get(rel.sourcePath);
|
|
78
|
-
const targetTempId = tempIdByPath.get(rel.targetPath);
|
|
79
|
-
if (sourceTempId && targetTempId && sourceTempId !== targetTempId) {
|
|
80
|
-
relationships.push({
|
|
81
|
-
sourceTempId,
|
|
82
|
-
targetTempId,
|
|
83
|
-
relationshipType: rel.relationshipType,
|
|
84
|
-
metadata: rel.metadata,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
// Deduplicate relationships (same source+target+type)
|
|
94
|
-
const relKey = (r) => `${r.sourceTempId}|${r.targetTempId}|${r.relationshipType}`;
|
|
95
|
-
const seenRels = new Set();
|
|
96
|
-
const uniqueRelationships = relationships.filter(r => {
|
|
97
|
-
const key = relKey(r);
|
|
98
|
-
if (seenRels.has(key))
|
|
99
|
-
return false;
|
|
100
|
-
seenRels.add(key);
|
|
101
|
-
return true;
|
|
102
|
-
});
|
|
103
|
-
// Step 6: Persist everything (also triggers cleanup of old scans)
|
|
104
|
-
const persistPayload = {
|
|
105
|
-
action: 'component_scan_persist',
|
|
106
|
-
scanId,
|
|
107
|
-
components,
|
|
108
|
-
members,
|
|
109
|
-
relationships: uniqueRelationships,
|
|
110
|
-
};
|
|
111
|
-
if (maxScans !== undefined)
|
|
112
|
-
persistPayload.maxScans = maxScans;
|
|
113
|
-
const persistResult = await callProductApi(creds, persistPayload);
|
|
114
|
-
return {
|
|
115
|
-
scanId,
|
|
116
|
-
componentCount: persistResult.componentCount,
|
|
117
|
-
memberCount: persistResult.memberCount,
|
|
118
|
-
relationshipCount: persistResult.relationshipCount,
|
|
119
|
-
commitSha,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
123
|
-
// Mark scan as failed
|
|
124
|
-
try {
|
|
125
|
-
await callProductApi(creds, {
|
|
126
|
-
action: 'component_scan_update',
|
|
127
|
-
scanId,
|
|
128
|
-
fields: {
|
|
129
|
-
status: 'failed',
|
|
130
|
-
metadata: { error: err.message },
|
|
131
|
-
},
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
catch {
|
|
135
|
-
// Best effort
|
|
136
|
-
}
|
|
137
|
-
throw err;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Build the component hierarchy from discovered files.
|
|
142
|
-
* Creates directory components as parents, file components as children.
|
|
143
|
-
*/
|
|
144
|
-
function buildComponentHierarchy(files, sourceRoot) {
|
|
145
|
-
const components = [];
|
|
146
|
-
const dirTempIds = new Map();
|
|
147
|
-
// Collect all unique directories
|
|
148
|
-
const dirs = new Set();
|
|
149
|
-
for (const file of files) {
|
|
150
|
-
let dir = file.parentDir;
|
|
151
|
-
while (dir && dir !== '.' && dir !== sourceRoot.replace(/\/$/, '')) {
|
|
152
|
-
dirs.add(dir);
|
|
153
|
-
dir = path.dirname(dir);
|
|
154
|
-
// Stop at sourceRoot level
|
|
155
|
-
if (dir.length < sourceRoot.replace(/\/$/, '').length)
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// Sort directories by depth (parents first)
|
|
160
|
-
const sortedDirs = [...dirs].sort((a, b) => {
|
|
161
|
-
const aDepth = a.split('/').length;
|
|
162
|
-
const bDepth = b.split('/').length;
|
|
163
|
-
return aDepth - bDepth;
|
|
164
|
-
});
|
|
165
|
-
// Create directory components
|
|
166
|
-
for (const dir of sortedDirs) {
|
|
167
|
-
const parentDir = path.dirname(dir);
|
|
168
|
-
const parentTempId = dirTempIds.get(parentDir);
|
|
169
|
-
const tempId = `dir:${dir}`;
|
|
170
|
-
dirTempIds.set(dir, tempId);
|
|
171
|
-
components.push({
|
|
172
|
-
tempId,
|
|
173
|
-
parentTempId: parentTempId,
|
|
174
|
-
name: path.basename(dir),
|
|
175
|
-
path: dir,
|
|
176
|
-
componentType: classifyDirectory(dir),
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
// Create file components
|
|
180
|
-
for (const file of files) {
|
|
181
|
-
const parentTempId = dirTempIds.get(file.parentDir);
|
|
182
|
-
components.push({
|
|
183
|
-
tempId: file.path,
|
|
184
|
-
parentTempId: parentTempId,
|
|
185
|
-
name: file.name,
|
|
186
|
-
path: file.path,
|
|
187
|
-
componentType: file.componentType,
|
|
188
|
-
lineCount: file.lineCount,
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
return { components, dirTempIds };
|
|
192
|
-
}
|
|
193
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wDAAwD;AAExD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,cAAc,EAAsB,MAAM,cAAc,CAAC;AAuBlE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAoB,EACpB,OAAoB;IAEpB,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEvE,yBAAyB;IACzB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,CAAC;QACH,SAAS,GAAG,QAAQ,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;IAED,6BAA6B;IAC7B,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE;QAC/C,MAAM,EAAE,uBAAuB;QAC/B,SAAS;QACT,UAAU;QACV,MAAM,EAAE,EAAE,SAAS,EAAE;KACtB,CAA6B,CAAC;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,yBAAyB;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAElD,oCAAoC;QACpC,MAAM,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAElE,kCAAkC;QAClC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,sBAAsB;YAEhD,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBACxD,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;gBAEpD,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC;wBACX,eAAe,EAAE,MAAM;wBACvB,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,YAAY,EAAE,CAAC,CAAC,YAAY;qBAC7B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;gBAClC,SAAS;YACX,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,MAAM,aAAa,GAAwB,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAE1B,MAAM,SAAS,GAAG,oBAAoB,CACpC,UAAU,EACV,IAAI,CAAC,IAAI,EACT,UAAU,EACV,QAAQ,EACR,WAAW,CACZ,CAAC;gBAEF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC5B,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACtD,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;oBACtD,IAAI,YAAY,IAAI,YAAY,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;wBAClE,aAAa,CAAC,IAAI,CAAC;4BACjB,YAAY;4BACZ,YAAY;4BACZ,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;4BACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ;yBACvB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,MAAM,MAAM,GAAG,CAAC,CAAoB,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACnD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,kEAAkE;QAClE,MAAM,cAAc,GAA4B;YAC9C,MAAM,EAAE,wBAAwB;YAChC,MAAM;YACN,UAAU;YACV,OAAO;YACP,aAAa,EAAE,mBAAmB;SACnC,CAAC;QACF,IAAI,QAAQ,KAAK,SAAS;YAAE,cAAc,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE/D,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,cAAc,CAE/D,CAAC;QAEF,OAAO;YACL,MAAM;YACN,cAAc,EAAE,aAAa,CAAC,cAAc;YAC5C,WAAW,EAAE,aAAa,CAAC,WAAW;YACtC,iBAAiB,EAAE,aAAa,CAAC,iBAAiB;YAClD,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sBAAsB;QACtB,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,KAAK,EAAE;gBAC1B,MAAM,EAAE,uBAAuB;gBAC/B,MAAM;gBACN,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE;iBAC5C;aACF,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAC9B,KAAuB,EACvB,UAAkB;IAElB,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE7C,iCAAiC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;QACzB,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxB,2BAA2B;YAC3B,IAAI,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM;gBAAE,MAAM;QAC/D,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACnC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACnC,OAAO,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,OAAO,GAAG,EAAE,CAAC;QAC5B,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE5B,UAAU,CAAC,IAAI,CAAC;YACd,MAAM;YACN,YAAY,EAAE,YAAY;YAC1B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,aAAa,EAAE,iBAAiB,CAAC,GAAG,CAAC;SACtC,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,UAAU,CAAC,IAAI,CAAC;YACd,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,YAAY,EAAE,YAAY;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { SourceFile } from 'ts-morph';
|
|
2
|
-
import type { ExtractedRelationship } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Extract import relationships from a source file.
|
|
5
|
-
* Only tracks imports that resolve to discovered components (internal).
|
|
6
|
-
*/
|
|
7
|
-
export declare function extractRelationships(sourceFile: SourceFile, sourcePath: string, knownPaths: Set<string>, repoRoot: string, pathAliases: Record<string, string>): ExtractedRelationship[];
|
|
8
|
-
/**
|
|
9
|
-
* Parse tsconfig.json paths to extract alias mappings.
|
|
10
|
-
*/
|
|
11
|
-
export declare function parseTsconfigPaths(repoRoot: string): Record<string, string>;
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
// Extract import relationships between discovered components.
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import * as fs from 'node:fs';
|
|
4
|
-
/**
|
|
5
|
-
* Extract import relationships from a source file.
|
|
6
|
-
* Only tracks imports that resolve to discovered components (internal).
|
|
7
|
-
*/
|
|
8
|
-
export function extractRelationships(sourceFile, sourcePath, knownPaths, repoRoot, pathAliases) {
|
|
9
|
-
const relationships = [];
|
|
10
|
-
// Process import declarations
|
|
11
|
-
for (const importDecl of sourceFile.getImportDeclarations()) {
|
|
12
|
-
const moduleSpecifier = importDecl.getModuleSpecifierValue();
|
|
13
|
-
const resolvedPath = resolveImportPath(sourcePath, moduleSpecifier, knownPaths, repoRoot, pathAliases);
|
|
14
|
-
if (!resolvedPath)
|
|
15
|
-
continue;
|
|
16
|
-
const namedImports = importDecl.getNamedImports().map(ni => ni.getName());
|
|
17
|
-
const defaultImport = importDecl.getDefaultImport()?.getText();
|
|
18
|
-
const namespaceImport = importDecl.getNamespaceImport()?.getText();
|
|
19
|
-
const allImports = [
|
|
20
|
-
...namedImports,
|
|
21
|
-
...(defaultImport ? [defaultImport] : []),
|
|
22
|
-
...(namespaceImport ? [namespaceImport] : []),
|
|
23
|
-
];
|
|
24
|
-
relationships.push({
|
|
25
|
-
sourcePath,
|
|
26
|
-
targetPath: resolvedPath,
|
|
27
|
-
relationshipType: 'imports',
|
|
28
|
-
metadata: { namedImports: allImports },
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
// Process re-exports (export { X } from './Y')
|
|
32
|
-
for (const exportDecl of sourceFile.getExportDeclarations()) {
|
|
33
|
-
const moduleSpecifier = exportDecl.getModuleSpecifierValue();
|
|
34
|
-
if (!moduleSpecifier)
|
|
35
|
-
continue;
|
|
36
|
-
const resolvedPath = resolveImportPath(sourcePath, moduleSpecifier, knownPaths, repoRoot, pathAliases);
|
|
37
|
-
if (!resolvedPath)
|
|
38
|
-
continue;
|
|
39
|
-
const namedExports = exportDecl.getNamedExports().map(ne => ne.getName());
|
|
40
|
-
const isStarExport = exportDecl.isNamespaceExport() || namedExports.length === 0;
|
|
41
|
-
relationships.push({
|
|
42
|
-
sourcePath,
|
|
43
|
-
targetPath: resolvedPath,
|
|
44
|
-
relationshipType: 're_exports',
|
|
45
|
-
metadata: {
|
|
46
|
-
namedExports: isStarExport ? ['*'] : namedExports,
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
// Detect JSX renders (component A renders component B)
|
|
51
|
-
detectRenders(sourceFile, sourcePath, knownPaths, repoRoot, pathAliases, relationships);
|
|
52
|
-
return relationships;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Resolve an import specifier to a known component path.
|
|
56
|
-
*/
|
|
57
|
-
function resolveImportPath(sourcePath, specifier, knownPaths, repoRoot, pathAliases) {
|
|
58
|
-
// Skip external packages
|
|
59
|
-
if (!specifier.startsWith('.') && !specifier.startsWith('@/') && !specifier.startsWith('~/')) {
|
|
60
|
-
// Check path aliases
|
|
61
|
-
let resolved = null;
|
|
62
|
-
for (const [alias, target] of Object.entries(pathAliases)) {
|
|
63
|
-
const aliasPrefix = alias.replace('/*', '/');
|
|
64
|
-
const targetPrefix = target.replace('/*', '/');
|
|
65
|
-
if (specifier.startsWith(aliasPrefix)) {
|
|
66
|
-
const rest = specifier.slice(aliasPrefix.length);
|
|
67
|
-
resolved = targetPrefix + rest;
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
// Exact match (no wildcard)
|
|
71
|
-
if (alias === specifier) {
|
|
72
|
-
resolved = target;
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (!resolved)
|
|
77
|
-
return null;
|
|
78
|
-
return tryResolveToKnown(resolved, knownPaths);
|
|
79
|
-
}
|
|
80
|
-
// Handle @/ alias (common in Vite/Next projects)
|
|
81
|
-
if (specifier.startsWith('@/') || specifier.startsWith('~/')) {
|
|
82
|
-
const aliasValue = pathAliases['@/*'] || pathAliases['~/*'] || 'src/*';
|
|
83
|
-
const targetPrefix = aliasValue.replace('/*', '/');
|
|
84
|
-
const rest = specifier.slice(2); // remove @/ or ~/
|
|
85
|
-
return tryResolveToKnown(targetPrefix + rest, knownPaths);
|
|
86
|
-
}
|
|
87
|
-
// Relative import
|
|
88
|
-
const sourceDir = path.dirname(sourcePath);
|
|
89
|
-
const resolved = path.normalize(path.join(sourceDir, specifier));
|
|
90
|
-
return tryResolveToKnown(resolved, knownPaths);
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Try to resolve a partial path to a known component path.
|
|
94
|
-
* Handles: exact match, .ts/.tsx extension, /index.ts barrel.
|
|
95
|
-
*/
|
|
96
|
-
function tryResolveToKnown(partial, knownPaths) {
|
|
97
|
-
// Normalize separators
|
|
98
|
-
const normalized = partial.replace(/\\/g, '/');
|
|
99
|
-
// Exact match
|
|
100
|
-
if (knownPaths.has(normalized))
|
|
101
|
-
return normalized;
|
|
102
|
-
// Try extensions
|
|
103
|
-
const extensions = ['.ts', '.tsx', '.js', '.jsx'];
|
|
104
|
-
for (const ext of extensions) {
|
|
105
|
-
const withExt = normalized + ext;
|
|
106
|
-
if (knownPaths.has(withExt))
|
|
107
|
-
return withExt;
|
|
108
|
-
}
|
|
109
|
-
// Try index file
|
|
110
|
-
for (const ext of extensions) {
|
|
111
|
-
const indexPath = normalized + '/index' + ext;
|
|
112
|
-
if (knownPaths.has(indexPath))
|
|
113
|
-
return indexPath;
|
|
114
|
-
}
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Detect JSX render relationships by scanning import declarations
|
|
119
|
-
* and checking if imported identifiers appear in JSX-like patterns.
|
|
120
|
-
*/
|
|
121
|
-
function detectRenders(sourceFile, sourcePath, knownPaths, repoRoot, pathAliases, relationships) {
|
|
122
|
-
const text = sourceFile.getFullText();
|
|
123
|
-
// Collect imported component names (PascalCase = likely React component)
|
|
124
|
-
const importedComponents = new Map(); // name -> resolved path
|
|
125
|
-
for (const importDecl of sourceFile.getImportDeclarations()) {
|
|
126
|
-
const moduleSpecifier = importDecl.getModuleSpecifierValue();
|
|
127
|
-
const resolvedPath = resolveImportPath(sourcePath, moduleSpecifier, knownPaths, repoRoot, pathAliases);
|
|
128
|
-
if (!resolvedPath)
|
|
129
|
-
continue;
|
|
130
|
-
const defaultImport = importDecl.getDefaultImport()?.getText();
|
|
131
|
-
if (defaultImport && isPascalCase(defaultImport)) {
|
|
132
|
-
importedComponents.set(defaultImport, resolvedPath);
|
|
133
|
-
}
|
|
134
|
-
for (const named of importDecl.getNamedImports()) {
|
|
135
|
-
const name = named.getAliasNode()?.getText() || named.getName();
|
|
136
|
-
if (isPascalCase(name)) {
|
|
137
|
-
importedComponents.set(name, resolvedPath);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
// Check if any imported PascalCase identifiers appear as JSX tags
|
|
142
|
-
for (const [name, targetPath] of importedComponents) {
|
|
143
|
-
// Look for <ComponentName or <ComponentName> patterns
|
|
144
|
-
const jsxPattern = new RegExp(`<${name}[\\s/>]`);
|
|
145
|
-
if (jsxPattern.test(text)) {
|
|
146
|
-
// Don't duplicate if we already have an imports relationship for this target
|
|
147
|
-
const existingImport = relationships.find(r => r.sourcePath === sourcePath && r.targetPath === targetPath && r.relationshipType === 'imports');
|
|
148
|
-
if (existingImport) {
|
|
149
|
-
// Upgrade: also add a renders relationship
|
|
150
|
-
relationships.push({
|
|
151
|
-
sourcePath,
|
|
152
|
-
targetPath,
|
|
153
|
-
relationshipType: 'renders',
|
|
154
|
-
metadata: { renderedComponent: name },
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
function isPascalCase(name) {
|
|
161
|
-
return /^[A-Z][a-zA-Z0-9]*$/.test(name);
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Parse tsconfig.json paths to extract alias mappings.
|
|
165
|
-
*/
|
|
166
|
-
export function parseTsconfigPaths(repoRoot) {
|
|
167
|
-
const aliases = {};
|
|
168
|
-
try {
|
|
169
|
-
const tsconfigPath = path.join(repoRoot, 'tsconfig.json');
|
|
170
|
-
const content = JSON.parse(fs.readFileSync(tsconfigPath, 'utf-8'));
|
|
171
|
-
const paths = content?.compilerOptions?.paths;
|
|
172
|
-
if (paths) {
|
|
173
|
-
for (const [alias, targets] of Object.entries(paths)) {
|
|
174
|
-
const targetArray = targets;
|
|
175
|
-
if (targetArray.length > 0) {
|
|
176
|
-
aliases[alias] = targetArray[0];
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
catch {
|
|
182
|
-
// Default alias if tsconfig not found
|
|
183
|
-
aliases['@/*'] = 'src/*';
|
|
184
|
-
}
|
|
185
|
-
return aliases;
|
|
186
|
-
}
|
|
187
|
-
//# sourceMappingURL=relationship-extraction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-extraction.js","sourceRoot":"","sources":["../../src/scanner/relationship-extraction.ts"],"names":[],"mappings":"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"}
|
package/dist/scanner/types.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
export type ComponentType = 'page' | 'component' | 'hook' | 'context' | 'library' | 'utility' | 'type_definition' | 'barrel';
|
|
2
|
-
export type MemberType = 'prop' | 'method' | 'hook_return' | 'export_function' | 'export_const' | 'export_type' | 'state' | 'context_value';
|
|
3
|
-
export type RelationshipType = 'imports' | 're_exports' | 'renders';
|
|
4
|
-
export interface DiscoveredFile {
|
|
5
|
-
path: string;
|
|
6
|
-
name: string;
|
|
7
|
-
componentType: ComponentType;
|
|
8
|
-
lineCount: number;
|
|
9
|
-
parentDir: string;
|
|
10
|
-
}
|
|
11
|
-
export interface ExtractedMember {
|
|
12
|
-
memberType: MemberType;
|
|
13
|
-
name: string;
|
|
14
|
-
signature?: string;
|
|
15
|
-
required?: boolean;
|
|
16
|
-
defaultValue?: string;
|
|
17
|
-
}
|
|
18
|
-
export interface ExtractedRelationship {
|
|
19
|
-
sourcePath: string;
|
|
20
|
-
targetPath: string;
|
|
21
|
-
relationshipType: RelationshipType;
|
|
22
|
-
metadata?: Record<string, unknown>;
|
|
23
|
-
}
|
|
24
|
-
export interface ComponentInput {
|
|
25
|
-
tempId: string;
|
|
26
|
-
parentTempId?: string;
|
|
27
|
-
name: string;
|
|
28
|
-
path: string;
|
|
29
|
-
componentType: ComponentType;
|
|
30
|
-
lineCount?: number;
|
|
31
|
-
}
|
|
32
|
-
export interface MemberInput {
|
|
33
|
-
componentTempId: string;
|
|
34
|
-
memberType: MemberType;
|
|
35
|
-
name: string;
|
|
36
|
-
signature?: string;
|
|
37
|
-
required?: boolean;
|
|
38
|
-
defaultValue?: string;
|
|
39
|
-
}
|
|
40
|
-
export interface RelationshipInput {
|
|
41
|
-
sourceTempId: string;
|
|
42
|
-
targetTempId: string;
|
|
43
|
-
relationshipType: RelationshipType;
|
|
44
|
-
metadata?: Record<string, unknown>;
|
|
45
|
-
}
|
package/dist/scanner/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"AAAA,sCAAsC"}
|