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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1086 -0
  3. package/dist/cli/commands/build.d.ts +55 -0
  4. package/dist/cli/commands/build.d.ts.map +1 -0
  5. package/dist/cli/commands/build.js +105 -0
  6. package/dist/cli/commands/build.js.map +1 -0
  7. package/dist/cli/commands/query.d.ts +10 -0
  8. package/dist/cli/commands/query.d.ts.map +1 -0
  9. package/dist/cli/commands/query.js +399 -0
  10. package/dist/cli/commands/query.js.map +1 -0
  11. package/dist/cli/commands/visualize.d.ts +10 -0
  12. package/dist/cli/commands/visualize.d.ts.map +1 -0
  13. package/dist/cli/commands/visualize.js +26 -0
  14. package/dist/cli/commands/visualize.js.map +1 -0
  15. package/dist/cli/index.d.ts +9 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +109 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/core/extraction/documentation.d.ts +28 -0
  20. package/dist/core/extraction/documentation.d.ts.map +1 -0
  21. package/dist/core/extraction/documentation.js +330 -0
  22. package/dist/core/extraction/documentation.js.map +1 -0
  23. package/dist/core/extraction/index.d.ts +11 -0
  24. package/dist/core/extraction/index.d.ts.map +1 -0
  25. package/dist/core/extraction/index.js +9 -0
  26. package/dist/core/extraction/index.js.map +1 -0
  27. package/dist/core/extraction/registry.d.ts +40 -0
  28. package/dist/core/extraction/registry.d.ts.map +1 -0
  29. package/dist/core/extraction/registry.js +604 -0
  30. package/dist/core/extraction/registry.js.map +1 -0
  31. package/dist/core/graph/builder.d.ts +37 -0
  32. package/dist/core/graph/builder.d.ts.map +1 -0
  33. package/dist/core/graph/builder.js +421 -0
  34. package/dist/core/graph/builder.js.map +1 -0
  35. package/dist/core/graph/index.d.ts +23 -0
  36. package/dist/core/graph/index.d.ts.map +1 -0
  37. package/dist/core/graph/index.js +25 -0
  38. package/dist/core/graph/index.js.map +1 -0
  39. package/dist/core/graph/types.d.ts +128 -0
  40. package/dist/core/graph/types.d.ts.map +1 -0
  41. package/dist/core/graph/types.js +9 -0
  42. package/dist/core/graph/types.js.map +1 -0
  43. package/dist/core/visualization/dot-generator.d.ts +13 -0
  44. package/dist/core/visualization/dot-generator.d.ts.map +1 -0
  45. package/dist/core/visualization/dot-generator.js +200 -0
  46. package/dist/core/visualization/dot-generator.js.map +1 -0
  47. package/dist/core/visualization/index.d.ts +20 -0
  48. package/dist/core/visualization/index.d.ts.map +1 -0
  49. package/dist/core/visualization/index.js +23 -0
  50. package/dist/core/visualization/index.js.map +1 -0
  51. package/dist/index.d.ts +9 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +8 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/jsx-runtime.d.ts +7 -0
  56. package/dist/jsx-runtime.d.ts.map +1 -0
  57. package/dist/jsx-runtime.js +11 -0
  58. package/dist/jsx-runtime.js.map +1 -0
  59. package/dist/runtime/jsx.d.ts +84 -0
  60. package/dist/runtime/jsx.d.ts.map +1 -0
  61. package/dist/runtime/jsx.js +93 -0
  62. package/dist/runtime/jsx.js.map +1 -0
  63. package/dist/runtime/registry.d.ts +61 -0
  64. package/dist/runtime/registry.d.ts.map +1 -0
  65. package/dist/runtime/registry.js +2 -0
  66. package/dist/runtime/registry.js.map +1 -0
  67. package/dist/typescript/index.d.ts +7 -0
  68. package/dist/typescript/index.d.ts.map +1 -0
  69. package/dist/typescript/index.js +7 -0
  70. package/dist/typescript/index.js.map +1 -0
  71. package/dist/typescript/program.d.ts +33 -0
  72. package/dist/typescript/program.d.ts.map +1 -0
  73. package/dist/typescript/program.js +84 -0
  74. package/dist/typescript/program.js.map +1 -0
  75. 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"}