code-kg 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +100 -0
  3. package/dist/cli/index.d.ts +14 -0
  4. package/dist/cli/index.js +68 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/codekg-config.d.ts +14 -0
  7. package/dist/codekg-config.js +81 -0
  8. package/dist/codekg-config.js.map +1 -0
  9. package/dist/commands/graph.d.ts +7 -0
  10. package/dist/commands/graph.js +49 -0
  11. package/dist/commands/graph.js.map +1 -0
  12. package/dist/commands/init.d.ts +6 -0
  13. package/dist/commands/init.js +13 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/insights.d.ts +7 -0
  16. package/dist/commands/insights.js +31 -0
  17. package/dist/commands/insights.js.map +1 -0
  18. package/dist/commands/path.d.ts +7 -0
  19. package/dist/commands/path.js +47 -0
  20. package/dist/commands/path.js.map +1 -0
  21. package/dist/commands/reindex.d.ts +6 -0
  22. package/dist/commands/reindex.js +13 -0
  23. package/dist/commands/reindex.js.map +1 -0
  24. package/dist/commands/run.d.ts +6 -0
  25. package/dist/commands/run.js +20 -0
  26. package/dist/commands/run.js.map +1 -0
  27. package/dist/commands/serve.d.ts +8 -0
  28. package/dist/commands/serve.js +25 -0
  29. package/dist/commands/serve.js.map +1 -0
  30. package/dist/config/defaults.d.ts +6 -0
  31. package/dist/config/defaults.js +30 -0
  32. package/dist/config/defaults.js.map +1 -0
  33. package/dist/index.d.ts +52 -0
  34. package/dist/index.js +602 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/indexer/babel-fallback.d.ts +7 -0
  37. package/dist/indexer/babel-fallback.js +583 -0
  38. package/dist/indexer/babel-fallback.js.map +1 -0
  39. package/dist/indexer/file-discovery.d.ts +6 -0
  40. package/dist/indexer/file-discovery.js +106 -0
  41. package/dist/indexer/file-discovery.js.map +1 -0
  42. package/dist/indexer/indexer.d.ts +90 -0
  43. package/dist/indexer/indexer.js +620 -0
  44. package/dist/indexer/indexer.js.map +1 -0
  45. package/dist/indexer/metrics.d.ts +39 -0
  46. package/dist/indexer/metrics.js +147 -0
  47. package/dist/indexer/metrics.js.map +1 -0
  48. package/dist/indexer/structure-detector.d.ts +16 -0
  49. package/dist/indexer/structure-detector.js +159 -0
  50. package/dist/indexer/structure-detector.js.map +1 -0
  51. package/dist/indexer/ts-parser.d.ts +86 -0
  52. package/dist/indexer/ts-parser.js +437 -0
  53. package/dist/indexer/ts-parser.js.map +1 -0
  54. package/dist/model/edge.d.ts +21 -0
  55. package/dist/model/edge.js +25 -0
  56. package/dist/model/edge.js.map +1 -0
  57. package/dist/model/graph.d.ts +10 -0
  58. package/dist/model/graph.js +20 -0
  59. package/dist/model/graph.js.map +1 -0
  60. package/dist/model/node.d.ts +24 -0
  61. package/dist/model/node.js +22 -0
  62. package/dist/model/node.js.map +1 -0
  63. package/dist/query/query-dsl.d.ts +17 -0
  64. package/dist/query/query-dsl.js +75 -0
  65. package/dist/query/query-dsl.js.map +1 -0
  66. package/dist/query/query-engine.d.ts +32 -0
  67. package/dist/query/query-engine.js +126 -0
  68. package/dist/query/query-engine.js.map +1 -0
  69. package/dist/server/api.d.ts +19 -0
  70. package/dist/server/api.js +29 -0
  71. package/dist/server/api.js.map +1 -0
  72. package/dist/server/app.d.ts +7 -0
  73. package/dist/server/app.js +509 -0
  74. package/dist/server/app.js.map +1 -0
  75. package/dist/server/graph-controller.d.ts +147 -0
  76. package/dist/server/graph-controller.js +186 -0
  77. package/dist/server/graph-controller.js.map +1 -0
  78. package/dist/server/routes.d.ts +3 -0
  79. package/dist/server/routes.js +19 -0
  80. package/dist/server/routes.js.map +1 -0
  81. package/dist/server/ui.d.ts +1 -0
  82. package/dist/server/ui.js +1165 -0
  83. package/dist/server/ui.js.map +1 -0
  84. package/dist/store/sqlite-store.d.ts +83 -0
  85. package/dist/store/sqlite-store.js +647 -0
  86. package/dist/store/sqlite-store.js.map +1 -0
  87. package/dist/utils/ids.d.ts +2 -0
  88. package/dist/utils/ids.js +9 -0
  89. package/dist/utils/ids.js.map +1 -0
  90. package/dist/utils/path.d.ts +3 -0
  91. package/dist/utils/path.js +21 -0
  92. package/dist/utils/path.js.map +1 -0
  93. package/package.json +58 -0
