kirograph 0.12.2 → 0.13.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 (92) hide show
  1. package/README.md +197 -87
  2. package/dist/architecture/layers/index.js +9 -1
  3. package/dist/architecture/layers/index.js.map +2 -2
  4. package/dist/architecture/layers/ocaml.js +105 -0
  5. package/dist/architecture/layers/ocaml.js.map +7 -0
  6. package/dist/architecture/layers/scala.js +120 -0
  7. package/dist/architecture/layers/scala.js.map +7 -0
  8. package/dist/architecture/layers/solidity.js +105 -0
  9. package/dist/architecture/layers/solidity.js.map +7 -0
  10. package/dist/architecture/layers/vue.js +111 -0
  11. package/dist/architecture/layers/vue.js.map +7 -0
  12. package/dist/architecture/manifest/elm.js +91 -0
  13. package/dist/architecture/manifest/elm.js.map +7 -0
  14. package/dist/architecture/manifest/index.js +13 -2
  15. package/dist/architecture/manifest/index.js.map +2 -2
  16. package/dist/architecture/manifest/ocaml.js +166 -0
  17. package/dist/architecture/manifest/ocaml.js.map +7 -0
  18. package/dist/architecture/manifest/scala.js +117 -0
  19. package/dist/architecture/manifest/scala.js.map +7 -0
  20. package/dist/bin/commands/caveman.js +12 -0
  21. package/dist/bin/commands/caveman.js.map +2 -2
  22. package/dist/bin/commands/help.js +6 -4
  23. package/dist/bin/commands/help.js.map +2 -2
  24. package/dist/bin/commands/install.js +8 -2
  25. package/dist/bin/commands/install.js.map +2 -2
  26. package/dist/bin/commands/serve.js +2 -2
  27. package/dist/bin/commands/serve.js.map +2 -2
  28. package/dist/bin/commands/uninit.js +65 -41
  29. package/dist/bin/commands/uninit.js.map +2 -2
  30. package/dist/bin/installer/cli-agent.js +5 -25
  31. package/dist/bin/installer/cli-agent.js.map +2 -2
  32. package/dist/bin/installer/common.js +154 -0
  33. package/dist/bin/installer/common.js.map +7 -0
  34. package/dist/bin/installer/hooks.js +21 -1
  35. package/dist/bin/installer/hooks.js.map +2 -2
  36. package/dist/bin/installer/index.js +99 -86
  37. package/dist/bin/installer/index.js.map +2 -2
  38. package/dist/bin/installer/instructions.js +60 -0
  39. package/dist/bin/installer/instructions.js.map +7 -0
  40. package/dist/bin/installer/mcp.js +6 -36
  41. package/dist/bin/installer/mcp.js.map +2 -2
  42. package/dist/bin/installer/targets/claude.js +79 -0
  43. package/dist/bin/installer/targets/claude.js.map +7 -0
  44. package/dist/bin/installer/targets/codex.js +77 -0
  45. package/dist/bin/installer/targets/codex.js.map +7 -0
  46. package/dist/bin/installer/targets/index.js +57 -0
  47. package/dist/bin/installer/targets/index.js.map +7 -0
  48. package/dist/bin/installer/targets/kiro.js +61 -0
  49. package/dist/bin/installer/targets/kiro.js.map +7 -0
  50. package/dist/bin/kirograph.js +1 -1
  51. package/dist/extraction/extractor.js +65 -2
  52. package/dist/extraction/extractor.js.map +2 -2
  53. package/dist/extraction/grammars.js +22 -0
  54. package/dist/extraction/grammars.js.map +2 -2
  55. package/dist/extraction/languages.js +39 -1
  56. package/dist/extraction/languages.js.map +2 -2
  57. package/dist/extraction/wasm/tree-sitter-hcl.wasm +0 -0
  58. package/dist/extraction/wasm/tree-sitter-scss.wasm +0 -0
  59. package/dist/frameworks/amplify.js +175 -0
  60. package/dist/frameworks/amplify.js.map +7 -0
  61. package/dist/frameworks/angular.js +132 -0
  62. package/dist/frameworks/angular.js.map +7 -0
  63. package/dist/frameworks/ansible.js +151 -0
  64. package/dist/frameworks/ansible.js.map +7 -0
  65. package/dist/frameworks/cloudformation.js +148 -0
  66. package/dist/frameworks/cloudformation.js.map +7 -0
  67. package/dist/frameworks/docker.js +149 -0
  68. package/dist/frameworks/docker.js.map +7 -0
  69. package/dist/frameworks/iac.js +401 -0
  70. package/dist/frameworks/iac.js.map +7 -0
  71. package/dist/frameworks/index.js +81 -3
  72. package/dist/frameworks/index.js.map +3 -3
  73. package/dist/frameworks/kubernetes.js +176 -0
  74. package/dist/frameworks/kubernetes.js.map +7 -0
  75. package/dist/frameworks/pulumi.js +93 -0
  76. package/dist/frameworks/pulumi.js.map +7 -0
  77. package/dist/frameworks/scala.js +124 -0
  78. package/dist/frameworks/scala.js.map +7 -0
  79. package/dist/frameworks/solidity.js +93 -0
  80. package/dist/frameworks/solidity.js.map +7 -0
  81. package/dist/frameworks/terraform.js +278 -0
  82. package/dist/frameworks/terraform.js.map +7 -0
  83. package/dist/frameworks/vue.js +163 -0
  84. package/dist/frameworks/vue.js.map +7 -0
  85. package/dist/graph/queries.js +1 -1
  86. package/dist/graph/queries.js.map +1 -1
  87. package/dist/mcp/tool-names.js +48 -0
  88. package/dist/mcp/tool-names.js.map +7 -0
  89. package/dist/mcp/tools.js +3 -0
  90. package/dist/mcp/tools.js.map +2 -2
  91. package/dist/types.js.map +2 -2
  92. package/package.json +2 -2
