tskb 0.0.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/LICENSE +21 -0
- package/README.md +1086 -0
- package/dist/cli/commands/build.d.ts +55 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +105 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/query.d.ts +10 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +399 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/visualize.d.ts +10 -0
- package/dist/cli/commands/visualize.d.ts.map +1 -0
- package/dist/cli/commands/visualize.js +26 -0
- package/dist/cli/commands/visualize.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +109 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/extraction/documentation.d.ts +28 -0
- package/dist/core/extraction/documentation.d.ts.map +1 -0
- package/dist/core/extraction/documentation.js +330 -0
- package/dist/core/extraction/documentation.js.map +1 -0
- package/dist/core/extraction/index.d.ts +11 -0
- package/dist/core/extraction/index.d.ts.map +1 -0
- package/dist/core/extraction/index.js +9 -0
- package/dist/core/extraction/index.js.map +1 -0
- package/dist/core/extraction/registry.d.ts +40 -0
- package/dist/core/extraction/registry.d.ts.map +1 -0
- package/dist/core/extraction/registry.js +604 -0
- package/dist/core/extraction/registry.js.map +1 -0
- package/dist/core/graph/builder.d.ts +37 -0
- package/dist/core/graph/builder.d.ts.map +1 -0
- package/dist/core/graph/builder.js +421 -0
- package/dist/core/graph/builder.js.map +1 -0
- package/dist/core/graph/index.d.ts +23 -0
- package/dist/core/graph/index.d.ts.map +1 -0
- package/dist/core/graph/index.js +25 -0
- package/dist/core/graph/index.js.map +1 -0
- package/dist/core/graph/types.d.ts +128 -0
- package/dist/core/graph/types.d.ts.map +1 -0
- package/dist/core/graph/types.js +9 -0
- package/dist/core/graph/types.js.map +1 -0
- package/dist/core/visualization/dot-generator.d.ts +13 -0
- package/dist/core/visualization/dot-generator.d.ts.map +1 -0
- package/dist/core/visualization/dot-generator.js +200 -0
- package/dist/core/visualization/dot-generator.js.map +1 -0
- package/dist/core/visualization/index.d.ts +20 -0
- package/dist/core/visualization/index.d.ts.map +1 -0
- package/dist/core/visualization/index.js +23 -0
- package/dist/core/visualization/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-runtime.d.ts +7 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +11 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/runtime/jsx.d.ts +84 -0
- package/dist/runtime/jsx.d.ts.map +1 -0
- package/dist/runtime/jsx.js +93 -0
- package/dist/runtime/jsx.js.map +1 -0
- package/dist/runtime/registry.d.ts +61 -0
- package/dist/runtime/registry.d.ts.map +1 -0
- package/dist/runtime/registry.js +2 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/typescript/index.d.ts +7 -0
- package/dist/typescript/index.d.ts.map +1 -0
- package/dist/typescript/index.js +7 -0
- package/dist/typescript/index.js.map +1 -0
- package/dist/typescript/program.d.ts +33 -0
- package/dist/typescript/program.d.ts.map +1 -0
- package/dist/typescript/program.js +84 -0
- package/dist/typescript/program.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Extracts the vocabulary (Folders, Modules, Terms) from the TypeScript type system.
|
|
5
|
+
*
|
|
6
|
+
* This uses the TypeScript compiler API to resolve the global `tskb` namespace
|
|
7
|
+
* and extract all declaration-merged interfaces.
|
|
8
|
+
*
|
|
9
|
+
* @param program - TypeScript program containing the source files
|
|
10
|
+
* @param baseDir - Base directory for resolving and storing relative paths (typically tsconfig rootDir)
|
|
11
|
+
* @param tsconfigPath - Path to tsconfig.json (for reading additional config if needed)
|
|
12
|
+
* @returns Extracted registry data
|
|
13
|
+
*/
|
|
14
|
+
export function extractRegistry(program, baseDir, tsconfigPath) {
|
|
15
|
+
const checker = program.getTypeChecker();
|
|
16
|
+
const registry = {
|
|
17
|
+
folders: new Map(),
|
|
18
|
+
modules: new Map(),
|
|
19
|
+
terms: new Map(),
|
|
20
|
+
exports: new Map(),
|
|
21
|
+
};
|
|
22
|
+
// Use the provided baseDir for all path resolution
|
|
23
|
+
const baseUrl = baseDir;
|
|
24
|
+
// Find all source files that might contain tskb declarations
|
|
25
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
26
|
+
// Skip node_modules and lib files
|
|
27
|
+
if (sourceFile.isDeclarationFile && sourceFile.fileName.includes("node_modules")) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// Look for global namespace declarations
|
|
31
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
32
|
+
if (ts.isModuleDeclaration(node) && node.name.text === "global") {
|
|
33
|
+
extractFromGlobalNamespace(node, checker, registry, sourceFile, baseDir, baseUrl);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return registry;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Extract tskb interfaces from a global namespace declaration.
|
|
41
|
+
*
|
|
42
|
+
* WHAT WE'RE DOING:
|
|
43
|
+
* Once we find `declare global { ... }`, we need to look inside for `namespace tskb`.
|
|
44
|
+
* The AST structure is: ModuleDeclaration -> ModuleBlock -> statements[]
|
|
45
|
+
*
|
|
46
|
+
* We iterate through all statements looking for another ModuleDeclaration named "tskb".
|
|
47
|
+
*/
|
|
48
|
+
function extractFromGlobalNamespace(globalNode, checker, registry, sourceFile, tsconfigDir, baseUrl) {
|
|
49
|
+
if (!globalNode.body || !ts.isModuleBlock(globalNode.body))
|
|
50
|
+
return;
|
|
51
|
+
// Look for `namespace tskb`
|
|
52
|
+
for (const statement of globalNode.body.statements) {
|
|
53
|
+
if (ts.isModuleDeclaration(statement) &&
|
|
54
|
+
ts.isIdentifier(statement.name) &&
|
|
55
|
+
statement.name.text === "tskb") {
|
|
56
|
+
extractFromTskbNamespace(statement, checker, registry, sourceFile, tsconfigDir, baseUrl);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Extract Folders, Modules, Terms from the tskb namespace
|
|
62
|
+
*/
|
|
63
|
+
function extractFromTskbNamespace(tskbNode, checker, registry, sourceFile, tsconfigDir, baseUrl) {
|
|
64
|
+
if (!tskbNode.body || !ts.isModuleBlock(tskbNode.body))
|
|
65
|
+
return;
|
|
66
|
+
for (const statement of tskbNode.body.statements) {
|
|
67
|
+
if (!ts.isInterfaceDeclaration(statement))
|
|
68
|
+
continue;
|
|
69
|
+
const interfaceName = statement.name.text;
|
|
70
|
+
if (interfaceName === "Folders") {
|
|
71
|
+
extractFolders(statement, checker, registry, sourceFile, tsconfigDir, baseUrl);
|
|
72
|
+
}
|
|
73
|
+
else if (interfaceName === "Modules") {
|
|
74
|
+
extractModules(statement, checker, registry, sourceFile, tsconfigDir, baseUrl);
|
|
75
|
+
}
|
|
76
|
+
else if (interfaceName === "Terms") {
|
|
77
|
+
extractTerms(statement, checker, registry, sourceFile);
|
|
78
|
+
}
|
|
79
|
+
else if (interfaceName == "Exports") {
|
|
80
|
+
extractExports(statement, checker, registry, sourceFile, tsconfigDir, baseUrl);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Extract all Folders from the Folders interface.
|
|
86
|
+
*
|
|
87
|
+
* INTERFACE PARSING:
|
|
88
|
+
* Given:
|
|
89
|
+
* ```ts
|
|
90
|
+
* interface Folders {
|
|
91
|
+
* Auth: Folder<{ desc: "Authentication", path: "/auth" }>;
|
|
92
|
+
* Billing: Folder<{ desc: "Payment system" }>;
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* We iterate through each property signature (Auth, Billing, etc.):
|
|
97
|
+
* 1. Get the property name ("Auth")
|
|
98
|
+
* 2. Get the type node (Folder<{...}>)
|
|
99
|
+
* 3. Call extractFolderType to pull out desc and path literals
|
|
100
|
+
* 4. Store in registry.folders Map: "Auth" -> { desc, path }
|
|
101
|
+
*/
|
|
102
|
+
function extractFolders(interfaceNode, checker, registry, sourceFile, tsconfigDir, baseUrl) {
|
|
103
|
+
for (const member of interfaceNode.members) {
|
|
104
|
+
if (!ts.isPropertySignature(member))
|
|
105
|
+
continue;
|
|
106
|
+
if (!member.name || (!ts.isIdentifier(member.name) && !ts.isStringLiteral(member.name)))
|
|
107
|
+
continue;
|
|
108
|
+
const folderName = member.name.text;
|
|
109
|
+
const type = member.type;
|
|
110
|
+
if (!type)
|
|
111
|
+
continue;
|
|
112
|
+
// Extract Folder<{ desc: "...", path: "..." }>
|
|
113
|
+
const folderData = extractFolderType(type, checker);
|
|
114
|
+
if (!folderData) {
|
|
115
|
+
// Invalid Folder definition - throw descriptive error
|
|
116
|
+
const typeText = type.getText();
|
|
117
|
+
throw new Error(`Invalid Folder definition for "${folderName}" in ${sourceFile.fileName}:\n` +
|
|
118
|
+
` Expected: Folder<{ desc: string; path: string }>\n` +
|
|
119
|
+
` Received: ${typeText}\n` +
|
|
120
|
+
` All properties in the Folders interface must use the Folder<...> helper type.`);
|
|
121
|
+
}
|
|
122
|
+
if (folderData) {
|
|
123
|
+
// Resolve and validate path if present
|
|
124
|
+
let resolvedPath;
|
|
125
|
+
let pathExists = false;
|
|
126
|
+
if (folderData.path) {
|
|
127
|
+
// Strip leading slash from path (folders use "/path" convention)
|
|
128
|
+
// Also strip trailing slash for consistent checking
|
|
129
|
+
let normalizedPath = folderData.path.startsWith("/")
|
|
130
|
+
? folderData.path.slice(1)
|
|
131
|
+
: folderData.path;
|
|
132
|
+
normalizedPath = normalizedPath.replace(/\/$/, "");
|
|
133
|
+
// Try to resolve path from baseUrl (tsconfig baseUrl/rootDir)
|
|
134
|
+
const absoluteFromBaseUrl = path.resolve(baseUrl, normalizedPath);
|
|
135
|
+
const fileExistsCheck = ts.sys.fileExists(absoluteFromBaseUrl);
|
|
136
|
+
const dirExistsCheck = ts.sys.directoryExists(absoluteFromBaseUrl);
|
|
137
|
+
if (fileExistsCheck || dirExistsCheck) {
|
|
138
|
+
// Store as relative path from baseUrl
|
|
139
|
+
resolvedPath = path.relative(baseUrl, absoluteFromBaseUrl).replace(/\\/g, "/");
|
|
140
|
+
pathExists = true;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Try relative to the source file where Folder was declared
|
|
144
|
+
const sourceFileDir = path.dirname(sourceFile.fileName);
|
|
145
|
+
const absoluteFromSourceFile = path.resolve(sourceFileDir, normalizedPath);
|
|
146
|
+
if (ts.sys.fileExists(absoluteFromSourceFile) ||
|
|
147
|
+
ts.sys.directoryExists(absoluteFromSourceFile)) {
|
|
148
|
+
// Store as relative path from baseUrl
|
|
149
|
+
resolvedPath = path.relative(baseUrl, absoluteFromSourceFile).replace(/\\/g, "/");
|
|
150
|
+
pathExists = true;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Path doesn't exist - throw error
|
|
154
|
+
throw new Error(`Folder path not found for "${folderName}" in ${sourceFile.fileName}:\n` +
|
|
155
|
+
` Specified path: "${folderData.path}"\n` +
|
|
156
|
+
` Tried resolving from:\n` +
|
|
157
|
+
` - Repository root (${baseUrl}): ${absoluteFromBaseUrl}\n` +
|
|
158
|
+
` - Source file directory (${sourceFileDir}): ${absoluteFromSourceFile}\n` +
|
|
159
|
+
` Neither path exists. Please check the path is correct.`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
registry.folders.set(folderName, {
|
|
164
|
+
...folderData,
|
|
165
|
+
resolvedPath,
|
|
166
|
+
pathExists,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Extract desc and path from Folder<{ ... }> type.
|
|
173
|
+
*
|
|
174
|
+
* THE TRICK: We're reading literal string values from type definitions.
|
|
175
|
+
* Given: Folder<{ desc: "Auth management", path: "/auth" }>
|
|
176
|
+
*
|
|
177
|
+
* We need to:
|
|
178
|
+
* 1. Check it's a TypeReferenceNode (generic type)
|
|
179
|
+
* 2. Get the first type argument (the object literal)
|
|
180
|
+
* 3. Walk the object's properties
|
|
181
|
+
* 4. For each property, if it's a literal type (string), extract the actual string value
|
|
182
|
+
*
|
|
183
|
+
* TypeScript represents `desc: "Auth management"` as:
|
|
184
|
+
* PropertySignature -> LiteralTypeNode -> StringLiteral -> .text = "Auth management"
|
|
185
|
+
*/
|
|
186
|
+
function extractFolderType(typeNode, checker) {
|
|
187
|
+
// Handle Folder<{ desc: "...", path: "..." }>
|
|
188
|
+
if (!ts.isTypeReferenceNode(typeNode))
|
|
189
|
+
return null;
|
|
190
|
+
const typeArgs = typeNode.typeArguments;
|
|
191
|
+
if (!typeArgs || typeArgs.length === 0)
|
|
192
|
+
return null;
|
|
193
|
+
const objectType = typeArgs[0];
|
|
194
|
+
if (!ts.isTypeLiteralNode(objectType))
|
|
195
|
+
return null;
|
|
196
|
+
let desc = "";
|
|
197
|
+
let path;
|
|
198
|
+
for (const member of objectType.members) {
|
|
199
|
+
if (!ts.isPropertySignature(member))
|
|
200
|
+
continue;
|
|
201
|
+
if (!member.name || (!ts.isIdentifier(member.name) && !ts.isStringLiteral(member.name)))
|
|
202
|
+
continue;
|
|
203
|
+
const propName = member.name.text;
|
|
204
|
+
const propType = member.type;
|
|
205
|
+
if (propName === "desc" && propType && ts.isLiteralTypeNode(propType)) {
|
|
206
|
+
desc = propType.literal.text;
|
|
207
|
+
}
|
|
208
|
+
else if (propName === "path" && propType && ts.isLiteralTypeNode(propType)) {
|
|
209
|
+
path = propType.literal.text;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return desc ? { desc, path } : null;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Extract all Modules from the Modules interface.
|
|
216
|
+
*
|
|
217
|
+
* SAME PATTERN AS FOLDERS:
|
|
218
|
+
* Given:
|
|
219
|
+
* ```ts
|
|
220
|
+
* interface Modules {
|
|
221
|
+
* AuthService: Module<{ desc: "Handles auth", type: typeof import("@/auth") }>;
|
|
222
|
+
* }
|
|
223
|
+
* ```
|
|
224
|
+
*
|
|
225
|
+
* Extract module name + desc + type (typeof import) and resolve import paths.
|
|
226
|
+
*/
|
|
227
|
+
function extractModules(interfaceNode, checker, registry, sourceFile, tsconfigDir, baseUrl) {
|
|
228
|
+
for (const member of interfaceNode.members) {
|
|
229
|
+
if (!ts.isPropertySignature(member))
|
|
230
|
+
continue;
|
|
231
|
+
if (!member.name || (!ts.isIdentifier(member.name) && !ts.isStringLiteral(member.name)))
|
|
232
|
+
continue;
|
|
233
|
+
const moduleName = member.name.text;
|
|
234
|
+
const type = member.type;
|
|
235
|
+
if (!type)
|
|
236
|
+
continue;
|
|
237
|
+
const moduleData = extractModuleType(type, checker);
|
|
238
|
+
if (!moduleData) {
|
|
239
|
+
const typeText = type.getText();
|
|
240
|
+
throw new Error(`Invalid Module definition for "${moduleName}" in ${sourceFile.fileName}:\n` +
|
|
241
|
+
` Expected: Module<{ desc: string; type: typeof import("...") }>\n` +
|
|
242
|
+
` Received: ${typeText}\n` +
|
|
243
|
+
` All properties in the Modules interface must use the Module<...> helper type with a valid import path.\n` +
|
|
244
|
+
` The 'type' field must be 'typeof import("path/to/module")' - plain types like 'any' are not allowed.\n` +
|
|
245
|
+
` If you want to use Export<...>, define it in an 'interface Exports' instead.`);
|
|
246
|
+
}
|
|
247
|
+
if (moduleData) {
|
|
248
|
+
// Resolve and validate import path if present
|
|
249
|
+
let resolvedPath;
|
|
250
|
+
let pathExists = false;
|
|
251
|
+
if (moduleData.importPath) {
|
|
252
|
+
// Try to resolve from baseUrl (tsconfig baseUrl) first
|
|
253
|
+
const absoluteFromBaseUrl = resolveModulePath(moduleData.importPath, baseUrl);
|
|
254
|
+
if (absoluteFromBaseUrl) {
|
|
255
|
+
const checkBaseUrl = checkPathExists(absoluteFromBaseUrl);
|
|
256
|
+
if (checkBaseUrl.exists) {
|
|
257
|
+
// Store as relative path from baseUrl
|
|
258
|
+
resolvedPath = path.relative(baseUrl, checkBaseUrl.actualPath).replace(/\\/g, "/");
|
|
259
|
+
pathExists = true;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
// Try relative to the source file where Module was declared
|
|
263
|
+
const sourceFileDir = path.dirname(sourceFile.fileName);
|
|
264
|
+
const absoluteFromSourceFile = resolveModulePath(moduleData.importPath, sourceFileDir);
|
|
265
|
+
if (absoluteFromSourceFile) {
|
|
266
|
+
const checkSourceFile = checkPathExists(absoluteFromSourceFile);
|
|
267
|
+
if (checkSourceFile.exists) {
|
|
268
|
+
// Store as relative path from baseUrl
|
|
269
|
+
resolvedPath = path
|
|
270
|
+
.relative(baseUrl, checkSourceFile.actualPath)
|
|
271
|
+
.replace(/\\/g, "/");
|
|
272
|
+
pathExists = true;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
// Path doesn't exist, store relative to baseUrl
|
|
276
|
+
resolvedPath = path.relative(baseUrl, absoluteFromBaseUrl).replace(/\\/g, "/");
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
registry.modules.set(moduleName, {
|
|
283
|
+
...moduleData,
|
|
284
|
+
resolvedPath,
|
|
285
|
+
pathExists,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Extract desc and type from Module<{ ... }> type.
|
|
292
|
+
*
|
|
293
|
+
* EXTRACTS IMPORT PATHS:
|
|
294
|
+
* We're looking for: Module<{ desc: "...", type: typeof import("...") }>
|
|
295
|
+
* The import path can be:
|
|
296
|
+
* - Relative: "./auth" or "../services/auth"
|
|
297
|
+
* - Absolute from tsconfig paths: "@/auth" or "@electron-main/auth"
|
|
298
|
+
* Walk the type arguments -> object literal -> property values.
|
|
299
|
+
*/
|
|
300
|
+
function extractModuleType(typeNode, checker) {
|
|
301
|
+
if (!ts.isTypeReferenceNode(typeNode))
|
|
302
|
+
return null;
|
|
303
|
+
const typeArgs = typeNode.typeArguments;
|
|
304
|
+
if (!typeArgs || typeArgs.length === 0)
|
|
305
|
+
return null;
|
|
306
|
+
const objectType = typeArgs[0];
|
|
307
|
+
if (!ts.isTypeLiteralNode(objectType))
|
|
308
|
+
return null;
|
|
309
|
+
let desc = "";
|
|
310
|
+
let typeSignature;
|
|
311
|
+
let importPath;
|
|
312
|
+
for (const member of objectType.members) {
|
|
313
|
+
if (!ts.isPropertySignature(member))
|
|
314
|
+
continue;
|
|
315
|
+
if (!member.name || (!ts.isIdentifier(member.name) && !ts.isStringLiteral(member.name)))
|
|
316
|
+
continue;
|
|
317
|
+
const propName = member.name.text;
|
|
318
|
+
const propType = member.type;
|
|
319
|
+
if (propName === "desc" && propType && ts.isLiteralTypeNode(propType)) {
|
|
320
|
+
desc = propType.literal.text;
|
|
321
|
+
}
|
|
322
|
+
else if (propName === "type" && propType) {
|
|
323
|
+
// Get the full type text
|
|
324
|
+
typeSignature = propType.getText();
|
|
325
|
+
// Try to extract import path from typeof import("...")
|
|
326
|
+
importPath = extractImportPath(propType);
|
|
327
|
+
// Enforce that modules must have import paths
|
|
328
|
+
if (!importPath) {
|
|
329
|
+
return null; // Invalid module - will trigger error in extractModules
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return desc && importPath ? { desc, type: typeSignature, importPath } : null;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Extract all Terms from the Terms interface.
|
|
337
|
+
*
|
|
338
|
+
* SIMPLER STRUCTURE:
|
|
339
|
+
* Terms just map to string descriptions, no complex generics:
|
|
340
|
+
* ```ts
|
|
341
|
+
* interface Terms {
|
|
342
|
+
* JWT: Term<"JSON Web Token">;
|
|
343
|
+
* OAuth: Term<"Open Authorization 2.0">;
|
|
344
|
+
* }
|
|
345
|
+
* ```
|
|
346
|
+
*
|
|
347
|
+
* We extract: termName -> description string.
|
|
348
|
+
*/
|
|
349
|
+
function extractTerms(interfaceNode, checker, registry, sourceFile) {
|
|
350
|
+
for (const member of interfaceNode.members) {
|
|
351
|
+
if (!ts.isPropertySignature(member))
|
|
352
|
+
continue;
|
|
353
|
+
if (!member.name || (!ts.isIdentifier(member.name) && !ts.isStringLiteral(member.name)))
|
|
354
|
+
continue;
|
|
355
|
+
const termName = member.name.text;
|
|
356
|
+
const type = member.type;
|
|
357
|
+
if (!type)
|
|
358
|
+
continue;
|
|
359
|
+
const desc = extractTermType(type);
|
|
360
|
+
if (!desc) {
|
|
361
|
+
const typeText = type.getText();
|
|
362
|
+
throw new Error(`Invalid Term definition for "${termName}" in ${sourceFile.fileName}:\n` +
|
|
363
|
+
` Expected: string literal type (e.g., "description text")\n` +
|
|
364
|
+
` Received: ${typeText}\n` +
|
|
365
|
+
` All properties in the Terms interface must be string literals.`);
|
|
366
|
+
}
|
|
367
|
+
if (desc) {
|
|
368
|
+
registry.terms.set(termName, desc);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Extract description from Term<"..."> type
|
|
374
|
+
*/
|
|
375
|
+
function extractTermType(typeNode) {
|
|
376
|
+
if (!ts.isTypeReferenceNode(typeNode))
|
|
377
|
+
return null;
|
|
378
|
+
const typeArgs = typeNode.typeArguments;
|
|
379
|
+
if (!typeArgs || typeArgs.length === 0)
|
|
380
|
+
return null;
|
|
381
|
+
const descType = typeArgs[0];
|
|
382
|
+
if (ts.isLiteralTypeNode(descType) && ts.isStringLiteral(descType.literal)) {
|
|
383
|
+
return descType.literal.text;
|
|
384
|
+
}
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Extract all Exports from the Exports interface.
|
|
389
|
+
*
|
|
390
|
+
* SAME PATTERN AS MODULES:
|
|
391
|
+
* Given:
|
|
392
|
+
* ```ts
|
|
393
|
+
* interface Exports {
|
|
394
|
+
* API_BASE_URL: Export<{ desc: "Base URL constant", type: typeof import("@/config/constants").API_BASE_URL }>;
|
|
395
|
+
* useAuth: Export<{ desc: "Auth hook", type: typeof import("@/hooks/useAuth").useAuth }>;
|
|
396
|
+
* }
|
|
397
|
+
* ```
|
|
398
|
+
*
|
|
399
|
+
* Extract export name + desc + type (typeof import) and resolve import paths.
|
|
400
|
+
*/
|
|
401
|
+
function extractExports(interfaceNode, checker, registry, sourceFile, tsconfigDir, baseUrl) {
|
|
402
|
+
for (const member of interfaceNode.members) {
|
|
403
|
+
if (!ts.isPropertySignature(member))
|
|
404
|
+
continue;
|
|
405
|
+
if (!member.name || (!ts.isIdentifier(member.name) && !ts.isStringLiteral(member.name)))
|
|
406
|
+
continue;
|
|
407
|
+
const exportName = member.name.text;
|
|
408
|
+
const type = member.type;
|
|
409
|
+
if (!type)
|
|
410
|
+
continue;
|
|
411
|
+
const exportData = extractExportType(type, checker);
|
|
412
|
+
if (!exportData) {
|
|
413
|
+
const typeText = type.getText();
|
|
414
|
+
throw new Error(`Invalid Export definition for "${exportName}" in ${sourceFile.fileName}:\n` +
|
|
415
|
+
` Expected: Export<{ desc: string; type: unknown }>\n` +
|
|
416
|
+
` Received: ${typeText}\n` +
|
|
417
|
+
` All properties in the Exports interface must use the Export<...> helper type.`);
|
|
418
|
+
}
|
|
419
|
+
if (exportData) {
|
|
420
|
+
// Resolve and validate import path if present
|
|
421
|
+
let resolvedPath;
|
|
422
|
+
let pathExists = false;
|
|
423
|
+
if (exportData.importPath) {
|
|
424
|
+
// Try to resolve from baseUrl (tsconfig baseUrl) first
|
|
425
|
+
const absoluteFromBaseUrl = resolveModulePath(exportData.importPath, baseUrl);
|
|
426
|
+
if (absoluteFromBaseUrl) {
|
|
427
|
+
const checkBaseUrl = checkPathExists(absoluteFromBaseUrl);
|
|
428
|
+
if (checkBaseUrl.exists) {
|
|
429
|
+
// Store as relative path from baseUrl
|
|
430
|
+
resolvedPath = path.relative(baseUrl, checkBaseUrl.actualPath).replace(/\\/g, "/");
|
|
431
|
+
pathExists = true;
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
// Try relative to the source file where Export was declared
|
|
435
|
+
const sourceFileDir = path.dirname(sourceFile.fileName);
|
|
436
|
+
const absoluteFromSourceFile = resolveModulePath(exportData.importPath, sourceFileDir);
|
|
437
|
+
if (absoluteFromSourceFile) {
|
|
438
|
+
const checkSourceFile = checkPathExists(absoluteFromSourceFile);
|
|
439
|
+
if (checkSourceFile.exists) {
|
|
440
|
+
// Store as relative path from baseUrl
|
|
441
|
+
resolvedPath = path
|
|
442
|
+
.relative(baseUrl, checkSourceFile.actualPath)
|
|
443
|
+
.replace(/\\/g, "/");
|
|
444
|
+
pathExists = true;
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
// Path doesn't exist, store relative to baseUrl
|
|
448
|
+
resolvedPath = path.relative(baseUrl, absoluteFromBaseUrl).replace(/\\/g, "/");
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
registry.exports.set(exportName, {
|
|
455
|
+
...exportData,
|
|
456
|
+
resolvedPath,
|
|
457
|
+
pathExists,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Extract desc and type from Export<{ ... }> type.
|
|
464
|
+
*
|
|
465
|
+
* EXTRACTS IMPORT PATHS:
|
|
466
|
+
* We're looking for: Export<{ desc: "...", type: typeof import("...").exportName }>
|
|
467
|
+
* The import path can be:
|
|
468
|
+
* - Relative: "./auth" or "../services/auth"
|
|
469
|
+
* - Absolute from tsconfig paths: "@/auth" or "@electron-main/auth"
|
|
470
|
+
* Walk the type arguments -> object literal -> property values.
|
|
471
|
+
*/
|
|
472
|
+
function extractExportType(typeNode, checker) {
|
|
473
|
+
if (!ts.isTypeReferenceNode(typeNode))
|
|
474
|
+
return null;
|
|
475
|
+
const typeArgs = typeNode.typeArguments;
|
|
476
|
+
if (!typeArgs || typeArgs.length === 0)
|
|
477
|
+
return null;
|
|
478
|
+
const objectType = typeArgs[0];
|
|
479
|
+
if (!ts.isTypeLiteralNode(objectType))
|
|
480
|
+
return null;
|
|
481
|
+
let desc = "";
|
|
482
|
+
let typeSignature;
|
|
483
|
+
let importPath;
|
|
484
|
+
for (const member of objectType.members) {
|
|
485
|
+
if (!ts.isPropertySignature(member))
|
|
486
|
+
continue;
|
|
487
|
+
if (!member.name || (!ts.isIdentifier(member.name) && !ts.isStringLiteral(member.name)))
|
|
488
|
+
continue;
|
|
489
|
+
const propName = member.name.text;
|
|
490
|
+
const propType = member.type;
|
|
491
|
+
if (propName === "desc" && propType && ts.isLiteralTypeNode(propType)) {
|
|
492
|
+
desc = propType.literal.text;
|
|
493
|
+
}
|
|
494
|
+
else if (propName === "type" && propType) {
|
|
495
|
+
// Get the full type text
|
|
496
|
+
typeSignature = propType.getText();
|
|
497
|
+
// Try to extract import path from typeof import("...")
|
|
498
|
+
importPath = extractImportPath(propType);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return desc ? { desc, type: typeSignature, importPath } : null;
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Extract import path from typeof import("...") expression.
|
|
505
|
+
*
|
|
506
|
+
* PARSING IMPORT TYPES:
|
|
507
|
+
* TypeScript represents `typeof import("@/auth")` as a TypeQueryNode.
|
|
508
|
+
* We need to walk the AST to find the ImportTypeNode within it.
|
|
509
|
+
*
|
|
510
|
+
* @param typeNode - The type node that might contain an import
|
|
511
|
+
* @returns The import path string, or undefined
|
|
512
|
+
*/
|
|
513
|
+
function extractImportPath(typeNode) {
|
|
514
|
+
let importPath;
|
|
515
|
+
// Walk the type node tree looking for ImportTypeNode
|
|
516
|
+
function visit(node) {
|
|
517
|
+
if (ts.isImportTypeNode(node)) {
|
|
518
|
+
const argument = node.argument;
|
|
519
|
+
// The argument is a LiteralTypeNode with a StringLiteral
|
|
520
|
+
if (ts.isLiteralTypeNode(argument) && ts.isStringLiteral(argument.literal)) {
|
|
521
|
+
importPath = argument.literal.text;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
ts.forEachChild(node, visit);
|
|
525
|
+
}
|
|
526
|
+
visit(typeNode);
|
|
527
|
+
return importPath;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Resolve a module path (which might be relative or use tsconfig path aliases).
|
|
531
|
+
*
|
|
532
|
+
* RESOLUTION STRATEGY:
|
|
533
|
+
* 1. If path starts with . or .., resolve as relative path
|
|
534
|
+
* 2. If path starts with @, try common tsconfig patterns:
|
|
535
|
+
* - @/ -> src/
|
|
536
|
+
* - @electron-main/ -> electron-layers/main/src/
|
|
537
|
+
* - @electron-renderer/ -> electron-layers/renderer/src/
|
|
538
|
+
* 3. Otherwise return as-is and let existence check determine validity
|
|
539
|
+
*
|
|
540
|
+
* @param importPath - The import path from typeof import("...")
|
|
541
|
+
* @param baseDir - Base directory to resolve from
|
|
542
|
+
* @returns Resolved absolute path, or undefined if can't resolve
|
|
543
|
+
*/
|
|
544
|
+
function resolveModulePath(importPath, baseDir) {
|
|
545
|
+
// Handle relative paths
|
|
546
|
+
if (importPath.startsWith("./") || importPath.startsWith("../")) {
|
|
547
|
+
return path.resolve(baseDir, importPath);
|
|
548
|
+
}
|
|
549
|
+
// Handle tsconfig path aliases (common patterns in this codebase)
|
|
550
|
+
if (importPath.startsWith("@/")) {
|
|
551
|
+
// @/ typically maps to src/
|
|
552
|
+
const withoutAlias = importPath.replace("@/", "src/");
|
|
553
|
+
return path.resolve(baseDir, withoutAlias);
|
|
554
|
+
}
|
|
555
|
+
if (importPath.startsWith("@electron-main/")) {
|
|
556
|
+
const withoutAlias = importPath.replace("@electron-main/", "electron-layers/main/src/");
|
|
557
|
+
return path.resolve(baseDir, withoutAlias);
|
|
558
|
+
}
|
|
559
|
+
if (importPath.startsWith("@electron-renderer/")) {
|
|
560
|
+
const withoutAlias = importPath.replace("@electron-renderer/", "electron-layers/renderer/src/");
|
|
561
|
+
return path.resolve(baseDir, withoutAlias);
|
|
562
|
+
}
|
|
563
|
+
// For other paths (node_modules, etc.), try resolving from baseDir
|
|
564
|
+
return path.resolve(baseDir, importPath);
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Check if a file or directory exists, trying multiple extensions for files.
|
|
568
|
+
*
|
|
569
|
+
* EXTENSION RESOLUTION:
|
|
570
|
+
* For import paths like "@electron-main/main.js", the actual file might be:
|
|
571
|
+
* - main.js (as specified)
|
|
572
|
+
* - main.ts (TypeScript source)
|
|
573
|
+
* - main.tsx (TypeScript with JSX)
|
|
574
|
+
* - main/ (directory with index file)
|
|
575
|
+
*
|
|
576
|
+
* This function tries all common variations.
|
|
577
|
+
*
|
|
578
|
+
* @param absolutePath - The absolute path to check
|
|
579
|
+
* @returns Object with { exists: boolean, actualPath: string }
|
|
580
|
+
*/
|
|
581
|
+
function checkPathExists(absolutePath) {
|
|
582
|
+
// Check if it exists as-is (file or directory)
|
|
583
|
+
if (ts.sys.fileExists(absolutePath) || ts.sys.directoryExists(absolutePath)) {
|
|
584
|
+
return { exists: true, actualPath: absolutePath };
|
|
585
|
+
}
|
|
586
|
+
// If it has an extension, try replacing with TypeScript extensions
|
|
587
|
+
const ext = path.extname(absolutePath);
|
|
588
|
+
if (ext) {
|
|
589
|
+
const basePath = absolutePath.slice(0, -ext.length);
|
|
590
|
+
const tsExtensions = [".ts", ".tsx", ".mts", ".cts"];
|
|
591
|
+
for (const tsExt of tsExtensions) {
|
|
592
|
+
const tsPath = basePath + tsExt;
|
|
593
|
+
if (ts.sys.fileExists(tsPath)) {
|
|
594
|
+
return { exists: true, actualPath: tsPath };
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
// Try as a directory
|
|
599
|
+
if (ts.sys.directoryExists(absolutePath)) {
|
|
600
|
+
return { exists: true, actualPath: absolutePath };
|
|
601
|
+
}
|
|
602
|
+
return { exists: false, actualPath: absolutePath };
|
|
603
|
+
}
|
|
604
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/extraction/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { KnowledgeGraph } from "./types.js";
|
|
2
|
+
import type { ExtractedRegistry } from "../extraction/registry.js";
|
|
3
|
+
import type { ExtractedDoc } from "../extraction/documentation.js";
|
|
4
|
+
/**
|
|
5
|
+
* Builds a knowledge graph from extracted registry and documentation data.
|
|
6
|
+
*
|
|
7
|
+
* GRAPH STRUCTURE:
|
|
8
|
+
* A knowledge graph has two parts:
|
|
9
|
+
* 1. NODES: The "things" in your system (Folders, Modules, Terms, Docs)
|
|
10
|
+
* 2. EDGES: Relationships between nodes ("doc X references module Y")
|
|
11
|
+
*
|
|
12
|
+
* BUILDING PROCESS:
|
|
13
|
+
* 1. Create nodes from registry:
|
|
14
|
+
* - Each Folder becomes a FolderNode with { id, desc, path }
|
|
15
|
+
* - Each Module becomes a ModuleNode with { id, desc, typeSignature }
|
|
16
|
+
* - Each Term becomes a TermNode with { id, desc }
|
|
17
|
+
*
|
|
18
|
+
* 2. Create nodes from docs:
|
|
19
|
+
* - Each doc file becomes a DocNode with { id, filePath, content }
|
|
20
|
+
*
|
|
21
|
+
* 3. Create edges from references:
|
|
22
|
+
* - For each doc, look at its references.modules/terms/folders
|
|
23
|
+
* - Create an edge: { from: docId, to: moduleId, type: "references" }
|
|
24
|
+
*
|
|
25
|
+
* RESULT:
|
|
26
|
+
* A complete graph that can be queried: "What docs reference Module X?"
|
|
27
|
+
* "What terms are used in Folder Y?", etc.
|
|
28
|
+
*
|
|
29
|
+
* This is what feeds AI tools to understand your architecture.
|
|
30
|
+
*
|
|
31
|
+
* @param registry - Extracted vocabulary (Folders, Modules, Terms)
|
|
32
|
+
* @param docs - Extracted documentation files
|
|
33
|
+
* @param baseDir - Base directory (from tsconfig) to make paths relative to
|
|
34
|
+
* @returns Complete knowledge graph ready for JSON export
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildGraph(registry: ExtractedRegistry, docs: ExtractedDoc[], baseDir: string): KnowledgeGraph;
|
|
37
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/core/graph/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAOf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,YAAY,EAAE,EACpB,OAAO,EAAE,MAAM,GACd,cAAc,CA6ChB"}
|