@sdd-method/sdd-cli 0.59.0 → 0.61.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 (79) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/api-surface/__fixtures__/serverless-repo/serverless/serverless.yml +18 -0
  5. package/dist/lib/api-surface/analyzers/library.d.ts +4 -0
  6. package/dist/lib/api-surface/analyzers/library.d.ts.map +1 -0
  7. package/dist/lib/api-surface/analyzers/library.js +95 -0
  8. package/dist/lib/api-surface/analyzers/library.js.map +1 -0
  9. package/dist/lib/api-surface/analyzers/serverless.d.ts +13 -0
  10. package/dist/lib/api-surface/analyzers/serverless.d.ts.map +1 -0
  11. package/dist/lib/api-surface/analyzers/serverless.js +336 -0
  12. package/dist/lib/api-surface/analyzers/serverless.js.map +1 -0
  13. package/dist/lib/api-surface/analyzers/spring.d.ts +4 -0
  14. package/dist/lib/api-surface/analyzers/spring.d.ts.map +1 -0
  15. package/dist/lib/api-surface/analyzers/spring.js +237 -0
  16. package/dist/lib/api-surface/analyzers/spring.js.map +1 -0
  17. package/dist/lib/api-surface/analyzers/terraform.d.ts +4 -0
  18. package/dist/lib/api-surface/analyzers/terraform.d.ts.map +1 -0
  19. package/dist/lib/api-surface/analyzers/terraform.js +109 -0
  20. package/dist/lib/api-surface/analyzers/terraform.js.map +1 -0
  21. package/dist/lib/api-surface/detect.d.ts +8 -0
  22. package/dist/lib/api-surface/detect.d.ts.map +1 -0
  23. package/dist/lib/api-surface/detect.js +25 -0
  24. package/dist/lib/api-surface/detect.js.map +1 -0
  25. package/dist/lib/api-surface/emit.d.ts +4 -0
  26. package/dist/lib/api-surface/emit.d.ts.map +1 -0
  27. package/dist/lib/api-surface/emit.js +109 -0
  28. package/dist/lib/api-surface/emit.js.map +1 -0
  29. package/dist/lib/api-surface/file-set.d.ts +14 -0
  30. package/dist/lib/api-surface/file-set.d.ts.map +1 -0
  31. package/dist/lib/api-surface/file-set.js +43 -0
  32. package/dist/lib/api-surface/file-set.js.map +1 -0
  33. package/dist/lib/api-surface/index.d.ts +18 -0
  34. package/dist/lib/api-surface/index.d.ts.map +1 -0
  35. package/dist/lib/api-surface/index.js +134 -0
  36. package/dist/lib/api-surface/index.js.map +1 -0
  37. package/dist/lib/api-surface/types.d.ts +86 -0
  38. package/dist/lib/api-surface/types.d.ts.map +1 -0
  39. package/dist/lib/api-surface/types.js +17 -0
  40. package/dist/lib/api-surface/types.js.map +1 -0
  41. package/dist/lib/catalogue/aggregate.js +3 -3
  42. package/dist/lib/catalogue/aggregate.js.map +1 -1
  43. package/dist/lib/catalogue/builders/c4-entity-rollups.js +1 -1
  44. package/dist/lib/catalogue/builders/c4-entity-rollups.js.map +1 -1
  45. package/dist/lib/catalogue/builders/data-store-mapping.js +1 -1
  46. package/dist/lib/catalogue/builders/data-store-mapping.js.map +1 -1
  47. package/dist/lib/catalogue/builders/entities-mermaid.js +1 -1
  48. package/dist/lib/catalogue/builders/entities-mermaid.js.map +1 -1
  49. package/dist/lib/catalogue/builders/event-catalog-walker.js +1 -1
  50. package/dist/lib/catalogue/builders/event-catalog-walker.js.map +1 -1
  51. package/dist/lib/catalogue/builders/event-edges.js +1 -1
  52. package/dist/lib/catalogue/builders/event-edges.js.map +1 -1
  53. package/dist/lib/catalogue/builders/feature-grounding.js +4 -4
  54. package/dist/lib/catalogue/builders/glossary.js +1 -1
  55. package/dist/lib/catalogue/builders/glossary.js.map +1 -1
  56. package/dist/lib/catalogue/builders/repo-edges.js +2 -2
  57. package/dist/lib/catalogue/builders/repo-edges.js.map +1 -1
  58. package/dist/lib/catalogue/builders/service-contract-consumes.d.ts +1 -1
  59. package/dist/lib/catalogue/builders/service-contract-consumes.js +1 -1
  60. package/dist/lib/catalogue/builders/service-contract-consumes.js.map +1 -1
  61. package/dist/lib/catalogue/builders/service-entity-tables.js +1 -1
  62. package/dist/lib/catalogue/builders/service-entity-tables.js.map +1 -1
  63. package/dist/lib/catalogue/feature-grounding-aliases-loader.d.ts +2 -2
  64. package/dist/lib/catalogue/feature-grounding-aliases-loader.js +2 -2
  65. package/dist/lib/catalogue/service-contract-aliases-loader.d.ts +6 -6
  66. package/dist/lib/catalogue/service-contract-aliases-loader.js +6 -6
  67. package/dist/lib/conformance/index.d.ts +1 -0
  68. package/dist/lib/conformance/index.d.ts.map +1 -1
  69. package/dist/lib/conformance/index.js +26 -5
  70. package/dist/lib/conformance/index.js.map +1 -1
  71. package/dist/lib/mcp/tools/cascade-impact.d.ts +1 -1
  72. package/dist/lib/pack/builder.js +1 -1
  73. package/dist/lib/pack/builder.js.map +1 -1
  74. package/dist/lib/sync/config.d.ts +1 -1
  75. package/dist/verbs/api-surface.d.ts +3 -0
  76. package/dist/verbs/api-surface.d.ts.map +1 -0
  77. package/dist/verbs/api-surface.js +71 -0
  78. package/dist/verbs/api-surface.js.map +1 -0
  79. package/package.json +1 -1
