@oddessentials/odd-repo-mapper 1.0.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.

Potentially problematic release.


This version of @oddessentials/odd-repo-mapper might be problematic. Click here for more details.

Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -0
  3. package/dist/cli/commands/mcp.d.ts +6 -0
  4. package/dist/cli/commands/mcp.d.ts.map +1 -0
  5. package/dist/cli/commands/mcp.js +11 -0
  6. package/dist/cli/commands/mcp.js.map +1 -0
  7. package/dist/cli/commands/report.d.ts +6 -0
  8. package/dist/cli/commands/report.d.ts.map +1 -0
  9. package/dist/cli/commands/report.js +96 -0
  10. package/dist/cli/commands/report.js.map +1 -0
  11. package/dist/cli/commands/scan.d.ts +6 -0
  12. package/dist/cli/commands/scan.d.ts.map +1 -0
  13. package/dist/cli/commands/scan.js +118 -0
  14. package/dist/cli/commands/scan.js.map +1 -0
  15. package/dist/cli/commands/verify.d.ts +6 -0
  16. package/dist/cli/commands/verify.d.ts.map +1 -0
  17. package/dist/cli/commands/verify.js +47 -0
  18. package/dist/cli/commands/verify.js.map +1 -0
  19. package/dist/cli/index.d.ts +5 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +20 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/core/config.d.ts +53 -0
  24. package/dist/core/config.d.ts.map +1 -0
  25. package/dist/core/config.js +106 -0
  26. package/dist/core/config.js.map +1 -0
  27. package/dist/core/constants.d.ts +31 -0
  28. package/dist/core/constants.d.ts.map +1 -0
  29. package/dist/core/constants.js +31 -0
  30. package/dist/core/constants.js.map +1 -0
  31. package/dist/core/graph.d.ts +61 -0
  32. package/dist/core/graph.d.ts.map +1 -0
  33. package/dist/core/graph.js +163 -0
  34. package/dist/core/graph.js.map +1 -0
  35. package/dist/core/hashing.d.ts +37 -0
  36. package/dist/core/hashing.d.ts.map +1 -0
  37. package/dist/core/hashing.js +66 -0
  38. package/dist/core/hashing.js.map +1 -0
  39. package/dist/core/indexers/go.d.ts +14 -0
  40. package/dist/core/indexers/go.d.ts.map +1 -0
  41. package/dist/core/indexers/go.js +175 -0
  42. package/dist/core/indexers/go.js.map +1 -0
  43. package/dist/core/indexers/index.d.ts +39 -0
  44. package/dist/core/indexers/index.d.ts.map +1 -0
  45. package/dist/core/indexers/index.js +76 -0
  46. package/dist/core/indexers/index.js.map +1 -0
  47. package/dist/core/indexers/python.d.ts +14 -0
  48. package/dist/core/indexers/python.d.ts.map +1 -0
  49. package/dist/core/indexers/python.js +186 -0
  50. package/dist/core/indexers/python.js.map +1 -0
  51. package/dist/core/indexers/rust.d.ts +14 -0
  52. package/dist/core/indexers/rust.d.ts.map +1 -0
  53. package/dist/core/indexers/rust.js +156 -0
  54. package/dist/core/indexers/rust.js.map +1 -0
  55. package/dist/core/indexers/typescript.d.ts +19 -0
  56. package/dist/core/indexers/typescript.d.ts.map +1 -0
  57. package/dist/core/indexers/typescript.js +223 -0
  58. package/dist/core/indexers/typescript.js.map +1 -0
  59. package/dist/core/reports/coverage.d.ts +38 -0
  60. package/dist/core/reports/coverage.d.ts.map +1 -0
  61. package/dist/core/reports/coverage.js +175 -0
  62. package/dist/core/reports/coverage.js.map +1 -0
  63. package/dist/core/reports/index.d.ts +10 -0
  64. package/dist/core/reports/index.d.ts.map +1 -0
  65. package/dist/core/reports/index.js +7 -0
  66. package/dist/core/reports/index.js.map +1 -0
  67. package/dist/core/reports/mermaid.d.ts +41 -0
  68. package/dist/core/reports/mermaid.d.ts.map +1 -0
  69. package/dist/core/reports/mermaid.js +171 -0
  70. package/dist/core/reports/mermaid.js.map +1 -0
  71. package/dist/core/reports/traceability.d.ts +45 -0
  72. package/dist/core/reports/traceability.d.ts.map +1 -0
  73. package/dist/core/reports/traceability.js +190 -0
  74. package/dist/core/reports/traceability.js.map +1 -0
  75. package/dist/core/scanner.d.ts +48 -0
  76. package/dist/core/scanner.d.ts.map +1 -0
  77. package/dist/core/scanner.js +191 -0
  78. package/dist/core/scanner.js.map +1 -0
  79. package/dist/core/toolchain.d.ts +28 -0
  80. package/dist/core/toolchain.d.ts.map +1 -0
  81. package/dist/core/toolchain.js +68 -0
  82. package/dist/core/toolchain.js.map +1 -0
  83. package/dist/core/verify.d.ts +15 -0
  84. package/dist/core/verify.d.ts.map +1 -0
  85. package/dist/core/verify.js +182 -0
  86. package/dist/core/verify.js.map +1 -0
  87. package/dist/mcp/server.d.ts +46 -0
  88. package/dist/mcp/server.d.ts.map +1 -0
  89. package/dist/mcp/server.js +421 -0
  90. package/dist/mcp/server.js.map +1 -0
  91. package/package.json +86 -0
  92. package/schemas/config.schema.json +140 -0
  93. package/schemas/graph.schema.json +132 -0
  94. package/schemas/repo-profile.schema.json +118 -0
  95. package/schemas/toolchain.schema.json +37 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Index orchestrator - runs all language indexers and populates graph.
