@szabadkai/graphite 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 (148) hide show
  1. package/README.md +427 -0
  2. package/dist/cli/formatters.d.ts +3 -0
  3. package/dist/cli/formatters.js +61 -0
  4. package/dist/cli/formatters.js.map +1 -0
  5. package/dist/cli/index.d.ts +2 -0
  6. package/dist/cli/index.js +186 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/index.d.ts +6 -0
  9. package/dist/index.js +23 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/indexer/call-resolver.d.ts +8 -0
  12. package/dist/indexer/call-resolver.js +161 -0
  13. package/dist/indexer/call-resolver.js.map +1 -0
  14. package/dist/indexer/extractors/calls.d.ts +17 -0
  15. package/dist/indexer/extractors/calls.js +206 -0
  16. package/dist/indexer/extractors/calls.js.map +1 -0
  17. package/dist/indexer/extractors/classes.d.ts +35 -0
  18. package/dist/indexer/extractors/classes.js +209 -0
  19. package/dist/indexer/extractors/classes.js.map +1 -0
  20. package/dist/indexer/extractors/exports.d.ts +12 -0
  21. package/dist/indexer/extractors/exports.js +267 -0
  22. package/dist/indexer/extractors/exports.js.map +1 -0
  23. package/dist/indexer/extractors/functions.d.ts +12 -0
  24. package/dist/indexer/extractors/functions.js +169 -0
  25. package/dist/indexer/extractors/functions.js.map +1 -0
  26. package/dist/indexer/extractors/imports.d.ts +12 -0
  27. package/dist/indexer/extractors/imports.js +195 -0
  28. package/dist/indexer/extractors/imports.js.map +1 -0
  29. package/dist/indexer/extractors/index.d.ts +7 -0
  30. package/dist/indexer/extractors/index.js +24 -0
  31. package/dist/indexer/extractors/index.js.map +1 -0
  32. package/dist/indexer/extractors/types.d.ts +12 -0
  33. package/dist/indexer/extractors/types.js +138 -0
  34. package/dist/indexer/extractors/types.js.map +1 -0
  35. package/dist/indexer/extractors/variables.d.ts +10 -0
  36. package/dist/indexer/extractors/variables.js +134 -0
  37. package/dist/indexer/extractors/variables.js.map +1 -0
  38. package/dist/indexer/file-discovery.d.ts +7 -0
  39. package/dist/indexer/file-discovery.js +92 -0
  40. package/dist/indexer/file-discovery.js.map +1 -0
  41. package/dist/indexer/file-indexer.d.ts +2 -0
  42. package/dist/indexer/file-indexer.js +267 -0
  43. package/dist/indexer/file-indexer.js.map +1 -0
  44. package/dist/indexer/graph-contract.d.ts +25 -0
  45. package/dist/indexer/graph-contract.js +7 -0
  46. package/dist/indexer/graph-contract.js.map +1 -0
  47. package/dist/indexer/hasher.d.ts +1 -0
  48. package/dist/indexer/hasher.js +11 -0
  49. package/dist/indexer/hasher.js.map +1 -0
  50. package/dist/indexer/import-resolver.d.ts +11 -0
  51. package/dist/indexer/import-resolver.js +131 -0
  52. package/dist/indexer/import-resolver.js.map +1 -0
  53. package/dist/indexer/index.d.ts +11 -0
  54. package/dist/indexer/index.js +28 -0
  55. package/dist/indexer/index.js.map +1 -0
  56. package/dist/indexer/inheritance-resolver.d.ts +7 -0
  57. package/dist/indexer/inheritance-resolver.js +119 -0
  58. package/dist/indexer/inheritance-resolver.js.map +1 -0
  59. package/dist/indexer/parser.d.ts +5 -0
  60. package/dist/indexer/parser.js +48 -0
  61. package/dist/indexer/parser.js.map +1 -0
  62. package/dist/indexer/path-utils.d.ts +3 -0
  63. package/dist/indexer/path-utils.js +20 -0
  64. package/dist/indexer/path-utils.js.map +1 -0
  65. package/dist/indexer/project-indexer.d.ts +14 -0
  66. package/dist/indexer/project-indexer.js +167 -0
  67. package/dist/indexer/project-indexer.js.map +1 -0
  68. package/dist/indexer/property-parsers.d.ts +20 -0
  69. package/dist/indexer/property-parsers.js +81 -0
  70. package/dist/indexer/property-parsers.js.map +1 -0
  71. package/dist/mcp/index.d.ts +3 -0
  72. package/dist/mcp/index.js +20 -0
  73. package/dist/mcp/index.js.map +1 -0
  74. package/dist/mcp/response-formatter.d.ts +10 -0
  75. package/dist/mcp/response-formatter.js +47 -0
  76. package/dist/mcp/response-formatter.js.map +1 -0
  77. package/dist/mcp/server.d.ts +10 -0
  78. package/dist/mcp/server.js +118 -0
  79. package/dist/mcp/server.js.map +1 -0
  80. package/dist/mcp/tools-list.d.ts +9 -0
  81. package/dist/mcp/tools-list.js +12 -0
  82. package/dist/mcp/tools-list.js.map +1 -0
  83. package/dist/mcp/tools.d.ts +13 -0
  84. package/dist/mcp/tools.js +163 -0
  85. package/dist/mcp/tools.js.map +1 -0
  86. package/dist/query/analyze-impact.d.ts +18 -0
  87. package/dist/query/analyze-impact.js +58 -0
  88. package/dist/query/analyze-impact.js.map +1 -0
  89. package/dist/query/find-callees.d.ts +12 -0
  90. package/dist/query/find-callees.js +46 -0
  91. package/dist/query/find-callees.js.map +1 -0
  92. package/dist/query/find-callers.d.ts +12 -0
  93. package/dist/query/find-callers.js +46 -0
  94. package/dist/query/find-callers.js.map +1 -0
  95. package/dist/query/find-definition.d.ts +3 -0
  96. package/dist/query/find-definition.js +41 -0
  97. package/dist/query/find-definition.js.map +1 -0
  98. package/dist/query/find-dependency-path.d.ts +2 -0
  99. package/dist/query/find-dependency-path.js +39 -0
  100. package/dist/query/find-dependency-path.js.map +1 -0
  101. package/dist/query/find-implementations.d.ts +10 -0
  102. package/dist/query/find-implementations.js +34 -0
  103. package/dist/query/find-implementations.js.map +1 -0
  104. package/dist/query/get-exports.d.ts +3 -0
  105. package/dist/query/get-exports.js +82 -0
  106. package/dist/query/get-exports.js.map +1 -0
  107. package/dist/query/get-file-structure.d.ts +3 -0
  108. package/dist/query/get-file-structure.js +58 -0
  109. package/dist/query/get-file-structure.js.map +1 -0
  110. package/dist/query/get-graph-stats.d.ts +21 -0
  111. package/dist/query/get-graph-stats.js +42 -0
  112. package/dist/query/get-graph-stats.js.map +1 -0
  113. package/dist/query/index.d.ts +11 -0
  114. package/dist/query/index.js +28 -0
  115. package/dist/query/index.js.map +1 -0
  116. package/dist/query/search-symbols.d.ts +6 -0
  117. package/dist/query/search-symbols.js +75 -0
  118. package/dist/query/search-symbols.js.map +1 -0
  119. package/dist/query/types.d.ts +41 -0
  120. package/dist/query/types.js +36 -0
  121. package/dist/query/types.js.map +1 -0
  122. package/dist/storage/database.d.ts +13 -0
  123. package/dist/storage/database.js +49 -0
  124. package/dist/storage/database.js.map +1 -0
  125. package/dist/storage/index.d.ts +7 -0
  126. package/dist/storage/index.js +24 -0
  127. package/dist/storage/index.js.map +1 -0
  128. package/dist/storage/migrations/001_initial.sql +59 -0
  129. package/dist/storage/migrations/002_add_name_index.sql +9 -0
  130. package/dist/storage/migrator.d.ts +9 -0
  131. package/dist/storage/migrator.js +86 -0
  132. package/dist/storage/migrator.js.map +1 -0
  133. package/dist/storage/paths.d.ts +5 -0
  134. package/dist/storage/paths.js +25 -0
  135. package/dist/storage/paths.js.map +1 -0
  136. package/dist/storage/reader.d.ts +10 -0
  137. package/dist/storage/reader.js +103 -0
  138. package/dist/storage/reader.js.map +1 -0
  139. package/dist/storage/schema.d.ts +14 -0
  140. package/dist/storage/schema.js +18 -0
  141. package/dist/storage/schema.js.map +1 -0
  142. package/dist/storage/types.d.ts +42 -0
  143. package/dist/storage/types.js +3 -0
  144. package/dist/storage/types.js.map +1 -0
  145. package/dist/storage/writer.d.ts +13 -0
  146. package/dist/storage/writer.js +160 -0
  147. package/dist/storage/writer.js.map +1 -0
  148. package/package.json +47 -0
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findCallees = findCallees;
4
+ function findCallees(db, symbolName, options) {
5
+ const depth = Math.max(1, options?.depth ?? 1);
6
+ const maxResults = Math.max(1, Math.min(options?.maxResults ?? 50, 500));
7
+ const rows = db
8
+ .prepare(`
9
+ WITH RECURSIVE starts(id) AS (
10
+ SELECT id FROM nodes WHERE name = ?
11
+ ),
12
+ callee_chain(callee_id, depth, path) AS (
13
+ SELECT edges.target_id, 1, ',' || edges.source_id || ',' || edges.target_id || ','
14
+ FROM edges
15
+ JOIN starts ON starts.id = edges.source_id
16
+ WHERE edges.type = 'CALLS'
17
+ UNION
18
+ SELECT edges.target_id, callee_chain.depth + 1, callee_chain.path || edges.target_id || ','
19
+ FROM edges
20
+ JOIN callee_chain ON callee_chain.callee_id = edges.source_id
21
+ WHERE
22
+ edges.type = 'CALLS'
23
+ AND callee_chain.depth < ?
24
+ AND instr(callee_chain.path, ',' || edges.target_id || ',') = 0
25
+ )
26
+ SELECT DISTINCT
27
+ nodes.id as callee_id,
28
+ nodes.name as callee_name,
29
+ nodes.file_path as file_path,
30
+ nodes.start_line as line,
31
+ callee_chain.depth as depth
32
+ FROM callee_chain
33
+ JOIN nodes ON nodes.id = callee_chain.callee_id
34
+ ORDER BY depth ASC, file_path ASC, line ASC
35
+ LIMIT ?
36
+ `)
37
+ .all(symbolName, depth, maxResults);
38
+ return rows.map((row) => ({
39
+ calleeId: row.callee_id,
40
+ calleeName: row.callee_name,
41
+ filePath: row.file_path,
42
+ line: row.line,
43
+ depth: row.depth
44
+ }));
45
+ }
46
+ //# sourceMappingURL=find-callees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-callees.js","sourceRoot":"","sources":["../../src/query/find-callees.ts"],"names":[],"mappings":";;AAUA,kCAuDC;AAvDD,SAAgB,WAAW,CACzB,EAAqB,EACrB,UAAkB,EAClB,OAAiD;IAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzE,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BD,CACA;SACA,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAMlC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type Database from "better-sqlite3";
2
+ export interface CallerResult {
3
+ callerId: string;
4
+ callerName: string;
5
+ filePath: string;
6
+ line: number;
7
+ depth: number;
8
+ }
9
+ export declare function findCallers(db: Database.Database, symbolName: string, options?: {
10
+ depth?: number;
11
+ maxResults?: number;
12
+ }): CallerResult[];
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findCallers = findCallers;
4
+ function findCallers(db, symbolName, options) {
5
+ const depth = Math.max(1, options?.depth ?? 1);
6
+ const maxResults = Math.max(1, Math.min(options?.maxResults ?? 50, 500));
7
+ const rows = db
8
+ .prepare(`
9
+ WITH RECURSIVE targets(id) AS (
10
+ SELECT id FROM nodes WHERE name = ?
11
+ ),
12
+ caller_chain(caller_id, depth, path) AS (
13
+ SELECT edges.source_id, 1, ',' || edges.source_id || ',' || edges.target_id || ','
14
+ FROM edges
15
+ JOIN targets ON targets.id = edges.target_id
16
+ WHERE edges.type = 'CALLS'
17
+ UNION
18
+ SELECT edges.source_id, caller_chain.depth + 1, caller_chain.path || edges.source_id || ','
19
+ FROM edges
20
+ JOIN caller_chain ON caller_chain.caller_id = edges.target_id
21
+ WHERE
22
+ edges.type = 'CALLS'
23
+ AND caller_chain.depth < ?
24
+ AND instr(caller_chain.path, ',' || edges.source_id || ',') = 0
25
+ )
26
+ SELECT DISTINCT
27
+ nodes.id as caller_id,
28
+ nodes.name as caller_name,
29
+ nodes.file_path as file_path,
30
+ nodes.start_line as line,
31
+ caller_chain.depth as depth
32
+ FROM caller_chain
33
+ JOIN nodes ON nodes.id = caller_chain.caller_id
34
+ ORDER BY depth ASC, file_path ASC, line ASC
35
+ LIMIT ?
36
+ `)
37
+ .all(symbolName, depth, maxResults);
38
+ return rows.map((row) => ({
39
+ callerId: row.caller_id,
40
+ callerName: row.caller_name,
41
+ filePath: row.file_path,
42
+ line: row.line,
43
+ depth: row.depth
44
+ }));
45
+ }
46
+ //# sourceMappingURL=find-callers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-callers.js","sourceRoot":"","sources":["../../src/query/find-callers.ts"],"names":[],"mappings":";;AAUA,kCAuDC;AAvDD,SAAgB,WAAW,CACzB,EAAqB,EACrB,UAAkB,EAClB,OAAiD;IAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzE,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BD,CACA;SACA,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAMlC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type Database from "better-sqlite3";
2
+ import { type DefinitionResult } from "./types";
3
+ export declare function findDefinition(db: Database.Database, symbol: string, type?: string): DefinitionResult[];
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findDefinition = findDefinition;
4
+ const types_1 = require("./types");
5
+ function findDefinition(db, symbol, type) {
6
+ const normalizedType = (0, types_1.normalizeNodeTypeFilter)(type);
7
+ // L5: Add LIMIT to prevent unbounded results for common names
8
+ const statement = normalizedType
9
+ ? db.prepare("SELECT id, name, type, file_path, start_line, end_line, start_col, end_col, properties FROM nodes WHERE name = ? AND type = ? ORDER BY file_path ASC, start_line ASC LIMIT 100")
10
+ : db.prepare("SELECT id, name, type, file_path, start_line, end_line, start_col, end_col, properties FROM nodes WHERE name = ? ORDER BY file_path ASC, start_line ASC LIMIT 100");
11
+ const rows = (normalizedType
12
+ ? statement.all(symbol, normalizedType)
13
+ : statement.all(symbol));
14
+ const mapped = rows.map((row) => {
15
+ const properties = (0, types_1.safeParseProperties)(row.properties);
16
+ return {
17
+ id: row.id,
18
+ name: row.name,
19
+ type: row.type,
20
+ filePath: row.file_path,
21
+ startLine: row.start_line,
22
+ endLine: row.end_line,
23
+ startCol: row.start_col,
24
+ endCol: row.end_col,
25
+ exported: Boolean(properties.isExported),
26
+ signature: typeof properties.signature === "string"
27
+ ? properties.signature
28
+ : null
29
+ };
30
+ });
31
+ return mapped.sort((a, b) => {
32
+ if (a.exported !== b.exported) {
33
+ return a.exported ? -1 : 1;
34
+ }
35
+ if (a.filePath !== b.filePath) {
36
+ return a.filePath.localeCompare(b.filePath);
37
+ }
38
+ return a.startLine - b.startLine;
39
+ });
40
+ }
41
+ //# sourceMappingURL=find-definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-definition.js","sourceRoot":"","sources":["../../src/query/find-definition.ts"],"names":[],"mappings":";;AAmBA,wCAmDC;AArED,mCAIiB;AAcjB,SAAgB,cAAc,CAC5B,EAAqB,EACrB,MAAc,EACd,IAAa;IAEb,MAAM,cAAc,GAAG,IAAA,+BAAuB,EAAC,IAAI,CAAC,CAAC;IAErD,8DAA8D;IAC9D,MAAM,SAAS,GAAG,cAAc;QAC9B,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,gLAAgL,CACjL;QACH,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,mKAAmK,CACpK,CAAC;IAEN,MAAM,IAAI,GAAG,CAAC,cAAc;QAC1B,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;QACvC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAc,CAAC;IAExC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEvD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;YACxC,SAAS,EACP,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ;gBACtC,CAAC,CAAC,UAAU,CAAC,SAAS;gBACtB,CAAC,CAAC,IAAI;SACgB,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type Database from "better-sqlite3";
2
+ export declare function findDependencyPath(db: Database.Database, sourceFilePath: string, targetFilePath: string): string[];
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findDependencyPath = findDependencyPath;
4
+ function toFileNodeId(filePath) {
5
+ return `${filePath}::File::${filePath}::1`;
6
+ }
7
+ function findDependencyPath(db, sourceFilePath, targetFilePath) {
8
+ if (sourceFilePath === targetFilePath) {
9
+ return [sourceFilePath];
10
+ }
11
+ const rows = db
12
+ .prepare(`
13
+ WITH RECURSIVE queue(node_id, path, depth) AS (
14
+ SELECT ?, ',' || ? || ',' as path, 0
15
+ UNION
16
+ SELECT edges.target_id, queue.path || edges.target_id || ',', queue.depth + 1
17
+ FROM edges
18
+ JOIN queue ON queue.node_id = edges.source_id
19
+ WHERE
20
+ edges.type = 'IMPORTS'
21
+ AND queue.depth < 50
22
+ AND instr(queue.path, ',' || edges.target_id || ',') = 0
23
+ )
24
+ SELECT path
25
+ FROM queue
26
+ WHERE node_id = ?
27
+ ORDER BY depth ASC
28
+ LIMIT 1
29
+ `)
30
+ .get(toFileNodeId(sourceFilePath), toFileNodeId(sourceFilePath), toFileNodeId(targetFilePath));
31
+ if (!rows?.path) {
32
+ return [];
33
+ }
34
+ return rows.path
35
+ .split(",")
36
+ .filter((segment) => segment.length > 0)
37
+ .map((nodeId) => nodeId.split("::")[0]);
38
+ }
39
+ //# sourceMappingURL=find-dependency-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-dependency-path.js","sourceRoot":"","sources":["../../src/query/find-dependency-path.ts"],"names":[],"mappings":";;AAMA,gDA4CC;AAhDD,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,GAAG,QAAQ,WAAW,QAAQ,KAAK,CAAC;AAC7C,CAAC;AAED,SAAgB,kBAAkB,CAChC,EAAqB,EACrB,cAAsB,EACtB,cAAsB;IAEtB,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;QACtC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;;;;;;;KAiBD,CACA;SACA,GAAG,CACF,YAAY,CAAC,cAAc,CAAC,EAC5B,YAAY,CAAC,cAAc,CAAC,EAC5B,YAAY,CAAC,cAAc,CAAC,CACG,CAAC;IAEpC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,IAAI;SACb,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type Database from "better-sqlite3";
2
+ export interface ImplementationResult {
3
+ id: string;
4
+ name: string;
5
+ type: string;
6
+ filePath: string;
7
+ line: number;
8
+ edgeType: "IMPLEMENTS" | "EXTENDS";
9
+ }
10
+ export declare function findImplementations(db: Database.Database, symbolName: string): ImplementationResult[];
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findImplementations = findImplementations;
4
+ function findImplementations(db, symbolName) {
5
+ const rows = db
6
+ .prepare(`
7
+ WITH targets AS (
8
+ SELECT id FROM nodes WHERE name = ?
9
+ )
10
+ SELECT
11
+ source.id as id,
12
+ source.name as name,
13
+ source.type as type,
14
+ source.file_path as file_path,
15
+ source.start_line as line,
16
+ edges.type as edge_type
17
+ FROM edges
18
+ JOIN targets ON targets.id = edges.target_id
19
+ JOIN nodes AS source ON source.id = edges.source_id
20
+ WHERE edges.type IN ('IMPLEMENTS', 'EXTENDS')
21
+ ORDER BY source.file_path ASC, source.start_line ASC
22
+ LIMIT 100
23
+ `)
24
+ .all(symbolName);
25
+ return rows.map((row) => ({
26
+ id: row.id,
27
+ name: row.name,
28
+ type: row.type,
29
+ filePath: row.file_path,
30
+ line: row.line,
31
+ edgeType: row.edge_type
32
+ }));
33
+ }
34
+ //# sourceMappingURL=find-implementations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-implementations.js","sourceRoot":"","sources":["../../src/query/find-implementations.ts"],"names":[],"mappings":";;AAWA,kDA0CC;AA1CD,SAAgB,mBAAmB,CACjC,EAAqB,EACrB,UAAkB;IAElB,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;;;;;;;KAiBD,CACA;SACA,GAAG,CAAC,UAAU,CAOf,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,SAAS;KACxB,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type Database from "better-sqlite3";
2
+ import { type ExportResult } from "./types";
3
+ export declare function getExports(db: Database.Database, fileOrModule: string): ExportResult[];
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getExports = getExports;
4
+ const types_1 = require("./types");
5
+ // M13: Match multiple extensions, not just .ts
6
+ const SUPPORTED_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mts", ".mjs", ".cts", ".cjs"];
7
+ function resolveFilePath(db, fileOrModule) {
8
+ const exact = db
9
+ .prepare("SELECT path FROM files WHERE path = ? LIMIT 1")
10
+ .get(fileOrModule);
11
+ if (exact) {
12
+ return exact.path;
13
+ }
14
+ // Try each supported extension
15
+ for (const ext of SUPPORTED_EXTENSIONS) {
16
+ const candidates = db
17
+ .prepare("SELECT path FROM files WHERE path LIKE ? ORDER BY path ASC")
18
+ .all(`%/${fileOrModule}${ext}`);
19
+ if (candidates.length === 1) {
20
+ return candidates[0].path;
21
+ }
22
+ }
23
+ return null;
24
+ }
25
+ function getExports(db, fileOrModule) {
26
+ const resolvedFilePath = resolveFilePath(db, fileOrModule);
27
+ if (!resolvedFilePath) {
28
+ return [];
29
+ }
30
+ const fileNodeId = `${resolvedFilePath}::File::${resolvedFilePath}::1`;
31
+ // M5: Single JOIN query instead of N+1 per-export SELECT
32
+ const rows = db
33
+ .prepare(`
34
+ SELECT
35
+ edges.target_id,
36
+ edges.properties AS edge_properties,
37
+ nodes.type AS node_type,
38
+ nodes.name AS node_name,
39
+ nodes.file_path AS node_file_path,
40
+ nodes.start_line AS node_start_line,
41
+ nodes.end_line AS node_end_line,
42
+ nodes.start_col AS node_start_col,
43
+ nodes.end_col AS node_end_col,
44
+ nodes.properties AS node_properties
45
+ FROM edges
46
+ JOIN nodes ON nodes.id = edges.target_id
47
+ WHERE edges.type = 'EXPORTS' AND edges.source_id = ?
48
+ `)
49
+ .all(fileNodeId);
50
+ const results = [];
51
+ for (const row of rows) {
52
+ const edgeProperties = (0, types_1.safeParseProperties)(row.edge_properties);
53
+ const exportedName = typeof edgeProperties.exportedName === "string" ? edgeProperties.exportedName : "";
54
+ const localName = typeof edgeProperties.localName === "string" ? edgeProperties.localName : null;
55
+ const sourcePath = typeof edgeProperties.sourcePath === "string" ? edgeProperties.sourcePath : null;
56
+ const reExport = Boolean(edgeProperties.reExport);
57
+ const targetProperties = (0, types_1.safeParseProperties)(row.node_properties);
58
+ results.push({
59
+ exportedName,
60
+ localName,
61
+ type: row.node_type,
62
+ filePath: row.node_file_path,
63
+ startLine: row.node_start_line,
64
+ endLine: row.node_end_line,
65
+ startCol: row.node_start_col,
66
+ endCol: row.node_end_col,
67
+ signature: typeof targetProperties.signature === "string" ? targetProperties.signature : null,
68
+ reExport,
69
+ sourcePath
70
+ });
71
+ }
72
+ return results.sort((a, b) => {
73
+ if (a.exportedName !== b.exportedName) {
74
+ return a.exportedName.localeCompare(b.exportedName);
75
+ }
76
+ if ((a.filePath ?? "") !== (b.filePath ?? "")) {
77
+ return (a.filePath ?? "").localeCompare(b.filePath ?? "");
78
+ }
79
+ return (a.startLine ?? 0) - (b.startLine ?? 0);
80
+ });
81
+ }
82
+ //# sourceMappingURL=get-exports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-exports.js","sourceRoot":"","sources":["../../src/query/get-exports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type Database from "better-sqlite3";
2
+ import { type FileStructureResult } from "./types";
3
+ export declare function getFileStructure(db: Database.Database, filePath: string): FileStructureResult;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFileStructure = getFileStructure;
4
+ const types_1 = require("./types");
5
+ function mapDefinition(row) {
6
+ const properties = (0, types_1.safeParseProperties)(row.properties);
7
+ return {
8
+ id: row.id,
9
+ name: row.name,
10
+ type: row.type,
11
+ filePath: row.file_path,
12
+ startLine: row.start_line,
13
+ endLine: row.end_line,
14
+ startCol: row.start_col,
15
+ endCol: row.end_col,
16
+ exported: Boolean(properties.isExported),
17
+ signature: typeof properties.signature === "string" ? properties.signature : null
18
+ };
19
+ }
20
+ function getFileStructure(db, filePath) {
21
+ const nodeRows = db
22
+ .prepare("SELECT id, name, type, file_path, start_line, end_line, start_col, end_col, properties FROM nodes WHERE file_path = ? ORDER BY start_line ASC, name ASC")
23
+ .all(filePath);
24
+ const containsRows = db
25
+ .prepare("SELECT source_id, target_id FROM edges WHERE type = 'CONTAINS' AND source_id IN (SELECT id FROM nodes WHERE file_path = ?)")
26
+ .all(filePath);
27
+ const byId = new Map(nodeRows.map((row) => [row.id, mapDefinition(row)]));
28
+ const classes = nodeRows
29
+ .filter((row) => row.type === "Class")
30
+ .map((row) => {
31
+ const cls = byId.get(row.id);
32
+ const memberIds = containsRows
33
+ .filter((edge) => edge.source_id === row.id)
34
+ .map((edge) => edge.target_id);
35
+ const members = memberIds
36
+ .map((id) => byId.get(id))
37
+ .filter((item) => Boolean(item))
38
+ .sort((a, b) => a.startLine - b.startLine);
39
+ return {
40
+ ...cls,
41
+ members
42
+ };
43
+ });
44
+ const pick = (type) => nodeRows
45
+ .filter((row) => row.type === type)
46
+ .map((row) => byId.get(row.id))
47
+ .sort((a, b) => a.startLine - b.startLine);
48
+ return {
49
+ filePath,
50
+ functions: pick("Function"),
51
+ classes,
52
+ interfaces: pick("Interface"),
53
+ types: pick("TypeAlias"),
54
+ enums: pick("Enum"),
55
+ variables: pick("Variable")
56
+ };
57
+ }
58
+ //# sourceMappingURL=get-file-structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-file-structure.js","sourceRoot":"","sources":["../../src/query/get-file-structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type Database from "better-sqlite3";
2
+ export interface GraphStats {
3
+ totalFiles: number;
4
+ nodeCountByType: Array<{
5
+ type: string;
6
+ count: number;
7
+ }>;
8
+ edgeCountByType: Array<{
9
+ type: string;
10
+ count: number;
11
+ }>;
12
+ oldestIndexedAt: number | null;
13
+ newestIndexedAt: number | null;
14
+ topConnectedNodes: Array<{
15
+ id: string;
16
+ name: string;
17
+ type: string;
18
+ degree: number;
19
+ }>;
20
+ }
21
+ export declare function getGraphStats(db: Database.Database): GraphStats;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGraphStats = getGraphStats;
4
+ function getGraphStats(db) {
5
+ const totalFiles = db.prepare("SELECT COUNT(*) as count FROM files").get()
6
+ .count;
7
+ const nodeCountByType = db
8
+ .prepare("SELECT type, COUNT(*) as count FROM nodes GROUP BY type ORDER BY count DESC, type ASC")
9
+ .all();
10
+ const edgeCountByType = db
11
+ .prepare("SELECT type, COUNT(*) as count FROM edges GROUP BY type ORDER BY count DESC, type ASC")
12
+ .all();
13
+ const freshness = db
14
+ .prepare("SELECT MIN(indexed_at) as oldest, MAX(indexed_at) as newest FROM files")
15
+ .get();
16
+ const topConnectedNodes = db
17
+ .prepare(`
18
+ WITH degrees AS (
19
+ SELECT source_id as node_id, COUNT(*) as degree FROM edges GROUP BY source_id
20
+ UNION ALL
21
+ SELECT target_id as node_id, COUNT(*) as degree FROM edges GROUP BY target_id
22
+ ),
23
+ summed AS (
24
+ SELECT node_id, SUM(degree) as degree FROM degrees GROUP BY node_id
25
+ )
26
+ SELECT nodes.id, nodes.name, nodes.type, summed.degree
27
+ FROM summed
28
+ JOIN nodes ON nodes.id = summed.node_id
29
+ ORDER BY summed.degree DESC, nodes.name ASC
30
+ LIMIT 10
31
+ `)
32
+ .all();
33
+ return {
34
+ totalFiles,
35
+ nodeCountByType,
36
+ edgeCountByType,
37
+ oldestIndexedAt: freshness.oldest,
38
+ newestIndexedAt: freshness.newest,
39
+ topConnectedNodes
40
+ };
41
+ }
42
+ //# sourceMappingURL=get-graph-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-graph-stats.js","sourceRoot":"","sources":["../../src/query/get-graph-stats.ts"],"names":[],"mappings":";;AAWA,sCA4CC;AA5CD,SAAgB,aAAa,CAAC,EAAqB;IACjD,MAAM,UAAU,GAAI,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAwB;SAC9F,KAAK,CAAC;IAET,MAAM,eAAe,GAAG,EAAE;SACvB,OAAO,CAAC,uFAAuF,CAAC;SAChG,GAAG,EAA4C,CAAC;IAEnD,MAAM,eAAe,GAAG,EAAE;SACvB,OAAO,CAAC,uFAAuF,CAAC;SAChG,GAAG,EAA4C,CAAC;IAEnD,MAAM,SAAS,GAAG,EAAE;SACjB,OAAO,CAAC,wEAAwE,CAAC;SACjF,GAAG,EAAsD,CAAC;IAE7D,MAAM,iBAAiB,GAAG,EAAE;SACzB,OAAO,CACN;;;;;;;;;;;;;;KAcD,CACA;SACA,GAAG,EAAuE,CAAC;IAE9E,OAAO;QACL,UAAU;QACV,eAAe;QACf,eAAe;QACf,eAAe,EAAE,SAAS,CAAC,MAAM;QACjC,eAAe,EAAE,SAAS,CAAC,MAAM;QACjC,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export * from "./types";
2
+ export * from "./find-definition";
3
+ export * from "./search-symbols";
4
+ export * from "./get-file-structure";
5
+ export * from "./get-exports";
6
+ export * from "./find-callers";
7
+ export * from "./find-callees";
8
+ export * from "./get-graph-stats";
9
+ export * from "./find-implementations";
10
+ export * from "./analyze-impact";
11
+ export * from "./find-dependency-path";
@@ -0,0 +1,28 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./find-definition"), exports);
19
+ __exportStar(require("./search-symbols"), exports);
20
+ __exportStar(require("./get-file-structure"), exports);
21
+ __exportStar(require("./get-exports"), exports);
22
+ __exportStar(require("./find-callers"), exports);
23
+ __exportStar(require("./find-callees"), exports);
24
+ __exportStar(require("./get-graph-stats"), exports);
25
+ __exportStar(require("./find-implementations"), exports);
26
+ __exportStar(require("./analyze-impact"), exports);
27
+ __exportStar(require("./find-dependency-path"), exports);
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,oDAAkC;AAClC,mDAAiC;AACjC,uDAAqC;AACrC,gDAA8B;AAC9B,iDAA+B;AAC/B,iDAA+B;AAC/B,oDAAkC;AAClC,yDAAuC;AACvC,mDAAiC;AACjC,yDAAuC"}
@@ -0,0 +1,6 @@
1
+ import type Database from "better-sqlite3";
2
+ import { type SearchSymbolResult } from "./types";
3
+ export declare function searchSymbols(db: Database.Database, query: string, options?: {
4
+ type?: string;
5
+ maxResults?: number;
6
+ }): SearchSymbolResult[];
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.searchSymbols = searchSymbols;
4
+ const types_1 = require("./types");
5
+ function searchSymbols(db, query, options) {
6
+ const normalizedType = (0, types_1.normalizeNodeTypeFilter)(options?.type);
7
+ const maxResults = Math.max(1, Math.min(options?.maxResults ?? 20, 100));
8
+ // Sanitize FTS5 special characters and restrict search to the name column.
9
+ // FTS5 syntax chars (AND, OR, NOT, ", (, ), ^, *) in user input would cause
10
+ // incorrect results or SQLite errors if left unescaped.
11
+ const sanitized = query.replace(/["""()^]/g, "").trim();
12
+ if (!sanitized) {
13
+ return [];
14
+ }
15
+ const ftsQuery = sanitized.includes("*")
16
+ ? `name:${sanitized}`
17
+ : `name:${sanitized}*`;
18
+ const statement = normalizedType
19
+ ? db.prepare(`
20
+ SELECT
21
+ nodes.id,
22
+ nodes.name,
23
+ nodes.type,
24
+ nodes.file_path,
25
+ nodes.start_line,
26
+ nodes.end_line,
27
+ nodes.start_col,
28
+ nodes.end_col,
29
+ nodes.properties,
30
+ bm25(nodes_fts) AS rank
31
+ FROM nodes_fts
32
+ JOIN nodes ON nodes.id = nodes_fts.node_id
33
+ WHERE nodes_fts MATCH ? AND nodes.type = ?
34
+ ORDER BY rank ASC, nodes.file_path ASC, nodes.start_line ASC
35
+ LIMIT ?
36
+ `)
37
+ : db.prepare(`
38
+ SELECT
39
+ nodes.id,
40
+ nodes.name,
41
+ nodes.type,
42
+ nodes.file_path,
43
+ nodes.start_line,
44
+ nodes.end_line,
45
+ nodes.start_col,
46
+ nodes.end_col,
47
+ nodes.properties,
48
+ bm25(nodes_fts) AS rank
49
+ FROM nodes_fts
50
+ JOIN nodes ON nodes.id = nodes_fts.node_id
51
+ WHERE nodes_fts MATCH ?
52
+ ORDER BY rank ASC, nodes.file_path ASC, nodes.start_line ASC
53
+ LIMIT ?
54
+ `);
55
+ const rows = (normalizedType
56
+ ? statement.all(ftsQuery, normalizedType, maxResults)
57
+ : statement.all(ftsQuery, maxResults));
58
+ return rows.map((row) => {
59
+ const properties = (0, types_1.safeParseProperties)(row.properties);
60
+ return {
61
+ id: row.id,
62
+ name: row.name,
63
+ type: row.type,
64
+ filePath: row.file_path,
65
+ startLine: row.start_line,
66
+ endLine: row.end_line,
67
+ startCol: row.start_col,
68
+ endCol: row.end_col,
69
+ exported: Boolean(properties.isExported),
70
+ signature: typeof properties.signature === "string" ? properties.signature : null,
71
+ rank: row.rank
72
+ };
73
+ });
74
+ }
75
+ //# sourceMappingURL=search-symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-symbols.js","sourceRoot":"","sources":["../../src/query/search-symbols.ts"],"names":[],"mappings":";;AAoBA,sCA6EC;AAhGD,mCAIiB;AAejB,SAAgB,aAAa,CAC3B,EAAqB,EACrB,KAAa,EACb,OAAgD;IAEhD,MAAM,cAAc,GAAG,IAAA,+BAAuB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtC,CAAC,CAAC,QAAQ,SAAS,EAAE;QACrB,CAAC,CAAC,QAAQ,SAAS,GAAG,CAAC;IAEzB,MAAM,SAAS,GAAG,cAAc;QAC9B,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;KAiBZ,CAAC;QACF,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;KAiBZ,CAAC,CAAC;IAEL,MAAM,IAAI,GAAG,CAAC,cAAc;QAC1B,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC;QACrD,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAU,CAAC;IAElD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEvD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;YACxC,SAAS,EAAE,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACjF,IAAI,EAAE,GAAG,CAAC,IAAI;SACc,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}