@@ -0,0 +1,237 @@
1
+ import { allBySuffix, findBySuffix } from "../file-set.js";
2
+ // java-spring analyzer. Scans **/*.java for Spring-web controllers and outbound dependencies, and
3
+ // pom.xml / build.gradle for the Java runtime version. application.yml/properties → shared_infra.
4
+ const HTTP_METHOD_BY_ANNOTATION = {
5
+ GetMapping: "GET",
6
+ PostMapping: "POST",
7
+ PutMapping: "PUT",
8
+ DeleteMapping: "DELETE",
9
+ PatchMapping: "PATCH",
10
+ };
11
+ export async function analyzeSpring(fileSet) {
12
+ const javaFiles = allBySuffix(fileSet.files, ".java").filter((f) => !/(^|\/)(target|build)\//.test(f) && !/Test\.java$/.test(f));
13
+ const endpoints = [];
14
+ const downstream = [];
15
+ const sharedInfra = new Set();
16
+ const externalContracts = new Set();
17
+ for (const path of javaFiles) {
18
+ const src = await fileSet.read(path);
19
+ if (src === "")
20
+ continue;
21
+ collectEndpoints(src, path, endpoints);
22
+ collectDownstream(src, downstream, sharedInfra, externalContracts);
23
+ }
24
+ // Datasource / queue / topic names from config.
25
+ await collectConfigInfra(fileSet, sharedInfra);
26
+ const runtime = await detectJavaRuntime(fileSet);
27
+ dedupeDownstream(downstream);
28
+ endpoints.sort((a, b) => (a.path + a.method).localeCompare(b.path + b.method));
29
+ return {
30
+ stack: "java-spring",
31
+ component_type: "service",
32
+ endpoints,
33
+ dependencies: { downstream, upstream: [] },
34
+ external_contracts: [...externalContracts].sort(),
35
+ deployment: { runtime, shared_infra: [...sharedInfra].sort() },
36
+ };
37
+ }
38
+ function collectEndpoints(src, path, endpoints) {
39
+ const isController = /@(Rest)?Controller\b/.test(src);
40
+ if (!isController)
41
+ return;
42
+ const classBase = extractClassRequestMapping(src);
43
+ const classAuth = extractAuth(classLevelSlice(src));
44
+ // Walk method-mapping annotations. We pair each mapping annotation with the auth annotation(s)
45
+ // immediately preceding the method (within a small look-back window). The class-level
46
+ // @RequestMapping (which sits before the `class`/`interface` declaration) is the path prefix, not a
47
+ // method mapping — skip any mapping annotation that appears before the type declaration line.
48
+ const lines = src.split(/\r?\n/);
49
+ const typeDeclLine = lines.findIndex((l) => /\b(class|interface|enum)\s+\w+/.test(l));
50
+ for (let i = 0; i < lines.length; i++) {
51
+ if (typeDeclLine >= 0 && i < typeDeclLine)
52
+ continue;
53
+ const line = lines[i];
54
+ // @GetMapping("/x") / @PostMapping(value="/x") / @RequestMapping(value="/x", method=...).
55
+ const mappingM = line.match(/@(Get|Post|Put|Delete|Patch|Request)Mapping\b\s*(?:\(([^)]*)\))?/);
56
+ if (!mappingM)
57
+ continue;
58
+ const annotation = `${mappingM[1]}Mapping`;
59
+ const args = mappingM[2] ?? "";
60
+ let method = HTTP_METHOD_BY_ANNOTATION[annotation] ?? "";
61
+ if (annotation === "RequestMapping") {
62
+ const methodM = args.match(/method\s*=\s*(?:RequestMethod\.)?([A-Z]+)/);
63
+ method = methodM ? methodM[1] : "GET";
64
+ }
65
+ if (method === "")
66
+ method = "GET";
67
+ const subPath = extractPathArg(args);
68
+ const fullPath = joinPaths(classBase, subPath);
69
+ const methodAuth = extractAuth(lookBack(lines, i, 4)) || classAuth || "none";
70
+ endpoints.push({ method, path: fullPath, auth: methodAuth, handler: `${baseName(path)}` });
71
+ }
72
+ }
73
+ function classLevelSlice(src) {
74
+ // The annotations between the class's RequestMapping and the first method — best-effort: take the
75
+ // text up to the first mapping method annotation.
76
+ const idx = src.search(/@(Get|Post|Put|Delete|Patch)Mapping\b/);
77
+ return idx >= 0 ? src.slice(0, idx) : src;
78
+ }
79
+ function extractClassRequestMapping(src) {
80
+ // Class-level @RequestMapping("/x") sits before the class body's method mappings.
81
+ const m = src.match(/@RequestMapping\s*\(\s*([^)]*)\)/);
82
+ if (!m)
83
+ return "";
84
+ // Make sure this is the class-level one (appears before any method mapping).
85
+ const firstMethodMapping = src.search(/@(Get|Post|Put|Delete|Patch)Mapping\b/);
86
+ if (firstMethodMapping >= 0 && (m.index ?? 0) > firstMethodMapping)
87
+ return "";
88
+ return extractPathArg(m[1] ?? "");
89
+ }
90
+ function extractPathArg(args) {
91
+ // `"/events"` | `value = "/events"` | `path = "/events"` | `{"/a","/b"}` → first string literal.
92
+ const m = args.match(/(?:value|path)?\s*=?\s*\{?\s*"([^"]*)"/);
93
+ return m ? m[1] : "";
94
+ }
95
+ function extractAuth(text) {
96
+ const pre = text.match(/@PreAuthorize\s*\(\s*"([^"]+)"/);
97
+ if (pre)
98
+ return `preauthorize:${pre[1]}`;
99
+ const secured = text.match(/@Secured\s*\(\s*\{?\s*"?([^")}]+)/);
100
+ if (secured)
101
+ return `secured:${secured[1].trim()}`;
102
+ const roles = text.match(/@RolesAllowed\s*\(\s*\{?\s*"?([^")}]+)/);
103
+ if (roles)
104
+ return `roles:${roles[1].trim()}`;
105
+ return "";
106
+ }
107
+ function collectDownstream(src, downstream, sharedInfra, externalContracts) {
108
+ // @FeignClient(name = "x", url = "...") → feign.
109
+ for (const m of src.matchAll(/@FeignClient\s*\(([^)]*)\)/g)) {
110
+ const args = m[1] ?? "";
111
+ const name = args.match(/name\s*=\s*"([^"]+)"/)?.[1] ?? "feign-client";
112
+ const url = args.match(/url\s*=\s*"([^"]+)"/)?.[1];
113
+ downstream.push({ target: name, kind: "feign", detail: url ?? name, load_bearing: true });
114
+ if (url)
115
+ externalContracts.add(url);
116
+ }
117
+ // RestTemplate / WebClient → http.
118
+ if (/\bRestTemplate\b|\bWebClient\b/.test(src)) {
119
+ for (const m of src.matchAll(/["'](https?:\/\/[^"']+)["']/g)) {
120
+ downstream.push({ target: m[1], kind: "http", detail: m[1], load_bearing: false });
121
+ externalContracts.add(m[1]);
122
+ }
123
+ if (![...src.matchAll(/["'](https?:\/\/[^"']+)["']/g)].length) {
124
+ downstream.push({ target: "rest-client", kind: "http", detail: "RestTemplate/WebClient", load_bearing: false });
125
+ }
126
+ }
127
+ // @JmsListener / JmsTemplate → jms (+ destination literal where present).
128
+ for (const m of src.matchAll(/@JmsListener\s*\(([^)]*)\)/g)) {
129
+ const dest = (m[1] ?? "").match(/destination\s*=\s*"([^"]+)"/)?.[1] ?? "jms-destination";
130
+ downstream.push({ target: dest, kind: "jms", detail: dest, load_bearing: true });
131
+ sharedInfra.add(dest);
132
+ }
133
+ if (/\bJmsTemplate\b/.test(src)) {
134
+ downstream.push({ target: "jms", kind: "jms", detail: "JmsTemplate", load_bearing: true });
135
+ }
136
+ // @KafkaListener / KafkaTemplate → kafka.
137
+ for (const m of src.matchAll(/@KafkaListener\s*\(([^)]*)\)/g)) {
138
+ const topic = (m[1] ?? "").match(/topics\s*=\s*\{?\s*"([^"]+)"/)?.[1] ?? "kafka-topic";
139
+ downstream.push({ target: topic, kind: "kafka", detail: topic, load_bearing: true });
140
+ sharedInfra.add(topic);
141
+ }
142
+ if (/\bKafkaTemplate\b/.test(src)) {
143
+ downstream.push({ target: "kafka", kind: "kafka", detail: "KafkaTemplate producer", load_bearing: true });
144
+ }
145
+ // Spring Data repositories + entity/document annotations → datastore kind.
146
+ if (/interface\s+\w+\s+extends\s+\w*Repository\b/.test(src)) {
147
+ if (/@Document\b/.test(src)) {
148
+ downstream.push({ target: "mongo", kind: "mongo", detail: "Spring Data MongoRepository", load_bearing: true });
149
+ }
150
+ else if (/@Entity\b/.test(src)) {
151
+ downstream.push({ target: "jdbc", kind: "jdbc", detail: "Spring Data JpaRepository", load_bearing: true });
152
+ }
153
+ else {
154
+ downstream.push({ target: "datastore", kind: "jdbc", detail: "Spring Data Repository", load_bearing: true });
155
+ }
156
+ }
157
+ else if (/@Document\b/.test(src)) {
158
+ downstream.push({ target: "mongo", kind: "mongo", detail: "@Document entity", load_bearing: true });
159
+ }
160
+ }
161
+ async function collectConfigInfra(fileSet, sharedInfra) {
162
+ const configs = fileSet.files.filter((f) => /application(-[\w]+)?\.(ya?ml|properties)$/.test(f));
163
+ for (const path of configs) {
164
+ const src = await fileSet.read(path);
165
+ if (src === "")
166
+ continue;
167
+ // datasource url, kafka topics, jms queues, mongo uri.
168
+ for (const m of src.matchAll(/(?:datasource[._]url|spring\.datasource\.url)\s*[:=]\s*(\S+)/gi)) {
169
+ sharedInfra.add(`jdbc:${stripVar(m[1])}`);
170
+ }
171
+ for (const m of src.matchAll(/(?:topic|telemetrytopic)\s*[:=]\s*(\S+)/gi)) {
172
+ const v = stripVar(m[1]);
173
+ if (v)
174
+ sharedInfra.add(`topic:${v}`);
175
+ }
176
+ for (const m of src.matchAll(/(?:mongo[._]?uri|spring\.data\.mongodb\.uri)\s*[:=]\s*(\S+)/gi)) {
177
+ sharedInfra.add(`mongo:${stripVar(m[1])}`);
178
+ }
179
+ for (const m of src.matchAll(/bootstrap-servers\s*[:=]\s*(\S+)/gi)) {
180
+ sharedInfra.add(`kafka:${stripVar(m[1])}`);
181
+ }
182
+ }
183
+ }
184
+ function stripVar(v) {
185
+ // Keep env-var placeholders readable: `${GATEWAY_KAFKAPRODUCERTOPIC}` → GATEWAY_KAFKAPRODUCERTOPIC.
186
+ const m = v.match(/\$\{([^:}]+)/);
187
+ if (m)
188
+ return m[1];
189
+ return v.replace(/^['"]|['"]$/g, "").trim();
190
+ }
191
+ async function detectJavaRuntime(fileSet) {
192
+ const pom = findBySuffix(fileSet.files, "pom.xml");
193
+ if (pom) {
194
+ const src = await fileSet.read(pom);
195
+ const v = src.match(/<maven\.compiler\.release>\s*([\d.]+)/)?.[1] ??
196
+ src.match(/<maven\.compiler\.target>\s*([\d.]+)/)?.[1] ??
197
+ src.match(/<maven\.compiler\.source>\s*([\d.]+)/)?.[1] ??
198
+ src.match(/<java\.version>\s*([\d.]+)/)?.[1];
199
+ if (v)
200
+ return `java${v}`;
201
+ }
202
+ const gradle = findBySuffix(fileSet.files, "build.gradle");
203
+ if (gradle) {
204
+ const src = await fileSet.read(gradle);
205
+ const v = src.match(/JavaLanguageVersion\.of\(\s*([\d]+)\s*\)/)?.[1] ??
206
+ src.match(/(?:source|target)Compatibility\s*=?\s*['"]?(?:JavaVersion\.VERSION_)?([\d.]+)/)?.[1] ??
207
+ src.match(/java-openjdk(\d+)/)?.[1];
208
+ if (v)
209
+ return `java${v}`;
210
+ }
211
+ return "";
212
+ }
213
+ function joinPaths(base, sub) {
214
+ const b = base.replace(/\/$/, "");
215
+ const s = sub.startsWith("/") ? sub : sub ? `/${sub}` : "";
216
+ const joined = `${b}${s}`;
217
+ return joined.startsWith("/") ? joined : `/${joined}`;
218
+ }
219
+ function lookBack(lines, idx, n) {
220
+ return lines.slice(Math.max(0, idx - n), idx + 1).join("\n");
221
+ }
222
+ function baseName(p) {
223
+ return p.split("/").pop() ?? p;
224
+ }
225
+ function dedupeDownstream(deps) {
226
+ const seen = new Set();
227
+ for (let i = deps.length - 1; i >= 0; i--) {
228
+ const dep = deps[i];
229
+ const key = `${dep.kind}|${dep.detail}`;
230
+ if (seen.has(key))
231
+ deps.splice(i, 1);
232
+ else
233
+ seen.add(key);
234
+ }
235
+ deps.sort((a, b) => (a.kind + a.detail).localeCompare(b.kind + b.detail));
236
+ }
237
+ //# sourceMappingURL=spring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spring.js","sourceRoot":"","sources":["../../../../src/lib/api-surface/analyzers/spring.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO3D,kGAAkG;AAClG,kGAAkG;AAElG,MAAM,yBAAyB,GAAqC;IAClE,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,MAAM;IACnB,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,QAAQ;IACvB,YAAY,EAAE,OAAO;CACtB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgB;IAClD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAC1D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CACnE,CAAC;IAEF,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS;QACzB,gBAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACrE,CAAC;IAED,gDAAgD;IAChD,MAAM,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEjD,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC7B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/E,OAAO;QACL,KAAK,EAAE,aAAa;QACpB,cAAc,EAAE,SAAS;QACzB,SAAS;QACT,YAAY,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1C,kBAAkB,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,IAAI,EAAE;QACjD,UAAU,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,IAAY,EAAE,SAAqB;IACxE,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,YAAY;QAAE,OAAO;IAE1B,MAAM,SAAS,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IAEpD,+FAA+F;IAC/F,sFAAsF;IACtF,oGAAoG;IACpG,8FAA8F;IAC9F,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,CACzC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY;YAAE,SAAS;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,0FAA0F;QAC1F,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,kEAAkE,CACnE,CAAC;QACF,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,UAAU,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE/B,IAAI,MAAM,GAAG,yBAAyB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,UAAU,KAAK,gBAAgB,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACxE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,KAAK,EAAE;YAAE,MAAM,GAAG,KAAK,CAAC;QAElC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC;QAC7E,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,kGAAkG;IAClG,kDAAkD;IAClD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAChE,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC5C,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAW;IAC7C,kFAAkF;IAClF,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,6EAA6E;IAC7E,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAC/E,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,kBAAkB;QAAE,OAAO,EAAE,CAAC;IAC9E,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,iGAAiG;IACjG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC/D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACzD,IAAI,GAAG;QAAE,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAChE,IAAI,OAAO;QAAE,OAAO,WAAW,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACnE,IAAI,KAAK;QAAE,OAAO,SAAS,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,CAAC;IAC9C,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,iBAAiB,CACxB,GAAW,EACX,UAAkC,EAClC,WAAwB,EACxB,iBAA8B;IAE9B,iDAAiD;IACjD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,IAAI,GAAG;YAAE,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,mCAAmC;IACnC,IAAI,gCAAgC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;YAC7D,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;YACrF,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAC9D,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IACD,0EAA0E;IAC1E,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC;QACzF,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,0CAA0C;IAC1C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC;QACvF,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACrF,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,2EAA2E;IAC3E,IAAI,6CAA6C,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QACjH,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,2BAA2B,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7G,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;SAAM,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAgB,EAAE,WAAwB;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,2CAA2C,CAAC,IAAI,CAAC,CAAC,CAAC,CACpD,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,EAAE;YAAE,SAAS;QACzB,uDAAuD;QACvD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,gEAAgE,CAAC,EAAE,CAAC;YAC/F,WAAW,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,2CAA2C,CAAC,EAAE,CAAC;YAC1E,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;YAC1B,IAAI,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,+DAA+D,CAAC,EAAE,CAAC;YAC9F,WAAW,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE,CAAC;YACnE,WAAW,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,oGAAoG;IACpG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC;IACpB,OAAO,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAgB;IAC/C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnD,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,GACL,GAAG,CAAC,KAAK,CAAC,uCAAuC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvD,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC3D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,GACL,GAAG,CAAC,KAAK,CAAC,0CAA0C,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,GAAG,CAAC,KAAK,CAAC,+EAA+E,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/F,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC;YAAE,OAAO,OAAO,CAAC,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,GAAW;IAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1B,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAe,EAAE,GAAW,EAAE,CAAS;IACvD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA4B;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FileSet } from "../file-set.js";
2
+ import type { AnalyzerResult } from "../types.js";
3
+ export declare function analyzeTerraform(fileSet: FileSet): Promise<AnalyzerResult>;
4
+ //# sourceMappingURL=terraform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../../../../src/lib/api-surface/analyzers/terraform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AA2BxE,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAqEhF"}
@@ -0,0 +1,109 @@
1
+ import { allBySuffix } from "../file-set.js";
2
+ // terraform analyzer. No endpoints. Enumerate `resource "<type>" "<name>"` (grouped by type with
3
+ // counts), `data "<type>"`, `module "<name>"`, and IAM roles. Provisioned resources → shared_infra
4
+ // + a provisioned_resources summary; IAM roles + module sources → deployment.notes.
5
+ const RESOURCE_RE = /resource\s+"([^"]+)"\s+"([^"]+)"/g;
6
+ const DATA_RE = /data\s+"([^"]+)"\s+"([^"]+)"/g;
7
+ const MODULE_RE = /module\s+"([^"]+)"\s*\{/g;
8
+ const MODULE_SOURCE_RE = /module\s+"([^"]+)"\s*\{[^}]*?source\s*=\s*"([^"]+)"/gs;
9
+ const INFRA_RESOURCE_TYPES = new Set([
10
+ "aws_sqs_queue",
11
+ "aws_sns_topic",
12
+ "aws_dynamodb_table",
13
+ "aws_s3_bucket",
14
+ "aws_kinesis_stream",
15
+ "aws_lambda_function",
16
+ "aws_db_instance",
17
+ "aws_rds_cluster",
18
+ "aws_vpc",
19
+ "aws_cognito_user_pool",
20
+ "aws_cognito_identity_pool",
21
+ "aws_api_gateway_rest_api",
22
+ "aws_apigatewayv2_api",
23
+ ]);
24
+ export async function analyzeTerraform(fileSet) {
25
+ const tfFiles = allBySuffix(fileSet.files, ".tf").filter((f) => !/(^|\/)\.terraform\//.test(f));
26
+ const resourceCounts = new Map();
27
+ const sharedInfra = new Set();
28
+ const downstream = [];
29
+ const dataSources = new Set();
30
+ const modules = new Set();
31
+ const iamRoles = [];
32
+ for (const path of tfFiles) {
33
+ const src = await fileSet.read(path);
34
+ if (src === "")
35
+ continue;
36
+ for (const m of src.matchAll(RESOURCE_RE)) {
37
+ const type = m[1];
38
+ const name = m[2];
39
+ resourceCounts.set(type, (resourceCounts.get(type) ?? 0) + 1);
40
+ if (type === "aws_iam_role" || /iam_(role|policy)/.test(type)) {
41
+ iamRoles.push(name);
42
+ }
43
+ if (INFRA_RESOURCE_TYPES.has(type)) {
44
+ sharedInfra.add(`${type}.${name}`);
45
+ }
46
+ pushDependency(type, name, downstream);
47
+ }
48
+ for (const m of src.matchAll(DATA_RE)) {
49
+ dataSources.add(`${m[1]}.${m[2]}`);
50
+ }
51
+ for (const m of src.matchAll(MODULE_RE)) {
52
+ modules.add(m[1]);
53
+ }
54
+ for (const m of src.matchAll(MODULE_SOURCE_RE)) {
55
+ modules.add(`${m[1]} (source=${m[2]})`);
56
+ }
57
+ }
58
+ const provisioned = [...resourceCounts.entries()]
59
+ .map(([type, count]) => ({ type, count }))
60
+ .sort((a, b) => b.count - a.count || a.type.localeCompare(b.type));
61
+ const notes = [];
62
+ if (iamRoles.length > 0) {
63
+ notes.push(`iam roles/policies: ${[...new Set(iamRoles)].sort().join(", ")}`);
64
+ }
65
+ if (dataSources.size > 0) {
66
+ notes.push(`data sources: ${[...dataSources].sort().join(", ")}`);
67
+ }
68
+ if (modules.size > 0) {
69
+ notes.push(`modules: ${[...modules].sort().join(", ")}`);
70
+ }
71
+ dedupeDownstream(downstream);
72
+ return {
73
+ stack: "terraform",
74
+ component_type: "infra",
75
+ endpoints: [],
76
+ dependencies: { downstream, upstream: [] },
77
+ external_contracts: [],
78
+ deployment: {
79
+ runtime: "terraform",
80
+ shared_infra: [...sharedInfra].sort(),
81
+ provisioned_resources: provisioned,
82
+ ...(notes.length > 0 ? { notes } : {}),
83
+ },
84
+ };
85
+ }
86
+ function pushDependency(type, name, downstream) {
87
+ const target = `${type}.${name}`;
88
+ if (type === "aws_sqs_queue")
89
+ downstream.push({ target, kind: "sqs", detail: name, load_bearing: true });
90
+ else if (type === "aws_sns_topic")
91
+ downstream.push({ target, kind: "sns", detail: name, load_bearing: true });
92
+ else if (type === "aws_dynamodb_table")
93
+ downstream.push({ target, kind: "dynamodb", detail: name, load_bearing: true });
94
+ else if (type === "aws_s3_bucket")
95
+ downstream.push({ target, kind: "s3", detail: name, load_bearing: false });
96
+ }
97
+ function dedupeDownstream(deps) {
98
+ const seen = new Set();
99
+ for (let i = deps.length - 1; i >= 0; i--) {
100
+ const dep = deps[i];
101
+ const key = `${dep.kind}|${dep.target}`;
102
+ if (seen.has(key))
103
+ deps.splice(i, 1);
104
+ else
105
+ seen.add(key);
106
+ }
107
+ deps.sort((a, b) => (a.kind + a.target).localeCompare(b.kind + b.target));
108
+ }
109
+ //# sourceMappingURL=terraform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../../../src/lib/api-surface/analyzers/terraform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Stack } from "./types.js";
2
+ export interface DetectSignals {
3
+ /** True when at least one Java file carries a Spring web controller annotation. */
4
+ readonly hasSpringController: boolean;
5
+ }
6
+ export declare function detectStack(files: readonly string[], signals?: DetectSignals): Stack;
7
+ export declare function fileLooksLikeSpringController(source: string): boolean;
8
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/lib/api-surface/detect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAiBxC,MAAM,WAAW,aAAa;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,GAAE,aAA8C,GACtD,KAAK,CAkBP;AAKD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErE"}
@@ -0,0 +1,25 @@
1
+ import { basename } from "node:path";
2
+ export function detectStack(files, signals = { hasSpringController: false }) {
3
+ const names = files.map((f) => basename(f).toLowerCase());
4
+ const has = (pred) => names.some(pred);
5
+ const hasJavaBuild = has((n) => n === "pom.xml" || n === "build.gradle");
6
+ // (1) A Spring service ships as a Spring service even with a bundled IaC/serverless wrapper.
7
+ if (hasJavaBuild && signals.hasSpringController)
8
+ return "java-spring";
9
+ const hasServerless = has((n) => n === "serverless.yml" || n === "serverless.yaml");
10
+ if (hasServerless)
11
+ return "node-serverless";
12
+ const hasTerraform = files.some((f) => f.toLowerCase().endsWith(".tf"));
13
+ if (hasTerraform)
14
+ return "terraform";
15
+ const hasManifest = hasJavaBuild || has((n) => n === "package.json");
16
+ if (hasManifest)
17
+ return "library";
18
+ return "unknown";
19
+ }
20
+ /** Class/type-level annotation that marks a Spring web controller. */
21
+ const SPRING_CONTROLLER_RE = /@(Rest)?Controller\b|@RequestMapping\b/;
22
+ export function fileLooksLikeSpringController(source) {
23
+ return SPRING_CONTROLLER_RE.test(source);
24
+ }
25
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/lib/api-surface/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAuBrC,MAAM,UAAU,WAAW,CACzB,KAAwB,EACxB,UAAyB,EAAE,mBAAmB,EAAE,KAAK,EAAE;IAEvD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,CAAC,IAA4B,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExE,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,cAAc,CAAC,CAAC;IACzE,6FAA6F;IAC7F,IAAI,YAAY,IAAI,OAAO,CAAC,mBAAmB;QAAE,OAAO,aAAa,CAAC;IAEtE,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,gBAAgB,IAAI,CAAC,KAAK,iBAAiB,CAAC,CAAC;IACpF,IAAI,aAAa;QAAE,OAAO,iBAAiB,CAAC;IAE5C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,IAAI,YAAY;QAAE,OAAO,WAAW,CAAC;IAErC,MAAM,WAAW,GAAG,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC;IACrE,IAAI,WAAW;QAAE,OAAO,SAAS,CAAC;IAElC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,sEAAsE;AACtE,MAAM,oBAAoB,GAAG,wCAAwC,CAAC;AAEtE,MAAM,UAAU,6BAA6B,CAAC,MAAc;IAC1D,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ApiSurface } from "./types.js";
2
+ export declare function toYaml(surface: ApiSurface): string;
3
+ export declare function toMarkdownBlock(surface: ApiSurface): string;
4
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/lib/api-surface/emit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,wBAAgB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAwDlD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAqD3D"}
@@ -0,0 +1,109 @@
1
+ import { stringify as stringifyYaml } from "yaml";
2
+ // Serialisers for an ApiSurface. `toYaml` produces the contracts/api-surface.yaml document (keys in a
3
+ // stable, human-readable order; empty blocks omitted so non-endpoint stacks don't carry noise).
4
+ // `toMarkdownBlock` produces the `## External Interfaces` + `## Dependency Graph` documentation block
5
+ // the reverse rubric reads.
6
+ export function toYaml(surface) {
7
+ // Build an ordered plain object so the YAML key order is deterministic and reads top-down.
8
+ const doc = {
9
+ repo: surface.repo,
10
+ profile: surface.profile,
11
+ component_type: surface.component_type,
12
+ domain: surface.domain,
13
+ stack: surface.stack,
14
+ };
15
+ if (surface.source_snapshot)
16
+ doc["source_snapshot"] = surface.source_snapshot;
17
+ doc["generated_by"] = surface.generated_by;
18
+ if (surface.endpoints.length > 0) {
19
+ doc["endpoints"] = surface.endpoints.map((e) => ({
20
+ method: e.method,
21
+ path: e.path,
22
+ auth: e.auth,
23
+ handler: e.handler,
24
+ }));
25
+ }
26
+ doc["dependencies"] = {
27
+ downstream: surface.dependencies.downstream.map((d) => ({
28
+ target: d.target,
29
+ kind: d.kind,
30
+ detail: d.detail,
31
+ load_bearing: d.load_bearing,
32
+ })),
33
+ upstream: surface.dependencies.upstream,
34
+ };
35
+ if (surface.external_contracts.length > 0) {
36
+ doc["external_contracts"] = surface.external_contracts;
37
+ }
38
+ const deployment = {
39
+ runtime: surface.deployment.runtime,
40
+ shared_infra: surface.deployment.shared_infra,
41
+ };
42
+ if (surface.deployment.provisioned_resources && surface.deployment.provisioned_resources.length > 0) {
43
+ deployment["provisioned_resources"] = surface.deployment.provisioned_resources;
44
+ }
45
+ if (surface.deployment.notes && surface.deployment.notes.length > 0) {
46
+ deployment["notes"] = surface.deployment.notes;
47
+ }
48
+ doc["deployment"] = deployment;
49
+ if (surface.public_api) {
50
+ const pub = {};
51
+ if (surface.public_api.package_name)
52
+ pub["package_name"] = surface.public_api.package_name;
53
+ pub["exports"] = surface.public_api.exports;
54
+ doc["public_api"] = pub;
55
+ }
56
+ doc["consumed_by"] = surface.consumed_by;
57
+ return stringifyYaml(doc, { lineWidth: 0 });
58
+ }
59
+ export function toMarkdownBlock(surface) {
60
+ const lines = [];
61
+ lines.push("## External Interfaces");
62
+ lines.push("");
63
+ if (surface.endpoints.length > 0) {
64
+ lines.push("| Method | Path | Auth | Handler |");
65
+ lines.push("| --- | --- | --- | --- |");
66
+ for (const e of surface.endpoints) {
67
+ lines.push(`| ${e.method} | ${e.path} | ${e.auth} | ${e.handler} |`);
68
+ }
69
+ }
70
+ else {
71
+ lines.push(`_No HTTP endpoints (${surface.stack} stack)._`);
72
+ }
73
+ lines.push("");
74
+ lines.push("## Dependency Graph");
75
+ lines.push("");
76
+ const down = surface.dependencies.downstream;
77
+ if (down.length > 0) {
78
+ lines.push("**Downstream:**");
79
+ lines.push("");
80
+ lines.push("| Target | Kind | Detail | Load-bearing |");
81
+ lines.push("| --- | --- | --- | --- |");
82
+ for (const d of down) {
83
+ lines.push(`| ${d.target} | ${d.kind} | ${d.detail} | ${d.load_bearing ? "yes" : "no"} |`);
84
+ }
85
+ lines.push("");
86
+ }
87
+ const up = surface.dependencies.upstream;
88
+ lines.push(`**Upstream:** ${up.length > 0 ? up.join(", ") : "_unknown_"}`);
89
+ lines.push("");
90
+ if (surface.external_contracts.length > 0) {
91
+ lines.push("**External contracts:** " + surface.external_contracts.join(", "));
92
+ lines.push("");
93
+ }
94
+ lines.push("## Deployment");
95
+ lines.push("");
96
+ lines.push(`- Runtime: ${surface.deployment.runtime || "_unknown_"}`);
97
+ if (surface.deployment.shared_infra.length > 0) {
98
+ lines.push(`- Shared infra: ${surface.deployment.shared_infra.join(", ")}`);
99
+ }
100
+ if (surface.deployment.provisioned_resources && surface.deployment.provisioned_resources.length > 0) {
101
+ const summary = surface.deployment.provisioned_resources
102
+ .map((r) => `${r.type} ×${r.count}`)
103
+ .join(", ");
104
+ lines.push(`- Provisioned: ${summary}`);
105
+ }
106
+ lines.push("");
107
+ return lines.join("\n");
108
+ }
109
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/lib/api-surface/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface FileSet {
2
+ readonly root: string;
3
+ /** Repo-relative POSIX-ish paths (forward slashes), files only. */
4
+ readonly files: readonly string[];
5
+ /** Read a relative path's UTF-8 content; "" when missing/unreadable. */
6
+ read(relPath: string): Promise<string>;
7
+ }
8
+ export declare function diskFileSet(root: string, files: readonly string[]): FileSet;
9
+ /** Build a FileSet from an in-memory `{ path: content }` map — for tests. */
10
+ export declare function inMemoryFileSet(entries: Readonly<Record<string, string>>, root?: string): FileSet;
11
+ /** First file (by suffix match, case-insensitive) or null. */
12
+ export declare function findBySuffix(files: readonly string[], suffix: string): string | null;
13
+ export declare function allBySuffix(files: readonly string[], suffix: string): string[];
14
+ //# sourceMappingURL=file-set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-set.d.ts","sourceRoot":"","sources":["../../../src/lib/api-surface/file-set.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,wEAAwE;IACxE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAkB3E;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAC7B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACzC,IAAI,SAAa,GAChB,OAAO,CAQT;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAG9E"}
@@ -0,0 +1,43 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export function diskFileSet(root, files) {
4
+ const cache = new Map();
5
+ return {
6
+ root,
7
+ files,
8
+ async read(relPath) {
9
+ const cached = cache.get(relPath);
10
+ if (cached !== undefined)
11
+ return cached;
12
+ let content = "";
13
+ try {
14
+ content = await readFile(join(root, relPath), "utf-8");
15
+ }
16
+ catch {
17
+ content = "";
18
+ }
19
+ cache.set(relPath, content);
20
+ return content;
21
+ },
22
+ };
23
+ }
24
+ /** Build a FileSet from an in-memory `{ path: content }` map — for tests. */
25
+ export function inMemoryFileSet(entries, root = "/virtual") {
26
+ return {
27
+ root,
28
+ files: Object.keys(entries),
29
+ async read(relPath) {
30
+ return entries[relPath] ?? "";
31
+ },
32
+ };
33
+ }
34
+ /** First file (by suffix match, case-insensitive) or null. */
35
+ export function findBySuffix(files, suffix) {
36
+ const lower = suffix.toLowerCase();
37
+ return files.find((f) => f.toLowerCase().endsWith(lower)) ?? null;
38
+ }
39
+ export function allBySuffix(files, suffix) {
40
+ const lower = suffix.toLowerCase();
41
+ return files.filter((f) => f.toLowerCase().endsWith(lower));
42
+ }
43
+ //# sourceMappingURL=file-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-set.js","sourceRoot":"","sources":["../../../src/lib/api-surface/file-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAcjC,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAwB;IAChE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,OAAO;QACL,IAAI;QACJ,KAAK;QACL,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACxC,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC5B,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAC7B,OAAyC,EACzC,IAAI,GAAG,UAAU;IAEjB,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,YAAY,CAAC,KAAwB,EAAE,MAAc;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAwB,EAAE,MAAc;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC"}