@@ -0,0 +1,401 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var iac_exports = {};
20
+ __export(iac_exports, {
21
+ cdkResolver: () => cdkResolver,
22
+ samResolver: () => samResolver,
23
+ serverlessResolver: () => serverlessResolver,
24
+ sstResolver: () => sstResolver
25
+ });
26
+ module.exports = __toCommonJS(iac_exports);
27
+ const sstResolver = {
28
+ name: "sst",
29
+ detect(context) {
30
+ if (context.fileExists("sst.config.ts") || context.fileExists("sst.config.js")) return true;
31
+ const pkg = context.readFile("package.json");
32
+ if (pkg) {
33
+ try {
34
+ const parsed = JSON.parse(pkg);
35
+ const deps = { ...parsed.dependencies, ...parsed.devDependencies };
36
+ if ("sst" in deps) return true;
37
+ } catch {
38
+ }
39
+ }
40
+ return false;
41
+ },
42
+ resolve(ref, context) {
43
+ if (ref.referenceName.includes(".") && !ref.referenceName.startsWith(".")) {
44
+ const id = resolveHandlerString(ref.referenceName, context);
45
+ if (id) return { original: ref, targetNodeId: id, confidence: 0.9, resolvedBy: "framework" };
46
+ }
47
+ if (/^[A-Z][a-zA-Z]+$/.test(ref.referenceName)) {
48
+ const id = resolveConstruct(ref.referenceName, ["stacks", "infra", "src", "lib"], context);
49
+ if (id) return { original: ref, targetNodeId: id, confidence: 0.75, resolvedBy: "framework" };
50
+ }
51
+ return null;
52
+ },
53
+ extractNodes(filePath, content) {
54
+ const nodes = [];
55
+ const now = Date.now();
56
+ const routePattern = /\.route\s*\(\s*["'](\w+)\s+([^"']+)["']/g;
57
+ let match;
58
+ while ((match = routePattern.exec(content)) !== null) {
59
+ const line = content.slice(0, match.index).split("\n").length;
60
+ const method = match[1].toUpperCase();
61
+ const routePath = match[2];
62
+ const name = `${method} ${routePath}`;
63
+ nodes.push({
64
+ id: `route:${filePath}:${method}:${routePath}:${line}`,
65
+ kind: "route",
66
+ name,
67
+ qualifiedName: `${filePath}::${name}`,
68
+ filePath,
69
+ startLine: line,
70
+ endLine: line,
71
+ startColumn: 0,
72
+ endColumn: match[0].length,
73
+ language: "typescript",
74
+ updatedAt: now
75
+ });
76
+ }
77
+ const routeObjPattern = /["'](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|ANY)\s+([^"']+)["']\s*:/g;
78
+ while ((match = routeObjPattern.exec(content)) !== null) {
79
+ if (!content.includes("sst") && !content.includes("Api") && !content.includes("Function")) continue;
80
+ const line = content.slice(0, match.index).split("\n").length;
81
+ const method = match[1];
82
+ const routePath = match[2];
83
+ const name = `${method} ${routePath}`;
84
+ const id = `route:${filePath}:${method}:${routePath}:${line}`;
85
+ if (!nodes.some((n) => n.id === id)) {
86
+ nodes.push({
87
+ id,
88
+ kind: "route",
89
+ name,
90
+ qualifiedName: `${filePath}::${name}`,
91
+ filePath,
92
+ startLine: line,
93
+ endLine: line,
94
+ startColumn: 0,
95
+ endColumn: match[0].length,
96
+ language: "typescript",
97
+ updatedAt: now
98
+ });
99
+ }
100
+ }
101
+ return nodes;
102
+ }
103
+ };
104
+ const cdkResolver = {
105
+ name: "cdk",
106
+ detect(context) {
107
+ if (context.fileExists("cdk.json")) return true;
108
+ const pkg = context.readFile("package.json");
109
+ if (pkg) {
110
+ try {
111
+ const parsed = JSON.parse(pkg);
112
+ const deps = { ...parsed.dependencies, ...parsed.devDependencies };
113
+ if ("aws-cdk-lib" in deps || "aws-cdk" in deps || "@aws-cdk/core" in deps) return true;
114
+ } catch {
115
+ }
116
+ }
117
+ const requirements = context.readFile("requirements.txt");
118
+ if (requirements && requirements.includes("aws-cdk")) return true;
119
+ return false;
120
+ },
121
+ resolve(ref, context) {
122
+ if (ref.referenceName.includes(".") && !ref.referenceName.startsWith(".")) {
123
+ const id = resolveHandlerString(ref.referenceName, context);
124
+ if (id) return { original: ref, targetNodeId: id, confidence: 0.9, resolvedBy: "framework" };
125
+ }
126
+ if (/^[A-Z][a-zA-Z]+Stack$/.test(ref.referenceName)) {
127
+ const id = resolveConstruct(ref.referenceName, ["lib", "stacks", "infra", "src"], context);
128
+ if (id) return { original: ref, targetNodeId: id, confidence: 0.85, resolvedBy: "framework" };
129
+ }
130
+ if (/^[A-Z][a-zA-Z]+Construct$/.test(ref.referenceName) || /^[A-Z][a-zA-Z]+$/.test(ref.referenceName)) {
131
+ const id = resolveConstruct(ref.referenceName, ["lib", "constructs", "src", "infra"], context);
132
+ if (id) return { original: ref, targetNodeId: id, confidence: 0.7, resolvedBy: "framework" };
133
+ }
134
+ return null;
135
+ },
136
+ extractNodes(filePath, content) {
137
+ const nodes = [];
138
+ const now = Date.now();
139
+ const addMethodPattern = /\.addMethod\s*\(\s*['"](\w+)['"]/g;
140
+ const addResourcePattern = /\.addResource\s*\(\s*['"]([^'"]+)['"]/g;
141
+ let match;
142
+ const resources = [];
143
+ while ((match = addResourcePattern.exec(content)) !== null) {
144
+ const line = content.slice(0, match.index).split("\n").length;
145
+ resources.push({ path: match[1], line });
146
+ }
147
+ while ((match = addMethodPattern.exec(content)) !== null) {
148
+ const line = content.slice(0, match.index).split("\n").length;
149
+ const method = match[1].toUpperCase();
150
+ const nearestResource = resources.filter((r) => r.line <= line).pop();
151
+ const routePath = nearestResource ? `/${nearestResource.path}` : "/";
152
+ const name = `${method} ${routePath}`;
153
+ nodes.push({
154
+ id: `route:${filePath}:${method}:${routePath}:${line}`,
155
+ kind: "route",
156
+ name,
157
+ qualifiedName: `${filePath}::${name}`,
158
+ filePath,
159
+ startLine: line,
160
+ endLine: line,
161
+ startColumn: 0,
162
+ endColumn: match[0].length,
163
+ language: filePath.endsWith(".py") ? "python" : "typescript",
164
+ updatedAt: now
165
+ });
166
+ }
167
+ const httpApiPattern = /addRoutes\s*\(\s*\{[^}]*path\s*:\s*['"]([^'"]+)['"][^}]*methods\s*:\s*\[([^\]]+)\]/gs;
168
+ while ((match = httpApiPattern.exec(content)) !== null) {
169
+ const line = content.slice(0, match.index).split("\n").length;
170
+ const routePath = match[1];
171
+ const methods = match[2].match(/HttpMethod\.(\w+)/g) ?? [];
172
+ for (const m of methods) {
173
+ const method = m.replace("HttpMethod.", "");
174
+ const name = `${method} ${routePath}`;
175
+ nodes.push({
176
+ id: `route:${filePath}:${method}:${routePath}:${line}`,
177
+ kind: "route",
178
+ name,
179
+ qualifiedName: `${filePath}::${name}`,
180
+ filePath,
181
+ startLine: line,
182
+ endLine: line,
183
+ startColumn: 0,
184
+ endColumn: match[0].length,
185
+ language: filePath.endsWith(".py") ? "python" : "typescript",
186
+ updatedAt: now
187
+ });
188
+ }
189
+ }
190
+ return nodes;
191
+ }
192
+ };
193
+ const serverlessResolver = {
194
+ name: "serverless",
195
+ detect(context) {
196
+ return context.fileExists("serverless.yml") || context.fileExists("serverless.yaml") || context.fileExists("serverless.ts") || context.fileExists("serverless.js");
197
+ },
198
+ resolve(ref, context) {
199
+ if (ref.referenceName.includes(".") && !ref.referenceName.startsWith(".")) {
200
+ const id = resolveHandlerString(ref.referenceName, context);
201
+ if (id) return { original: ref, targetNodeId: id, confidence: 0.9, resolvedBy: "framework" };
202
+ }
203
+ return null;
204
+ },
205
+ extractNodes(filePath, content) {
206
+ const nodes = [];
207
+ const now = Date.now();
208
+ const basename = filePath.split("/").pop() ?? "";
209
+ if (!basename.startsWith("serverless.")) return nodes;
210
+ if (filePath.endsWith(".yml") || filePath.endsWith(".yaml")) {
211
+ const functionBlocks = content.split(/^\s{2}\w+:/gm);
212
+ const httpPattern = /- http(?:Api)?:\s*\n\s+(?:method:\s*(\w+)\s*\n\s+path:\s*(\S+)|path:\s*(\S+)\s*\n\s+method:\s*(\w+))/g;
213
+ const simpleHttpPattern = /- http(?:Api)?:\s*(\w+)\s+(\S+)/g;
214
+ let match;
215
+ while ((match = httpPattern.exec(content)) !== null) {
216
+ const line = content.slice(0, match.index).split("\n").length;
217
+ const method = (match[1] || match[4]).toUpperCase();
218
+ const routePath = match[2] || match[3];
219
+ const name = `${method} ${routePath}`;
220
+ nodes.push({
221
+ id: `route:${filePath}:${method}:${routePath}:${line}`,
222
+ kind: "route",
223
+ name,
224
+ qualifiedName: `${filePath}::${name}`,
225
+ filePath,
226
+ startLine: line,
227
+ endLine: line,
228
+ startColumn: 0,
229
+ endColumn: match[0].length,
230
+ language: "yaml",
231
+ updatedAt: now
232
+ });
233
+ }
234
+ while ((match = simpleHttpPattern.exec(content)) !== null) {
235
+ const line = content.slice(0, match.index).split("\n").length;
236
+ const method = match[1].toUpperCase();
237
+ const routePath = match[2];
238
+ const name = `${method} ${routePath}`;
239
+ const id = `route:${filePath}:${method}:${routePath}:${line}`;
240
+ if (!nodes.some((n) => n.id === id)) {
241
+ nodes.push({
242
+ id,
243
+ kind: "route",
244
+ name,
245
+ qualifiedName: `${filePath}::${name}`,
246
+ filePath,
247
+ startLine: line,
248
+ endLine: line,
249
+ startColumn: 0,
250
+ endColumn: match[0].length,
251
+ language: "yaml",
252
+ updatedAt: now
253
+ });
254
+ }
255
+ }
256
+ } else {
257
+ const routePattern = /["'](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|ANY)\s+([^"']+)["']/g;
258
+ let match;
259
+ while ((match = routePattern.exec(content)) !== null) {
260
+ const line = content.slice(0, match.index).split("\n").length;
261
+ const method = match[1];
262
+ const routePath = match[2];
263
+ const name = `${method} ${routePath}`;
264
+ nodes.push({
265
+ id: `route:${filePath}:${method}:${routePath}:${line}`,
266
+ kind: "route",
267
+ name,
268
+ qualifiedName: `${filePath}::${name}`,
269
+ filePath,
270
+ startLine: line,
271
+ endLine: line,
272
+ startColumn: 0,
273
+ endColumn: match[0].length,
274
+ language: "typescript",
275
+ updatedAt: now
276
+ });
277
+ }
278
+ }
279
+ return nodes;
280
+ }
281
+ };
282
+ const samResolver = {
283
+ name: "sam",
284
+ detect(context) {
285
+ for (const name of ["template.yaml", "template.yml", "sam.yaml", "sam.yml"]) {
286
+ const content = context.readFile(name);
287
+ if (content && content.includes("AWS::Serverless")) return true;
288
+ }
289
+ if (context.fileExists("samconfig.toml") || context.fileExists("samconfig.yaml")) return true;
290
+ return false;
291
+ },
292
+ resolve(ref, context) {
293
+ if (ref.referenceName.includes(".") && !ref.referenceName.startsWith(".")) {
294
+ const id = resolveHandlerString(ref.referenceName, context);
295
+ if (id) return { original: ref, targetNodeId: id, confidence: 0.9, resolvedBy: "framework" };
296
+ }
297
+ return null;
298
+ },
299
+ extractNodes(filePath, content) {
300
+ const nodes = [];
301
+ const now = Date.now();
302
+ const basename = filePath.split("/").pop() ?? "";
303
+ if (!basename.match(/^(template|sam)\.(ya?ml)$/)) return nodes;
304
+ if (!content.includes("AWS::Serverless")) return nodes;
305
+ const apiEventPattern = /Type:\s*(?:Api|HttpApi)\s*\n\s+Properties:\s*\n(?:\s+.*\n)*?\s+Path:\s*(\S+)\s*\n(?:\s+.*\n)*?\s+Method:\s*(\w+)/g;
306
+ let match;
307
+ while ((match = apiEventPattern.exec(content)) !== null) {
308
+ const line = content.slice(0, match.index).split("\n").length;
309
+ const routePath = match[1];
310
+ const method = match[2].toUpperCase();
311
+ const name = `${method} ${routePath}`;
312
+ nodes.push({
313
+ id: `route:${filePath}:${method}:${routePath}:${line}`,
314
+ kind: "route",
315
+ name,
316
+ qualifiedName: `${filePath}::${name}`,
317
+ filePath,
318
+ startLine: line,
319
+ endLine: line,
320
+ startColumn: 0,
321
+ endColumn: match[0].length,
322
+ language: "yaml",
323
+ updatedAt: now
324
+ });
325
+ }
326
+ const simplePattern = /Method:\s*(\w+)\s*\n\s+Path:\s*(\S+)|Path:\s*(\S+)\s*\n\s+Method:\s*(\w+)/g;
327
+ while ((match = simplePattern.exec(content)) !== null) {
328
+ const line = content.slice(0, match.index).split("\n").length;
329
+ const method = (match[1] || match[4]).toUpperCase();
330
+ const routePath = match[2] || match[3];
331
+ const name = `${method} ${routePath}`;
332
+ const id = `route:${filePath}:${method}:${routePath}:${line}`;
333
+ if (!nodes.some((n) => n.id === id)) {
334
+ nodes.push({
335
+ id,
336
+ kind: "route",
337
+ name,
338
+ qualifiedName: `${filePath}::${name}`,
339
+ filePath,
340
+ startLine: line,
341
+ endLine: line,
342
+ startColumn: 0,
343
+ endColumn: match[0].length,
344
+ language: "yaml",
345
+ updatedAt: now
346
+ });
347
+ }
348
+ }
349
+ return nodes;
350
+ }
351
+ };
352
+ function resolveHandlerString(handlerStr, context) {
353
+ const lastDot = handlerStr.lastIndexOf(".");
354
+ if (lastDot <= 0) return null;
355
+ const filePart = handlerStr.slice(0, lastDot);
356
+ const funcName = handlerStr.slice(lastDot + 1);
357
+ const extensions = [".ts", ".js", ".mjs", ".py", ".go"];
358
+ for (const ext of extensions) {
359
+ const candidates = [
360
+ `${filePart}${ext}`,
361
+ `${filePart}/index${ext}`
362
+ ];
363
+ for (const candidate of candidates) {
364
+ if (context.fileExists(candidate)) {
365
+ const node = context.getNodesInFile(candidate).find(
366
+ (n) => n.name === funcName && (n.kind === "function" || n.kind === "method" || n.kind === "variable")
367
+ );
368
+ if (node) return node.id;
369
+ }
370
+ }
371
+ }
372
+ const dirs = ["src", "lib", "handlers", "functions", "lambdas", "api"];
373
+ for (const file of context.getAllFiles()) {
374
+ if (!dirs.some((d) => file.includes(`/${d}/`) || file.startsWith(`${d}/`))) continue;
375
+ if (!file.includes(filePart.split("/").pop())) continue;
376
+ const node = context.getNodesInFile(file).find(
377
+ (n) => n.name === funcName && (n.kind === "function" || n.kind === "method" || n.kind === "variable")
378
+ );
379
+ if (node) return node.id;
380
+ }
381
+ return null;
382
+ }
383
+ function resolveConstruct(name, dirs, context) {
384
+ for (const file of context.getAllFiles()) {
385
+ if (!(file.endsWith(".ts") || file.endsWith(".js") || file.endsWith(".py"))) continue;
386
+ if (!dirs.some((d) => file.includes(`/${d}/`) || file.startsWith(`${d}/`))) continue;
387
+ const node = context.getNodesInFile(file).find(
388
+ (n) => n.name === name && (n.kind === "class" || n.kind === "function" || n.kind === "variable")
389
+ );
390
+ if (node) return node.id;
391
+ }
392
+ return null;
393
+ }
394
+ // Annotate the CommonJS export names for ESM import in node:
395
+ 0 && (module.exports = {
396
+ cdkResolver,
397
+ samResolver,
398
+ serverlessResolver,
399
+ sstResolver
400
+ });
401
+ //# sourceMappingURL=iac.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/frameworks/iac.ts"],
4
+ "sourcesContent": ["/**\n * Infrastructure-as-Code Framework Resolvers\n * Supports: AWS CDK, SST, Serverless Framework, AWS SAM\n */\n\nimport type { Node } from '../types';\nimport type { FrameworkResolver, UnresolvedRef, ResolvedRef, ResolutionContext } from './types';\n\n// \u2500\u2500 SST \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const sstResolver: FrameworkResolver = {\n name: 'sst',\n detect(context: ResolutionContext): boolean {\n if (context.fileExists('sst.config.ts') || context.fileExists('sst.config.js')) return true;\n const pkg = context.readFile('package.json');\n if (pkg) {\n try {\n const parsed = JSON.parse(pkg);\n const deps = { ...parsed.dependencies, ...parsed.devDependencies };\n if ('sst' in deps) return true;\n } catch { /* ignore */ }\n }\n return false;\n },\n resolve(ref: UnresolvedRef, context: ResolutionContext): ResolvedRef | null {\n // Resolve handler string references (e.g., \"src/auth.handler\" \u2192 handler function in src/auth.ts)\n if (ref.referenceName.includes('.') && !ref.referenceName.startsWith('.')) {\n const id = resolveHandlerString(ref.referenceName, context);\n if (id) return { original: ref, targetNodeId: id, confidence: 0.9, resolvedBy: 'framework' };\n }\n // Resolve construct references\n if (/^[A-Z][a-zA-Z]+$/.test(ref.referenceName)) {\n const id = resolveConstruct(ref.referenceName, ['stacks', 'infra', 'src', 'lib'], context);\n if (id) return { original: ref, targetNodeId: id, confidence: 0.75, resolvedBy: 'framework' };\n }\n return null;\n },\n extractNodes(filePath: string, content: string): Node[] {\n const nodes: Node[] = [];\n const now = Date.now();\n\n // SST v3 Api routes: api.route(\"GET /users\", \"src/users.list\")\n const routePattern = /\\.route\\s*\\(\\s*[\"'](\\w+)\\s+([^\"']+)[\"']/g;\n let match: RegExpExecArray | null;\n while ((match = routePattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n const method = match[1]!.toUpperCase();\n const routePath = match[2]!;\n const name = `${method} ${routePath}`;\n nodes.push({\n id: `route:${filePath}:${method}:${routePath}:${line}`,\n kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: 'typescript', updatedAt: now,\n });\n }\n\n // SST v2 Api routes: routes: { \"GET /users\": \"src/users.list\" }\n const routeObjPattern = /[\"'](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|ANY)\\s+([^\"']+)[\"']\\s*:/g;\n while ((match = routeObjPattern.exec(content)) !== null) {\n // Only match if this looks like an SST/CDK file\n if (!content.includes('sst') && !content.includes('Api') && !content.includes('Function')) continue;\n const line = content.slice(0, match.index).split('\\n').length;\n const method = match[1]!;\n const routePath = match[2]!;\n const name = `${method} ${routePath}`;\n const id = `route:${filePath}:${method}:${routePath}:${line}`;\n if (!nodes.some(n => n.id === id)) {\n nodes.push({\n id, kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: 'typescript', updatedAt: now,\n });\n }\n }\n\n return nodes;\n },\n};\n\n// \u2500\u2500 AWS CDK \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const cdkResolver: FrameworkResolver = {\n name: 'cdk',\n detect(context: ResolutionContext): boolean {\n if (context.fileExists('cdk.json')) return true;\n const pkg = context.readFile('package.json');\n if (pkg) {\n try {\n const parsed = JSON.parse(pkg);\n const deps = { ...parsed.dependencies, ...parsed.devDependencies };\n if ('aws-cdk-lib' in deps || 'aws-cdk' in deps || '@aws-cdk/core' in deps) return true;\n } catch { /* ignore */ }\n }\n // Python CDK\n const requirements = context.readFile('requirements.txt');\n if (requirements && requirements.includes('aws-cdk')) return true;\n return false;\n },\n resolve(ref: UnresolvedRef, context: ResolutionContext): ResolvedRef | null {\n // Resolve Lambda handler strings\n if (ref.referenceName.includes('.') && !ref.referenceName.startsWith('.')) {\n const id = resolveHandlerString(ref.referenceName, context);\n if (id) return { original: ref, targetNodeId: id, confidence: 0.9, resolvedBy: 'framework' };\n }\n // Resolve Stack/Construct references\n if (/^[A-Z][a-zA-Z]+Stack$/.test(ref.referenceName)) {\n const id = resolveConstruct(ref.referenceName, ['lib', 'stacks', 'infra', 'src'], context);\n if (id) return { original: ref, targetNodeId: id, confidence: 0.85, resolvedBy: 'framework' };\n }\n if (/^[A-Z][a-zA-Z]+Construct$/.test(ref.referenceName) || /^[A-Z][a-zA-Z]+$/.test(ref.referenceName)) {\n const id = resolveConstruct(ref.referenceName, ['lib', 'constructs', 'src', 'infra'], context);\n if (id) return { original: ref, targetNodeId: id, confidence: 0.7, resolvedBy: 'framework' };\n }\n return null;\n },\n extractNodes(filePath: string, content: string): Node[] {\n const nodes: Node[] = [];\n const now = Date.now();\n\n // CDK API Gateway: addMethod('GET', ...) or addResource('/users')\n const addMethodPattern = /\\.addMethod\\s*\\(\\s*['\"](\\w+)['\"]/g;\n const addResourcePattern = /\\.addResource\\s*\\(\\s*['\"]([^'\"]+)['\"]/g;\n let match: RegExpExecArray | null;\n\n // Track resources for building full paths\n const resources: Array<{ path: string; line: number }> = [];\n while ((match = addResourcePattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n resources.push({ path: match[1]!, line });\n }\n\n while ((match = addMethodPattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n const method = match[1]!.toUpperCase();\n // Try to find the nearest resource path above this line\n const nearestResource = resources.filter(r => r.line <= line).pop();\n const routePath = nearestResource ? `/${nearestResource.path}` : '/';\n const name = `${method} ${routePath}`;\n nodes.push({\n id: `route:${filePath}:${method}:${routePath}:${line}`,\n kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: filePath.endsWith('.py') ? 'python' : 'typescript', updatedAt: now,\n });\n }\n\n // CDK HttpApi / RestApi route patterns\n const httpApiPattern = /addRoutes\\s*\\(\\s*\\{[^}]*path\\s*:\\s*['\"]([^'\"]+)['\"][^}]*methods\\s*:\\s*\\[([^\\]]+)\\]/gs;\n while ((match = httpApiPattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n const routePath = match[1]!;\n const methods = match[2]!.match(/HttpMethod\\.(\\w+)/g) ?? [];\n for (const m of methods) {\n const method = m.replace('HttpMethod.', '');\n const name = `${method} ${routePath}`;\n nodes.push({\n id: `route:${filePath}:${method}:${routePath}:${line}`,\n kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: filePath.endsWith('.py') ? 'python' : 'typescript', updatedAt: now,\n });\n }\n }\n\n return nodes;\n },\n};\n\n// \u2500\u2500 Serverless Framework \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const serverlessResolver: FrameworkResolver = {\n name: 'serverless',\n detect(context: ResolutionContext): boolean {\n return (\n context.fileExists('serverless.yml') ||\n context.fileExists('serverless.yaml') ||\n context.fileExists('serverless.ts') ||\n context.fileExists('serverless.js')\n );\n },\n resolve(ref: UnresolvedRef, context: ResolutionContext): ResolvedRef | null {\n // Resolve handler references (e.g., \"src/handlers/auth.login\")\n if (ref.referenceName.includes('.') && !ref.referenceName.startsWith('.')) {\n const id = resolveHandlerString(ref.referenceName, context);\n if (id) return { original: ref, targetNodeId: id, confidence: 0.9, resolvedBy: 'framework' };\n }\n return null;\n },\n extractNodes(filePath: string, content: string): Node[] {\n const nodes: Node[] = [];\n const now = Date.now();\n\n // Only process serverless config files\n const basename = filePath.split('/').pop() ?? '';\n if (!basename.startsWith('serverless.')) return nodes;\n\n if (filePath.endsWith('.yml') || filePath.endsWith('.yaml')) {\n // YAML: extract HTTP events\n // Pattern: path: /users\\n ... method: get\n const functionBlocks = content.split(/^\\s{2}\\w+:/gm);\n const httpPattern = /- http(?:Api)?:\\s*\\n\\s+(?:method:\\s*(\\w+)\\s*\\n\\s+path:\\s*(\\S+)|path:\\s*(\\S+)\\s*\\n\\s+method:\\s*(\\w+))/g;\n const simpleHttpPattern = /- http(?:Api)?:\\s*(\\w+)\\s+(\\S+)/g;\n\n let match: RegExpExecArray | null;\n while ((match = httpPattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n const method = (match[1] || match[4])!.toUpperCase();\n const routePath = (match[2] || match[3])!;\n const name = `${method} ${routePath}`;\n nodes.push({\n id: `route:${filePath}:${method}:${routePath}:${line}`,\n kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: 'yaml', updatedAt: now,\n });\n }\n\n while ((match = simpleHttpPattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n const method = match[1]!.toUpperCase();\n const routePath = match[2]!;\n const name = `${method} ${routePath}`;\n const id = `route:${filePath}:${method}:${routePath}:${line}`;\n if (!nodes.some(n => n.id === id)) {\n nodes.push({\n id, kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: 'yaml', updatedAt: now,\n });\n }\n }\n } else {\n // TypeScript/JavaScript serverless config: extract from object literals\n const routePattern = /[\"'](GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|ANY)\\s+([^\"']+)[\"']/g;\n let match: RegExpExecArray | null;\n while ((match = routePattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n const method = match[1]!;\n const routePath = match[2]!;\n const name = `${method} ${routePath}`;\n nodes.push({\n id: `route:${filePath}:${method}:${routePath}:${line}`,\n kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: 'typescript', updatedAt: now,\n });\n }\n }\n\n return nodes;\n },\n};\n\n// \u2500\u2500 AWS SAM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const samResolver: FrameworkResolver = {\n name: 'sam',\n detect(context: ResolutionContext): boolean {\n for (const name of ['template.yaml', 'template.yml', 'sam.yaml', 'sam.yml']) {\n const content = context.readFile(name);\n if (content && content.includes('AWS::Serverless')) return true;\n }\n if (context.fileExists('samconfig.toml') || context.fileExists('samconfig.yaml')) return true;\n return false;\n },\n resolve(ref: UnresolvedRef, context: ResolutionContext): ResolvedRef | null {\n // Resolve handler references\n if (ref.referenceName.includes('.') && !ref.referenceName.startsWith('.')) {\n const id = resolveHandlerString(ref.referenceName, context);\n if (id) return { original: ref, targetNodeId: id, confidence: 0.9, resolvedBy: 'framework' };\n }\n return null;\n },\n extractNodes(filePath: string, content: string): Node[] {\n const nodes: Node[] = [];\n const now = Date.now();\n\n // Only process SAM template files\n const basename = filePath.split('/').pop() ?? '';\n if (!basename.match(/^(template|sam)\\.(ya?ml)$/)) return nodes;\n if (!content.includes('AWS::Serverless')) return nodes;\n\n // Extract API events from SAM template\n // Pattern: Type: Api\\n Properties:\\n Path: /users\\n Method: get\n const apiEventPattern = /Type:\\s*(?:Api|HttpApi)\\s*\\n\\s+Properties:\\s*\\n(?:\\s+.*\\n)*?\\s+Path:\\s*(\\S+)\\s*\\n(?:\\s+.*\\n)*?\\s+Method:\\s*(\\w+)/g;\n let match: RegExpExecArray | null;\n while ((match = apiEventPattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n const routePath = match[1]!;\n const method = match[2]!.toUpperCase();\n const name = `${method} ${routePath}`;\n nodes.push({\n id: `route:${filePath}:${method}:${routePath}:${line}`,\n kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: 'yaml', updatedAt: now,\n });\n }\n\n // Simpler pattern: Method + Path on same indentation level (either order)\n const simplePattern = /Method:\\s*(\\w+)\\s*\\n\\s+Path:\\s*(\\S+)|Path:\\s*(\\S+)\\s*\\n\\s+Method:\\s*(\\w+)/g;\n while ((match = simplePattern.exec(content)) !== null) {\n const line = content.slice(0, match.index).split('\\n').length;\n const method = (match[1] || match[4])!.toUpperCase();\n const routePath = (match[2] || match[3])!;\n const name = `${method} ${routePath}`;\n const id = `route:${filePath}:${method}:${routePath}:${line}`;\n if (!nodes.some(n => n.id === id)) {\n nodes.push({\n id, kind: 'route', name,\n qualifiedName: `${filePath}::${name}`,\n filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,\n language: 'yaml', updatedAt: now,\n });\n }\n }\n\n return nodes;\n },\n};\n\n// \u2500\u2500 Shared helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Resolve a handler string like \"src/auth.handler\" or \"handlers/users.list\"\n * to the actual function symbol in the codebase.\n */\nfunction resolveHandlerString(handlerStr: string, context: ResolutionContext): string | null {\n // Split \"path/to/file.functionName\" into file path and function name\n const lastDot = handlerStr.lastIndexOf('.');\n if (lastDot <= 0) return null;\n\n const filePart = handlerStr.slice(0, lastDot);\n const funcName = handlerStr.slice(lastDot + 1);\n\n // Try common extensions\n const extensions = ['.ts', '.js', '.mjs', '.py', '.go'];\n for (const ext of extensions) {\n const candidates = [\n `${filePart}${ext}`,\n `${filePart}/index${ext}`,\n ];\n for (const candidate of candidates) {\n if (context.fileExists(candidate)) {\n const node = context.getNodesInFile(candidate).find(\n n => n.name === funcName && (n.kind === 'function' || n.kind === 'method' || n.kind === 'variable')\n );\n if (node) return node.id;\n }\n }\n }\n\n // Fallback: search all files for the function name in likely directories\n const dirs = ['src', 'lib', 'handlers', 'functions', 'lambdas', 'api'];\n for (const file of context.getAllFiles()) {\n if (!dirs.some(d => file.includes(`/${d}/`) || file.startsWith(`${d}/`))) continue;\n if (!file.includes(filePart.split('/').pop()!)) continue;\n const node = context.getNodesInFile(file).find(\n n => n.name === funcName && (n.kind === 'function' || n.kind === 'method' || n.kind === 'variable')\n );\n if (node) return node.id;\n }\n\n return null;\n}\n\n/**\n * Resolve a construct/stack class reference by searching in typical IaC directories.\n */\nfunction resolveConstruct(name: string, dirs: string[], context: ResolutionContext): string | null {\n for (const file of context.getAllFiles()) {\n if (!(file.endsWith('.ts') || file.endsWith('.js') || file.endsWith('.py'))) continue;\n if (!dirs.some(d => file.includes(`/${d}/`) || file.startsWith(`${d}/`))) continue;\n const node = context.getNodesInFile(file).find(\n n => n.name === name && (n.kind === 'class' || n.kind === 'function' || n.kind === 'variable')\n );\n if (node) return node.id;\n }\n return null;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -29,26 +29,42 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  var frameworks_exports = {};
30
30
  __export(frameworks_exports, {
31
31
  FACADE_MAPPINGS: () => import_laravel.FACADE_MAPPINGS,
32
+ amplifyResolver: () => import_amplify.amplifyResolver,
33
+ angularResolver: () => import_angular.angularResolver,
34
+ ansibleResolver: () => import_ansible.ansibleResolver,
32
35
  aspnetResolver: () => import_csharp.aspnetResolver,
36
+ cdkResolver: () => import_iac.cdkResolver,
37
+ cloudformationResolver: () => import_cloudformation.cloudformationResolver,
33
38
  detectFrameworks: () => detectFrameworks,
34
39
  djangoResolver: () => import_python.djangoResolver,
40
+ dockerComposeResolver: () => import_docker.dockerComposeResolver,
35
41
  expressResolver: () => import_express.expressResolver,
36
42
  fastapiResolver: () => import_python.fastapiResolver,
37
43
  flaskResolver: () => import_python.flaskResolver,
38
44
  getAllFrameworkResolvers: () => getAllFrameworkResolvers,
39
45
  getFrameworkResolver: () => getFrameworkResolver,
40
46
  goResolver: () => import_go.goResolver,
47
+ kubernetesResolver: () => import_kubernetes.kubernetesResolver,
41
48
  laravelResolver: () => import_laravel.laravelResolver,
49
+ nuxtResolver: () => import_vue.nuxtResolver,
42
50
  phoenixResolver: () => import_elixir.phoenixResolver,
51
+ playResolver: () => import_scala.playResolver,
52
+ pulumiResolver: () => import_pulumi.pulumiResolver,
43
53
  railsResolver: () => import_ruby.railsResolver,
44
54
  reactResolver: () => import_react.reactResolver,
45
55
  registerFrameworkResolver: () => registerFrameworkResolver,
46
56
  rustResolver: () => import_rust.rustResolver,
57
+ samResolver: () => import_iac.samResolver,
58
+ serverlessResolver: () => import_iac.serverlessResolver,
59
+ solidityResolver: () => import_solidity.solidityResolver,
47
60
  springResolver: () => import_java.springResolver,
61
+ sstResolver: () => import_iac.sstResolver,
48
62
  svelteResolver: () => import_svelte.svelteResolver,
49
63
  swiftUIResolver: () => import_swift.swiftUIResolver,
64
+ terraformResolver: () => import_terraform.terraformResolver,
50
65
  uikitResolver: () => import_swift.uikitResolver,
51
- vaporResolver: () => import_swift.vaporResolver
66
+ vaporResolver: () => import_swift.vaporResolver,
67
+ vueResolver: () => import_vue.vueResolver
52
68
  });
53
69
  module.exports = __toCommonJS(frameworks_exports);
54
70
  var fs = __toESM(require("fs"));
@@ -67,6 +83,18 @@ var import_csharp = require("./csharp");
67
83
  var import_swift = require("./swift");
68
84
  var import_laravel = require("./laravel");
69
85
  var import_elixir = require("./elixir");
86
+ var import_scala = require("./scala");
87
+ var import_vue = require("./vue");
88
+ var import_solidity = require("./solidity");
89
+ var import_iac = require("./iac");
90
+ var import_terraform = require("./terraform");
91
+ var import_pulumi = require("./pulumi");
92
+ var import_cloudformation = require("./cloudformation");
93
+ var import_kubernetes = require("./kubernetes");
94
+ var import_docker = require("./docker");
95
+ var import_ansible = require("./ansible");
96
+ var import_angular = require("./angular");
97
+ var import_amplify = require("./amplify");
70
98
  var import_react2 = require("./react");
71
99
  var import_svelte2 = require("./svelte");
72
100
  var import_express2 = require("./express");
@@ -79,6 +107,18 @@ var import_csharp2 = require("./csharp");
79
107
  var import_swift2 = require("./swift");
80
108
  var import_laravel2 = require("./laravel");
81
109
  var import_elixir2 = require("./elixir");
110
+ var import_scala2 = require("./scala");
111
+ var import_vue2 = require("./vue");
112
+ var import_solidity2 = require("./solidity");
113
+ var import_iac2 = require("./iac");
114
+ var import_terraform2 = require("./terraform");
115
+ var import_pulumi2 = require("./pulumi");
116
+ var import_cloudformation2 = require("./cloudformation");
117
+ var import_kubernetes2 = require("./kubernetes");
118
+ var import_docker2 = require("./docker");
119
+ var import_ansible2 = require("./ansible");
120
+ var import_angular2 = require("./angular");
121
+ var import_amplify2 = require("./amplify");
82
122
  const FRAMEWORK_RESOLVERS = [
83
123
  // PHP
84
124
  import_laravel2.laravelResolver,
@@ -86,6 +126,10 @@ const FRAMEWORK_RESOLVERS = [
86
126
  import_express2.expressResolver,
87
127
  import_react2.reactResolver,
88
128
  import_svelte2.svelteResolver,
129
+ import_angular2.angularResolver,
130
+ // Vue / Nuxt
131
+ import_vue2.nuxtResolver,
132
+ import_vue2.vueResolver,
89
133
  // Python
90
134
  import_python2.djangoResolver,
91
135
  import_python2.flaskResolver,
@@ -105,7 +149,25 @@ const FRAMEWORK_RESOLVERS = [
105
149
  import_swift2.uikitResolver,
106
150
  import_swift2.vaporResolver,
107
151
  // Elixir
108
- import_elixir2.phoenixResolver
152
+ import_elixir2.phoenixResolver,
153
+ // Scala
154
+ import_scala2.playResolver,
155
+ // Solidity
156
+ import_solidity2.solidityResolver,
157
+ // Infrastructure as Code
158
+ import_iac2.sstResolver,
159
+ import_iac2.cdkResolver,
160
+ import_iac2.serverlessResolver,
161
+ import_iac2.samResolver,
162
+ import_terraform2.terraformResolver,
163
+ import_pulumi2.pulumiResolver,
164
+ import_cloudformation2.cloudformationResolver,
165
+ import_amplify2.amplifyResolver,
166
+ // Containers & Orchestration
167
+ import_kubernetes2.kubernetesResolver,
168
+ import_docker2.dockerComposeResolver,
169
+ // Configuration Management
170
+ import_ansible2.ansibleResolver
109
171
  ];
110
172
  function getAllFrameworkResolvers() {
111
173
  return FRAMEWORK_RESOLVERS;
@@ -219,25 +281,41 @@ async function detectFromPackageJson(projectRoot) {
219
281
  // Annotate the CommonJS export names for ESM import in node:
220
282
  0 && (module.exports = {
221
283
  FACADE_MAPPINGS,
284
+ amplifyResolver,
285
+ angularResolver,
286
+ ansibleResolver,
222
287
  aspnetResolver,
288
+ cdkResolver,
289
+ cloudformationResolver,
223
290
  detectFrameworks,
224
291
  djangoResolver,
292
+ dockerComposeResolver,
225
293
  expressResolver,
226
294
  fastapiResolver,
227
295
  flaskResolver,
228
296
  getAllFrameworkResolvers,
229
297
  getFrameworkResolver,
230
298
  goResolver,
299
+ kubernetesResolver,
231
300
  laravelResolver,
301
+ nuxtResolver,
232
302
  phoenixResolver,
303
+ playResolver,
304
+ pulumiResolver,
233
305
  railsResolver,
234
306
  reactResolver,
235
307
  registerFrameworkResolver,
236
308
  rustResolver,
309
+ samResolver,
310
+ serverlessResolver,
311
+ solidityResolver,
237
312
  springResolver,
313
+ sstResolver,
238
314
  svelteResolver,
239
315
  swiftUIResolver,
316
+ terraformResolver,
240
317
  uikitResolver,
241
- vaporResolver
318
+ vaporResolver,
319
+ vueResolver
242
320
  });
243
321
  //# sourceMappingURL=index.js.map