3
+ */
4
+ import { indexTypeScript } from './typescript.js';
5
+ import { indexPython } from './python.js';
6
+ import { indexGo } from './go.js';
7
+ import { indexRust } from './rust.js';
8
+ /**
9
+ * Run all indexers and aggregate results.
10
+ */
11
+ export function indexAll(options) {
12
+ const { rootDir, files, tsConfigPath } = options;
13
+ const results = {
14
+ nodes: [],
15
+ edges: [],
16
+ stats: {
17
+ typescript: { files: 0, nodes: 0, edges: 0 },
18
+ python: { files: 0, nodes: 0, edges: 0 },
19
+ go: { files: 0, nodes: 0, edges: 0 },
20
+ rust: { files: 0, nodes: 0, edges: 0 },
21
+ },
22
+ };
23
+ // TypeScript/JavaScript
24
+ const tsFiles = [...(files.get('typescript') || []), ...(files.get('javascript') || [])];
25
+ if (tsFiles.length > 0) {
26
+ const tsResult = indexTypeScript({ rootDir, files: tsFiles, tsConfigPath });
27
+ results.nodes.push(...tsResult.nodes);
28
+ results.edges.push(...tsResult.edges);
29
+ results.stats.typescript = {
30
+ files: tsFiles.length,
31
+ nodes: tsResult.nodes.length,
32
+ edges: tsResult.edges.length,
33
+ };
34
+ }
35
+ // Python
36
+ const pyFiles = files.get('python') || [];
37
+ if (pyFiles.length > 0) {
38
+ const pyResult = indexPython({ rootDir, files: pyFiles });
39
+ results.nodes.push(...pyResult.nodes);
40
+ results.edges.push(...pyResult.edges);
41
+ results.stats.python = {
42
+ files: pyFiles.length,
43
+ nodes: pyResult.nodes.length,
44
+ edges: pyResult.edges.length,
45
+ };
46
+ }
47
+ // Go
48
+ const goFiles = files.get('go') || [];
49
+ if (goFiles.length > 0) {
50
+ const goResult = indexGo({ rootDir, files: goFiles });
51
+ results.nodes.push(...goResult.nodes);
52
+ results.edges.push(...goResult.edges);
53
+ results.stats.go = {
54
+ files: goFiles.length,
55
+ nodes: goResult.nodes.length,
56
+ edges: goResult.edges.length,
57
+ };
58
+ }
59
+ // Rust
60
+ const rsFiles = files.get('rust') || [];
61
+ if (rsFiles.length > 0) {
62
+ const rsResult = indexRust({ rootDir, files: rsFiles });
63
+ results.nodes.push(...rsResult.nodes);
64
+ results.edges.push(...rsResult.edges);
65
+ results.stats.rust = {
66
+ files: rsFiles.length,
67
+ nodes: rsResult.nodes.length,
68
+ edges: rsResult.edges.length,
69
+ };
70
+ }
71
+ // Deduplicate nodes by ID
72
+ const nodeMap = new Map(results.nodes.map((n) => [n.id, n]));
73
+ results.nodes = Array.from(nodeMap.values());
74
+ return results;
75
+ }
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/indexers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Python indexer using Python ast module via subprocess.
3
+ * Per D6: Python ast is authoritative for import/module facts.
4
+ */
5
+ import type { IndexResult } from './typescript.js';
6
+ export interface PythonIndexerOptions {
7
+ rootDir: string;
8
+ files: string[];
9
+ }
10
+ /**
11
+ * Index Python files for imports using the ast module.
12
+ */
13
+ export declare function indexPython(options: PythonIndexerOptions): IndexResult;
14
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/core/indexers/python.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAkEnD,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,CAqGtE"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Python indexer using Python ast module via subprocess.
3
+ * Per D6: Python ast is authoritative for import/module facts.
4
+ */
5
+ import { execSync } from 'node:child_process';
6
+ import { writeFileSync, unlinkSync } from 'node:fs';
7
+ import { join, relative } from 'node:path';
8
+ import { tmpdir } from 'node:os';
9
+ import { normalizePath, pathToId } from '../hashing.js';
10
+ const PYTHON_SCRIPT = `
11
+ import ast
12
+ import json
13
+ import sys
14
+
15
+ def extract_imports(filepath):
16
+ with open(filepath, 'r', encoding='utf-8', errors='replace') as f:
17
+ source = f.read()
18
+
19
+ try:
20
+ tree = ast.parse(source, filename=filepath)
21
+ except SyntaxError:
22
+ return {'imports': [], 'entrypoints': []}
23
+
24
+ imports = []
25
+ entrypoints = []
26
+
27
+ for node in ast.walk(tree):
28
+ if isinstance(node, ast.Import):
29
+ for alias in node.names:
30
+ imports.append({
31
+ 'module': alias.name,
32
+ 'line': node.lineno,
33
+ 'col': node.col_offset
34
+ })
35
+ elif isinstance(node, ast.ImportFrom):
36
+ module = node.module or ''
37
+ imports.append({
38
+ 'module': module,
39
+ 'line': node.lineno,
40
+ 'col': node.col_offset,
41
+ 'level': node.level # Relative import level
42
+ })
43
+
44
+ # Check for __main__ block
45
+ for node in ast.iter_child_nodes(tree):
46
+ if isinstance(node, ast.If):
47
+ test = node.test
48
+ if isinstance(test, ast.Compare):
49
+ left = test.left
50
+ if isinstance(left, ast.Name) and left.id == '__name__':
51
+ for comp in test.comparators:
52
+ if isinstance(comp, ast.Constant) and comp.value == '__main__':
53
+ entrypoints.append({
54
+ 'name': '__main__',
55
+ 'line': node.lineno
56
+ })
57
+
58
+ # Find top-level function definitions
59
+ for node in ast.iter_child_nodes(tree):
60
+ if isinstance(node, ast.FunctionDef):
61
+ entrypoints.append({
62
+ 'name': node.name,
63
+ 'line': node.lineno
64
+ })
65
+
66
+ return {'imports': imports, 'entrypoints': entrypoints}
67
+
68
+ if __name__ == '__main__':
69
+ filepath = sys.argv[1]
70
+ result = extract_imports(filepath)
71
+ print(json.dumps(result))
72
+ `;
73
+ /**
74
+ * Index Python files for imports using the ast module.
75
+ */
76
+ export function indexPython(options) {
77
+ const { rootDir, files } = options;
78
+ const nodes = [];
79
+ const edges = [];
80
+ // Write Python script to temp file
81
+ const scriptPath = join(tmpdir(), `repo-mapper-ast-${Date.now()}.py`);
82
+ writeFileSync(scriptPath, PYTHON_SCRIPT, 'utf8');
83
+ try {
84
+ for (const filePath of files) {
85
+ const relativePath = normalizePath(relative(rootDir, filePath));
86
+ const fileId = pathToId(relativePath);
87
+ // Skip if not a Python file
88
+ if (!filePath.endsWith('.py'))
89
+ continue;
90
+ // Add file node
91
+ const isTest = isTestFile(relativePath);
92
+ nodes.push({
93
+ id: fileId,
94
+ type: isTest ? 'test' : 'file',
95
+ path: relativePath,
96
+ language: 'python',
97
+ tier: 1,
98
+ });
99
+ try {
100
+ // Run Python ast extraction
101
+ const output = execSync(`python "${scriptPath}" "${filePath}"`, {
102
+ encoding: 'utf8',
103
+ timeout: 10000,
104
+ windowsHide: true,
105
+ });
106
+ const result = JSON.parse(output.trim());
107
+ // Process imports
108
+ for (const imp of result.imports) {
109
+ const targetPath = resolvePythonImport(imp.module, relativePath, imp.level);
110
+ if (targetPath) {
111
+ const targetId = pathToId(targetPath);
112
+ edges.push({
113
+ source: fileId,
114
+ target: targetId,
115
+ kind: 'import',
116
+ proof: {
117
+ type: 'ast_import',
118
+ location: {
119
+ file: relativePath,
120
+ line: imp.line,
121
+ column: imp.col,
122
+ },
123
+ },
124
+ });
125
+ }
126
+ }
127
+ // Process entrypoints
128
+ for (const ep of result.entrypoints) {
129
+ nodes.push({
130
+ id: pathToId(`${relativePath}#${ep.name}`),
131
+ type: 'entrypoint',
132
+ path: relativePath,
133
+ name: ep.name,
134
+ fqn: `${relativePath}#${ep.name}`,
135
+ language: 'python',
136
+ tier: 1,
137
+ });
138
+ edges.push({
139
+ source: pathToId(`${relativePath}#${ep.name}`),
140
+ target: fileId,
141
+ kind: 'entrypoint',
142
+ proof: {
143
+ type: 'ast_import',
144
+ location: {
145
+ file: relativePath,
146
+ line: ep.line,
147
+ },
148
+ },
149
+ });
150
+ }
151
+ }
152
+ catch {
153
+ // Skip files that fail extraction (Python not installed, syntax error, etc.)
154
+ }
155
+ }
156
+ }
157
+ finally {
158
+ // Clean up temp script
159
+ try {
160
+ unlinkSync(scriptPath);
161
+ }
162
+ catch {
163
+ // Ignore cleanup errors
164
+ }
165
+ }
166
+ return { nodes, edges };
167
+ }
168
+ function resolvePythonImport(module, _fromFile, _level) {
169
+ if (!module)
170
+ return null;
171
+ // Convert module to path
172
+ // e.g., 'foo.bar' -> 'foo/bar.py' or 'foo/bar/__init__.py'
173
+ const parts = module.split('.');
174
+ const relativePath = parts.join('/') + '.py';
175
+ // For relative imports (level > 0), would need more complex resolution
176
+ // For now, return the normalized module path
177
+ return normalizePath(relativePath);
178
+ }
179
+ function isTestFile(path) {
180
+ const lower = path.toLowerCase();
181
+ return (lower.includes('test') ||
182
+ lower.includes('_test') ||
183
+ lower.startsWith('test_') ||
184
+ lower.includes('/tests/'));
185
+ }
186
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/core/indexers/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Rust indexer using cargo metadata.
3
+ * Per D5: Import edges require cargo_metadata proof.
4
+ */
5
+ import type { IndexResult } from './typescript.js';
6
+ export interface RustIndexerOptions {
7
+ rootDir: string;
8
+ files: string[];
9
+ }
10
+ /**
11
+ * Index Rust files using cargo metadata.
12
+ */
13
+ export declare function indexRust(options: RustIndexerOptions): IndexResult;
14
+ //# sourceMappingURL=rust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../../src/core/indexers/rust.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAqBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAgIlE"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Rust indexer using cargo metadata.
3
+ * Per D5: Import edges require cargo_metadata proof.
4
+ */
5
+ import { execSync } from 'node:child_process';
6
+ import { dirname, relative, join } from 'node:path';
7
+ import { existsSync, readdirSync } from 'node:fs';
8
+ import { normalizePath, pathToId } from '../hashing.js';
9
+ /**
10
+ * Index Rust files using cargo metadata.
11
+ */
12
+ export function indexRust(options) {
13
+ const { rootDir } = options;
14
+ const nodes = [];
15
+ const edges = [];
16
+ // Find Cargo.toml
17
+ const cargoPath = findCargoToml(rootDir);
18
+ if (!cargoPath) {
19
+ return { nodes, edges };
20
+ }
21
+ const workspaceRoot = dirname(cargoPath);
22
+ try {
23
+ // Run cargo metadata
24
+ const output = execSync('cargo metadata --no-deps --format-version 1', {
25
+ cwd: workspaceRoot,
26
+ encoding: 'utf8',
27
+ timeout: 60000,
28
+ windowsHide: true,
29
+ });
30
+ const metadata = JSON.parse(output);
31
+ for (const pkg of metadata.packages) {
32
+ const pkgDir = dirname(pkg.manifest_path);
33
+ const pkgRelPath = normalizePath(relative(rootDir, pkgDir));
34
+ const pkgId = pathToId(pkgRelPath);
35
+ // Add package node
36
+ nodes.push({
37
+ id: pkgId,
38
+ type: 'module',
39
+ path: pkgRelPath,
40
+ name: pkg.name,
41
+ fqn: pkg.name,
42
+ language: 'rust',
43
+ tier: 1,
44
+ });
45
+ // Add target nodes (binaries, libs)
46
+ for (const target of pkg.targets) {
47
+ const targetPath = normalizePath(relative(rootDir, target.src_path));
48
+ const targetId = pathToId(targetPath);
49
+ const isBinary = target.kind.includes('bin');
50
+ const isTest = target.kind.includes('test') || targetPath.includes('tests/');
51
+ nodes.push({
52
+ id: targetId,
53
+ type: isTest ? 'test' : isBinary ? 'entrypoint' : 'file',
54
+ path: targetPath,
55
+ name: target.name,
56
+ language: 'rust',
57
+ tier: 1,
58
+ });
59
+ // Target belongs to package
60
+ edges.push({
61
+ source: pkgId,
62
+ target: targetId,
63
+ kind: 'contains',
64
+ proof: {
65
+ type: 'cargo_metadata',
66
+ location: { file: targetPath },
67
+ },
68
+ });
69
+ // Binary entrypoint
70
+ if (isBinary) {
71
+ edges.push({
72
+ source: targetId,
73
+ target: pkgId,
74
+ kind: 'entrypoint',
75
+ proof: {
76
+ type: 'cargo_metadata',
77
+ location: { file: targetPath },
78
+ },
79
+ });
80
+ }
81
+ }
82
+ // Add source files from src/
83
+ const srcDir = join(pkgDir, 'src');
84
+ if (existsSync(srcDir)) {
85
+ const rustFiles = findRustFiles(srcDir);
86
+ for (const filePath of rustFiles) {
87
+ const relativePath = normalizePath(relative(rootDir, filePath));
88
+ const fileId = pathToId(relativePath);
89
+ // Skip if already added as target
90
+ if (nodes.some((n) => n.id === fileId))
91
+ continue;
92
+ const isTest = relativePath.includes('test') || relativePath.includes('tests/');
93
+ nodes.push({
94
+ id: fileId,
95
+ type: isTest ? 'test' : 'file',
96
+ path: relativePath,
97
+ language: 'rust',
98
+ tier: 1,
99
+ });
100
+ }
101
+ }
102
+ // Add internal dependency edges
103
+ for (const dep of pkg.dependencies) {
104
+ if (dep.path) {
105
+ // Local path dependency
106
+ const depPath = normalizePath(relative(rootDir, dep.path));
107
+ const depId = pathToId(depPath);
108
+ edges.push({
109
+ source: pkgId,
110
+ target: depId,
111
+ kind: 'import',
112
+ proof: {
113
+ type: 'cargo_metadata',
114
+ location: { file: pkgRelPath },
115
+ },
116
+ });
117
+ }
118
+ }
119
+ }
120
+ }
121
+ catch {
122
+ // cargo metadata failed
123
+ }
124
+ return { nodes, edges };
125
+ }
126
+ function findCargoToml(startDir) {
127
+ let dir = startDir;
128
+ while (dir !== dirname(dir)) {
129
+ const cargoPath = join(dir, 'Cargo.toml');
130
+ if (existsSync(cargoPath)) {
131
+ return cargoPath;
132
+ }
133
+ dir = dirname(dir);
134
+ }
135
+ return null;
136
+ }
137
+ function findRustFiles(dir) {
138
+ const files = [];
139
+ try {
140
+ const entries = readdirSync(dir, { withFileTypes: true });
141
+ for (const entry of entries) {
142
+ const fullPath = join(dir, entry.name);
143
+ if (entry.isDirectory()) {
144
+ files.push(...findRustFiles(fullPath));
145
+ }
146
+ else if (entry.isFile() && entry.name.endsWith('.rs')) {
147
+ files.push(fullPath);
148
+ }
149
+ }
150
+ }
151
+ catch {
152
+ // Ignore read errors
153
+ }
154
+ return files;
155
+ }
156
+ //# sourceMappingURL=rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../src/core/indexers/rust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * TypeScript/JavaScript indexer using ts-morph.
3
+ * Per D5: Import edges require ast_import proof.
4
+ */
5
+ import type { GraphNode, GraphEdge } from '../graph.js';
6
+ export interface IndexResult {
7
+ nodes: GraphNode[];
8
+ edges: GraphEdge[];
9
+ }
10
+ export interface TypeScriptIndexerOptions {
11
+ rootDir: string;
12
+ files: string[];
13
+ tsConfigPath?: string;
14
+ }
15
+ /**
16
+ * Index TypeScript/JavaScript files for imports and symbols.
17
+ */
18
+ export declare function indexTypeScript(options: TypeScriptIndexerOptions): IndexResult;
19
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../../src/core/indexers/typescript.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CA8F9E"}