@@ -0,0 +1,39 @@
1
+ export interface DependencyEdge {
2
+ from: string;
3
+ to: string;
4
+ source: string;
5
+ specifiers: string[];
6
+ }
7
+ export interface ImportUsageEntry {
8
+ filePath: string;
9
+ source: string;
10
+ specifiers: string[];
11
+ resolvedPath?: string;
12
+ }
13
+ export interface ExportUsageEntry {
14
+ filePath: string;
15
+ name: string;
16
+ kind: string;
17
+ }
18
+ export interface SccCycle {
19
+ files: string[];
20
+ size: number;
21
+ }
22
+ export interface UnusedExport {
23
+ filePath: string;
24
+ name: string;
25
+ kind: string;
26
+ }
27
+ export interface DerivedMetrics {
28
+ cycles: SccCycle[];
29
+ fanIn: Record<string, number>;
30
+ fanOut: Record<string, number>;
31
+ unusedExports: UnusedExport[];
32
+ }
33
+ export interface MetricsInput {
34
+ files: string[];
35
+ dependencies: DependencyEdge[];
36
+ imports: ImportUsageEntry[];
37
+ exports: ExportUsageEntry[];
38
+ }
39
+ export declare function computeDerivedMetrics(input: MetricsInput): DerivedMetrics;
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.computeDerivedMetrics = computeDerivedMetrics;
4
+ function tarjan(nodes, adjacency) {
5
+ let index = 0;
6
+ const stack = [];
7
+ const onStack = new Set();
8
+ const indices = new Map();
9
+ const lowLink = new Map();
10
+ const components = [];
11
+ const strongConnect = (node) => {
12
+ indices.set(node, index);
13
+ lowLink.set(node, index);
14
+ index += 1;
15
+ stack.push(node);
16
+ onStack.add(node);
17
+ for (const neighbor of adjacency.get(node) ?? []) {
18
+ if (!indices.has(neighbor)) {
19
+ strongConnect(neighbor);
20
+ lowLink.set(node, Math.min(lowLink.get(node) ?? 0, lowLink.get(neighbor) ?? 0));
21
+ }
22
+ else if (onStack.has(neighbor)) {
23
+ lowLink.set(node, Math.min(lowLink.get(node) ?? 0, indices.get(neighbor) ?? 0));
24
+ }
25
+ }
26
+ if ((lowLink.get(node) ?? -1) === (indices.get(node) ?? -2)) {
27
+ const component = [];
28
+ while (stack.length > 0) {
29
+ const popped = stack.pop();
30
+ if (!popped) {
31
+ break;
32
+ }
33
+ onStack.delete(popped);
34
+ component.push(popped);
35
+ if (popped === node) {
36
+ break;
37
+ }
38
+ }
39
+ components.push(component.sort());
40
+ }
41
+ };
42
+ for (const node of nodes) {
43
+ if (!indices.has(node)) {
44
+ strongConnect(node);
45
+ }
46
+ }
47
+ return components;
48
+ }
49
+ function buildAdjacency(nodes, dependencies) {
50
+ const adjacency = new Map();
51
+ for (const node of nodes) {
52
+ adjacency.set(node, new Set());
53
+ }
54
+ for (const dependency of dependencies) {
55
+ if (!adjacency.has(dependency.from) || !adjacency.has(dependency.to)) {
56
+ continue;
57
+ }
58
+ adjacency.get(dependency.from)?.add(dependency.to);
59
+ }
60
+ return adjacency;
61
+ }
62
+ function computeFanMetrics(nodes, dependencies) {
63
+ const fanIn = {};
64
+ const fanOut = {};
65
+ for (const node of nodes) {
66
+ fanIn[node] = 0;
67
+ fanOut[node] = 0;
68
+ }
69
+ const uniqueEdges = new Set();
70
+ for (const dependency of dependencies) {
71
+ if (!(dependency.from in fanOut) || !(dependency.to in fanIn)) {
72
+ continue;
73
+ }
74
+ const edgeKey = `${dependency.from}::${dependency.to}`;
75
+ if (uniqueEdges.has(edgeKey)) {
76
+ continue;
77
+ }
78
+ uniqueEdges.add(edgeKey);
79
+ fanOut[dependency.from] += 1;
80
+ fanIn[dependency.to] += 1;
81
+ }
82
+ return { fanIn, fanOut };
83
+ }
84
+ function computeUnusedExports(exportsList, importsList) {
85
+ const usageByTarget = new Map();
86
+ for (const item of importsList) {
87
+ if (!item.resolvedPath) {
88
+ continue;
89
+ }
90
+ const existing = usageByTarget.get(item.resolvedPath) ?? new Set();
91
+ if (!item.specifiers || item.specifiers.length === 0) {
92
+ existing.add("*");
93
+ }
94
+ else {
95
+ for (const specifier of item.specifiers) {
96
+ existing.add(specifier);
97
+ }
98
+ }
99
+ usageByTarget.set(item.resolvedPath, existing);
100
+ }
101
+ const unused = [];
102
+ for (const item of exportsList) {
103
+ if (item.kind === "reexport" || item.kind === "all" || item.name === "*") {
104
+ continue;
105
+ }
106
+ const used = usageByTarget.get(item.filePath);
107
+ const isUsed = Boolean(used?.has("*")) ||
108
+ Boolean(used?.has(item.name)) ||
109
+ (item.kind === "default" && Boolean(used?.has("default")));
110
+ if (!isUsed) {
111
+ unused.push({
112
+ filePath: item.filePath,
113
+ name: item.name,
114
+ kind: item.kind,
115
+ });
116
+ }
117
+ }
118
+ return unused.sort((a, b) => a.filePath === b.filePath
119
+ ? a.name.localeCompare(b.name)
120
+ : a.filePath.localeCompare(b.filePath));
121
+ }
122
+ function computeDerivedMetrics(input) {
123
+ const files = [...new Set(input.files)].sort();
124
+ const adjacency = buildAdjacency(files, input.dependencies);
125
+ const components = tarjan(files, adjacency);
126
+ const cycles = components
127
+ .filter((component) => {
128
+ if (component.length > 1) {
129
+ return true;
130
+ }
131
+ const file = component[0];
132
+ return Boolean(file && adjacency.get(file)?.has(file));
133
+ })
134
+ .map((component) => ({
135
+ files: component,
136
+ size: component.length,
137
+ }))
138
+ .sort((a, b) => b.size - a.size || a.files[0].localeCompare(b.files[0]));
139
+ const { fanIn, fanOut } = computeFanMetrics(files, input.dependencies);
140
+ return {
141
+ cycles,
142
+ fanIn,
143
+ fanOut,
144
+ unusedExports: computeUnusedExports(input.exports, input.imports),
145
+ };
146
+ }
147
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/indexer/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface FrameworkDetection {
2
+ next: boolean;
3
+ express: boolean;
4
+ }
5
+ export interface ProjectStructure {
6
+ rootPath: string;
7
+ hasPackageJson: boolean;
8
+ hasTsConfig: boolean;
9
+ packageJsonPath?: string;
10
+ tsconfigPath?: string;
11
+ packageName?: string;
12
+ frameworks: FrameworkDetection;
13
+ sourceDirectories: string[];
14
+ entryPoints: string[];
15
+ }
16
+ export declare function detectProjectStructure(rootPath: string): ProjectStructure;
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.detectProjectStructure = detectProjectStructure;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const SOURCE_DIRECTORY_CANDIDATES = [
40
+ "src",
41
+ "app",
42
+ "pages",
43
+ "server",
44
+ "lib",
45
+ "api",
46
+ ];
47
+ const ENTRYPOINT_CANDIDATES = [
48
+ "src/index.ts",
49
+ "src/index.tsx",
50
+ "src/index.js",
51
+ "src/index.jsx",
52
+ "src/main.ts",
53
+ "src/main.tsx",
54
+ "src/main.js",
55
+ "src/main.jsx",
56
+ "index.ts",
57
+ "index.js",
58
+ "server.ts",
59
+ "server.js",
60
+ "app.ts",
61
+ "app.js",
62
+ ];
63
+ function readJsonFile(filePath) {
64
+ if (!fs.existsSync(filePath)) {
65
+ return undefined;
66
+ }
67
+ try {
68
+ return JSON.parse(fs.readFileSync(filePath, "utf8"));
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ }
74
+ function hasDependency(pkg, depName) {
75
+ if (!pkg) {
76
+ return false;
77
+ }
78
+ return Boolean(pkg.dependencies?.[depName] ??
79
+ pkg.devDependencies?.[depName] ??
80
+ pkg.peerDependencies?.[depName]);
81
+ }
82
+ function detectFrameworks(rootPath, pkg) {
83
+ const nextFromDeps = hasDependency(pkg, "next");
84
+ const expressFromDeps = hasDependency(pkg, "express");
85
+ const scripts = Object.values(pkg?.scripts ?? {});
86
+ const nextFromScripts = scripts.some((script) => /\bnext\b/.test(script));
87
+ const nextFromFolders = fs.existsSync(path.join(rootPath, "app")) ||
88
+ fs.existsSync(path.join(rootPath, "pages")) ||
89
+ fs.existsSync(path.join(rootPath, "src", "app")) ||
90
+ fs.existsSync(path.join(rootPath, "src", "pages"));
91
+ return {
92
+ next: nextFromDeps || nextFromScripts || nextFromFolders,
93
+ express: expressFromDeps,
94
+ };
95
+ }
96
+ function detectSourceDirectories(rootPath, frameworks) {
97
+ const candidates = new Set(SOURCE_DIRECTORY_CANDIDATES.map((dirPath) => path.join(rootPath, dirPath)));
98
+ if (frameworks.next) {
99
+ candidates.add(path.join(rootPath, "src", "app"));
100
+ candidates.add(path.join(rootPath, "src", "pages"));
101
+ candidates.add(path.join(rootPath, "pages"));
102
+ candidates.add(path.join(rootPath, "app"));
103
+ }
104
+ const existing = [...candidates].filter((dirPath) => {
105
+ if (!fs.existsSync(dirPath)) {
106
+ return false;
107
+ }
108
+ try {
109
+ return fs.statSync(dirPath).isDirectory();
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ });
115
+ if (existing.length === 0) {
116
+ return [rootPath];
117
+ }
118
+ return existing.sort();
119
+ }
120
+ function detectEntryPoints(rootPath) {
121
+ return ENTRYPOINT_CANDIDATES.map((candidate) => path.join(rootPath, candidate))
122
+ .filter((absolutePath) => {
123
+ if (!fs.existsSync(absolutePath)) {
124
+ return false;
125
+ }
126
+ try {
127
+ return fs.statSync(absolutePath).isFile();
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ })
133
+ .sort();
134
+ }
135
+ function detectProjectStructure(rootPath) {
136
+ const normalizedRoot = path.resolve(rootPath);
137
+ if (!fs.existsSync(normalizedRoot)) {
138
+ throw new Error(`Invalid root path: ${rootPath}`);
139
+ }
140
+ if (!fs.statSync(normalizedRoot).isDirectory()) {
141
+ throw new Error(`Root path is not a directory: ${rootPath}`);
142
+ }
143
+ const packageJsonPath = path.join(normalizedRoot, "package.json");
144
+ const tsconfigPath = path.join(normalizedRoot, "tsconfig.json");
145
+ const packageJson = readJsonFile(packageJsonPath);
146
+ const frameworks = detectFrameworks(normalizedRoot, packageJson);
147
+ return {
148
+ rootPath: normalizedRoot,
149
+ hasPackageJson: Boolean(packageJson),
150
+ hasTsConfig: fs.existsSync(tsconfigPath),
151
+ packageJsonPath: fs.existsSync(packageJsonPath) ? packageJsonPath : undefined,
152
+ tsconfigPath: fs.existsSync(tsconfigPath) ? tsconfigPath : undefined,
153
+ packageName: packageJson?.name,
154
+ frameworks,
155
+ sourceDirectories: detectSourceDirectories(normalizedRoot, frameworks),
156
+ entryPoints: detectEntryPoints(normalizedRoot),
157
+ };
158
+ }
159
+ //# sourceMappingURL=structure-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure-detector.js","sourceRoot":"","sources":["../../src/indexer/structure-detector.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4IA,wDA0BC;AAtKD,4CAA8B;AAC9B,gDAAkC;AA2BlC,MAAM,2BAA2B,GAAG;IAClC,KAAK;IACL,KAAK;IACL,OAAO;IACP,QAAQ;IACR,KAAK;IACL,KAAK;CACG,CAAC;AAEX,MAAM,qBAAqB,GAAG;IAC5B,cAAc;IACd,eAAe;IACf,cAAc;IACd,eAAe;IACf,aAAa;IACb,cAAc;IACd,aAAa;IACb,cAAc;IACd,UAAU;IACV,UAAU;IACV,WAAW;IACX,WAAW;IACX,QAAQ;IACR,QAAQ;CACA,CAAC;AAEX,SAAS,YAAY,CAAI,QAAgB;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAM,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAiC,EAAE,OAAe;IACvE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CACZ,GAAG,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC;QACzB,GAAG,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC;QAC9B,GAAG,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,GAAiC;IAC3E,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAEtD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAE1E,MAAM,eAAe,GACnB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAChD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErD,OAAO;QACL,IAAI,EAAE,YAAY,IAAI,eAAe,IAAI,eAAe;QACxD,OAAO,EAAE,eAAe;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,UAA8B;IAC/E,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,2BAA2B,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAC3E,CAAC;IAEF,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAClD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QACpD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7C,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;SAC5E,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;QACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;SACD,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,sBAAsB,CAAC,QAAgB;IACrD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,YAAY,CAAmB,eAAe,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAEjE,OAAO;QACL,QAAQ,EAAE,cAAc;QACxB,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC;QACpC,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QACxC,eAAe,EAAE,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;QAC7E,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QACpE,WAAW,EAAE,WAAW,EAAE,IAAI;QAC9B,UAAU;QACV,iBAAiB,EAAE,uBAAuB,CAAC,cAAc,EAAE,UAAU,CAAC;QACtE,WAAW,EAAE,iBAAiB,CAAC,cAAc,CAAC;KAC/C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,86 @@
1
+ export type ParserKind = "typescript" | "babel";
2
+ export interface SourceLocation {
3
+ line: number;
4
+ column: number;
5
+ endLine?: number;
6
+ endColumn?: number;
7
+ }
8
+ export interface ImportRecord {
9
+ source: string;
10
+ specifiers: string[];
11
+ isTypeOnly?: boolean;
12
+ resolvedPath?: string;
13
+ loc?: SourceLocation;
14
+ }
15
+ export interface ExportRecord {
16
+ name: string;
17
+ kind: "named" | "default" | "reexport" | "all";
18
+ from?: string;
19
+ isTypeOnly?: boolean;
20
+ localName?: string;
21
+ loc?: SourceLocation;
22
+ }
23
+ export interface FunctionRecord {
24
+ name: string;
25
+ exported: boolean;
26
+ async: boolean;
27
+ generator: boolean;
28
+ loc?: SourceLocation;
29
+ }
30
+ export interface ClassRecord {
31
+ name: string;
32
+ exported: boolean;
33
+ extends?: string;
34
+ implements?: string[];
35
+ loc?: SourceLocation;
36
+ }
37
+ export interface InterfaceRecord {
38
+ name: string;
39
+ exported: boolean;
40
+ loc?: SourceLocation;
41
+ }
42
+ export interface VariableRecord {
43
+ name: string;
44
+ kind: "const" | "let" | "var" | "unknown";
45
+ exported: boolean;
46
+ loc?: SourceLocation;
47
+ }
48
+ export interface ReferenceRecord {
49
+ name: string;
50
+ kind?: "identifier";
51
+ loc?: SourceLocation;
52
+ }
53
+ export interface CallRecord {
54
+ callee: string;
55
+ loc?: SourceLocation;
56
+ }
57
+ export interface RouteRecord {
58
+ framework: "express" | "next";
59
+ method?: string;
60
+ path: string;
61
+ kind: "handler" | "file";
62
+ filePath: string;
63
+ handlerName?: string;
64
+ loc?: SourceLocation;
65
+ }
66
+ export interface ParseExtraction {
67
+ filePath: string;
68
+ parser: ParserKind;
69
+ imports: ImportRecord[];
70
+ exports: ExportRecord[];
71
+ functions: FunctionRecord[];
72
+ classes: ClassRecord[];
73
+ interfaces: InterfaceRecord[];
74
+ variables: VariableRecord[];
75
+ references: ReferenceRecord[];
76
+ calls: CallRecord[];
77
+ routes: RouteRecord[];
78
+ parseError?: string;
79
+ }
80
+ export interface TypeScriptParseResult {
81
+ success: boolean;
82
+ diagnosticsCount: number;
83
+ extraction?: ParseExtraction;
84
+ error?: string;
85
+ }
86
+ export declare function parseWithTypeScript(filePath: string, fileContent: string): TypeScriptParseResult;