openlore 2.0.3 → 2.0.4
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.
- package/README.md +4 -2
- package/dist/cli/commands/analyze.js +36 -23
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/core/analyzer/artifact-generator.d.ts.map +1 -1
- package/dist/core/analyzer/artifact-generator.js +37 -3
- package/dist/core/analyzer/artifact-generator.js.map +1 -1
- package/dist/core/analyzer/call-graph.d.ts +9 -2
- package/dist/core/analyzer/call-graph.d.ts.map +1 -1
- package/dist/core/analyzer/call-graph.js +534 -1
- package/dist/core/analyzer/call-graph.js.map +1 -1
- package/dist/core/analyzer/embedding-service.d.ts +2 -0
- package/dist/core/analyzer/embedding-service.d.ts.map +1 -1
- package/dist/core/analyzer/embedding-service.js +4 -0
- package/dist/core/analyzer/embedding-service.js.map +1 -1
- package/dist/core/analyzer/fixtures/regression/sample.d.ts +9 -0
- package/dist/core/analyzer/fixtures/regression/sample.d.ts.map +1 -0
- package/dist/core/analyzer/fixtures/regression/sample.js +26 -0
- package/dist/core/analyzer/fixtures/regression/sample.js.map +1 -0
- package/dist/core/analyzer/iac/ansible.d.ts +18 -0
- package/dist/core/analyzer/iac/ansible.d.ts.map +1 -0
- package/dist/core/analyzer/iac/ansible.js +219 -0
- package/dist/core/analyzer/iac/ansible.js.map +1 -0
- package/dist/core/analyzer/iac/cdk.d.ts +26 -0
- package/dist/core/analyzer/iac/cdk.d.ts.map +1 -0
- package/dist/core/analyzer/iac/cdk.js +204 -0
- package/dist/core/analyzer/iac/cdk.js.map +1 -0
- package/dist/core/analyzer/iac/classify-yaml.d.ts +20 -0
- package/dist/core/analyzer/iac/classify-yaml.d.ts.map +1 -0
- package/dist/core/analyzer/iac/classify-yaml.js +81 -0
- package/dist/core/analyzer/iac/classify-yaml.js.map +1 -0
- package/dist/core/analyzer/iac/cloudformation.d.ts +15 -0
- package/dist/core/analyzer/iac/cloudformation.d.ts.map +1 -0
- package/dist/core/analyzer/iac/cloudformation.js +189 -0
- package/dist/core/analyzer/iac/cloudformation.js.map +1 -0
- package/dist/core/analyzer/iac/helm.d.ts +20 -0
- package/dist/core/analyzer/iac/helm.d.ts.map +1 -0
- package/dist/core/analyzer/iac/helm.js +229 -0
- package/dist/core/analyzer/iac/helm.js.map +1 -0
- package/dist/core/analyzer/iac/index.d.ts +23 -0
- package/dist/core/analyzer/iac/index.d.ts.map +1 -0
- package/dist/core/analyzer/iac/index.js +40 -0
- package/dist/core/analyzer/iac/index.js.map +1 -0
- package/dist/core/analyzer/iac/kubernetes.d.ts +14 -0
- package/dist/core/analyzer/iac/kubernetes.d.ts.map +1 -0
- package/dist/core/analyzer/iac/kubernetes.js +226 -0
- package/dist/core/analyzer/iac/kubernetes.js.map +1 -0
- package/dist/core/analyzer/iac/project.d.ts +16 -0
- package/dist/core/analyzer/iac/project.d.ts.map +1 -0
- package/dist/core/analyzer/iac/project.js +97 -0
- package/dist/core/analyzer/iac/project.js.map +1 -0
- package/dist/core/analyzer/iac/pulumi.d.ts +21 -0
- package/dist/core/analyzer/iac/pulumi.d.ts.map +1 -0
- package/dist/core/analyzer/iac/pulumi.js +190 -0
- package/dist/core/analyzer/iac/pulumi.js.map +1 -0
- package/dist/core/analyzer/iac/terraform.d.ts +19 -0
- package/dist/core/analyzer/iac/terraform.d.ts.map +1 -0
- package/dist/core/analyzer/iac/terraform.js +546 -0
- package/dist/core/analyzer/iac/terraform.js.map +1 -0
- package/dist/core/analyzer/iac/types.d.ts +67 -0
- package/dist/core/analyzer/iac/types.d.ts.map +1 -0
- package/dist/core/analyzer/iac/types.js +39 -0
- package/dist/core/analyzer/iac/types.js.map +1 -0
- package/dist/core/analyzer/signature-extractor.d.ts +6 -0
- package/dist/core/analyzer/signature-extractor.d.ts.map +1 -1
- package/dist/core/analyzer/signature-extractor.js +112 -2
- package/dist/core/analyzer/signature-extractor.js.map +1 -1
- package/dist/core/analyzer/spec-vector-index.d.ts +9 -2
- package/dist/core/analyzer/spec-vector-index.d.ts.map +1 -1
- package/dist/core/analyzer/spec-vector-index.js +111 -10
- package/dist/core/analyzer/spec-vector-index.js.map +1 -1
- package/dist/core/analyzer/vector-index.d.ts +33 -1
- package/dist/core/analyzer/vector-index.d.ts.map +1 -1
- package/dist/core/analyzer/vector-index.js +99 -10
- package/dist/core/analyzer/vector-index.js.map +1 -1
- package/dist/core/services/edge-store.d.ts +6 -0
- package/dist/core/services/edge-store.d.ts.map +1 -1
- package/dist/core/services/edge-store.js +8 -0
- package/dist/core/services/edge-store.js.map +1 -1
- package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/graph.js +12 -0
- package/dist/core/services/mcp-handlers/graph.js.map +1 -1
- package/dist/core/services/mcp-handlers/orient.js +2 -2
- package/dist/core/services/mcp-handlers/orient.js.map +1 -1
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/semantic.js +23 -30
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
- package/dist/core/services/mcp-watcher.d.ts.map +1 -1
- package/dist/core/services/mcp-watcher.js +14 -10
- package/dist/core/services/mcp-watcher.js.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CloudFormation / SAM extraction (spec-07).
|
|
3
|
+
*
|
|
4
|
+
* Handles JSON and YAML, including the short-form intrinsics (`!Ref`,
|
|
5
|
+
* `!GetAtt`, `!Sub`, …) via a CFN-aware custom-tag set so the `yaml` parser
|
|
6
|
+
* does not choke. Edges: Ref, Fn::GetAtt, Fn::Sub ${var}, DependsOn,
|
|
7
|
+
* Fn::ImportValue (cross-stack → external), nested stacks (TemplateURL).
|
|
8
|
+
* Pseudo-parameters (AWS::Region, …) are ignored as builtins.
|
|
9
|
+
*/
|
|
10
|
+
import { LineCounter, parseDocument } from 'yaml';
|
|
11
|
+
import { emptyIacGraph } from './types.js';
|
|
12
|
+
const INTRINSICS = [
|
|
13
|
+
'Ref', 'GetAtt', 'Sub', 'Join', 'Select', 'Split', 'FindInMap', 'ImportValue',
|
|
14
|
+
'Base64', 'GetAZs', 'Cidr', 'If', 'Equals', 'And', 'Or', 'Not', 'Condition',
|
|
15
|
+
'Transform', 'Length', 'ToJsonString',
|
|
16
|
+
];
|
|
17
|
+
/** Build scalar+seq+map custom tags that unwrap `!Name` → `{ Ref|Fn::Name: value }`. */
|
|
18
|
+
function cfnTags() {
|
|
19
|
+
const tags = [];
|
|
20
|
+
for (const name of INTRINSICS) {
|
|
21
|
+
const canonical = name === 'Ref' || name === 'Condition' ? name : `Fn::${name}`;
|
|
22
|
+
const wrap = (value) => ({ [canonical]: value });
|
|
23
|
+
tags.push({ tag: `!${name}`, resolve: (str) => wrap(str) });
|
|
24
|
+
tags.push({
|
|
25
|
+
tag: `!${name}`, collection: 'seq',
|
|
26
|
+
resolve: (seq) => wrap(seq.toJSON()),
|
|
27
|
+
});
|
|
28
|
+
tags.push({
|
|
29
|
+
tag: `!${name}`, collection: 'map',
|
|
30
|
+
resolve: (map) => wrap(map.toJSON()),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return tags;
|
|
34
|
+
}
|
|
35
|
+
export function extractCloudFormation(files) {
|
|
36
|
+
const graph = emptyIacGraph();
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
let doc;
|
|
39
|
+
const lc = new LineCounter();
|
|
40
|
+
try {
|
|
41
|
+
doc = parseDocument(file.content, { customTags: cfnTags(), lineCounter: lc });
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const js = doc.toJS();
|
|
47
|
+
if (!js || typeof js !== 'object')
|
|
48
|
+
continue;
|
|
49
|
+
extractTemplate(js, file.path, doc, lc, graph);
|
|
50
|
+
}
|
|
51
|
+
return graph;
|
|
52
|
+
}
|
|
53
|
+
function extractTemplate(tpl, filePath, doc, lc, graph) {
|
|
54
|
+
const declared = new Set();
|
|
55
|
+
const lineOf = (path) => {
|
|
56
|
+
const node = doc.getIn(path, true);
|
|
57
|
+
const off = node?.range?.[0];
|
|
58
|
+
return off != null ? lc.linePos(off).line : 1;
|
|
59
|
+
};
|
|
60
|
+
const addNode = (address, type, kind, path, signature, isExternal = false) => {
|
|
61
|
+
declared.add(address);
|
|
62
|
+
graph.resources.push({
|
|
63
|
+
address, type, kind, filePath,
|
|
64
|
+
startLine: lineOf(path),
|
|
65
|
+
signature,
|
|
66
|
+
isExternal: isExternal || undefined,
|
|
67
|
+
language: 'CloudFormation',
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
const sections = [
|
|
71
|
+
['Parameters', 'variable', 'Parameter'],
|
|
72
|
+
['Mappings', 'value', 'Mapping'],
|
|
73
|
+
['Conditions', 'value', 'Condition'],
|
|
74
|
+
];
|
|
75
|
+
for (const [section, kind, typeLabel] of sections) {
|
|
76
|
+
const obj = tpl[section];
|
|
77
|
+
if (obj && typeof obj === 'object') {
|
|
78
|
+
for (const id of Object.keys(obj)) {
|
|
79
|
+
addNode(id, typeLabel, kind, [section, id], `${typeLabel}: ${id}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const resources = (tpl.Resources ?? {});
|
|
84
|
+
for (const [id, body] of Object.entries(resources)) {
|
|
85
|
+
if (!body || typeof body !== 'object')
|
|
86
|
+
continue;
|
|
87
|
+
const type = body.Type;
|
|
88
|
+
const typeStr = typeof type === 'string' ? type : 'AWS::Unknown';
|
|
89
|
+
addNode(id, typeStr, 'resource', ['Resources', id], `${id} (${typeStr})`);
|
|
90
|
+
}
|
|
91
|
+
const outputs = (tpl.Outputs ?? {});
|
|
92
|
+
for (const id of Object.keys(outputs)) {
|
|
93
|
+
addNode(`Output.${id}`, 'Output', 'output', ['Outputs', id], `Output: ${id}`);
|
|
94
|
+
}
|
|
95
|
+
// Edges — walk each resource/output body for intrinsic references + DependsOn.
|
|
96
|
+
const externalAddrs = new Set();
|
|
97
|
+
const ensureExternal = (address, type) => {
|
|
98
|
+
if (declared.has(address) || externalAddrs.has(address))
|
|
99
|
+
return;
|
|
100
|
+
externalAddrs.add(address);
|
|
101
|
+
graph.resources.push({
|
|
102
|
+
address, type, kind: 'stack', filePath, startLine: 1,
|
|
103
|
+
isExternal: true, signature: address, language: 'CloudFormation',
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
const emitRefs = (from, body) => {
|
|
107
|
+
const refs = new Set();
|
|
108
|
+
const deps = new Set();
|
|
109
|
+
collectIntrinsics(body, refs, (importName) => {
|
|
110
|
+
const addr = `ImportValue:${importName}`;
|
|
111
|
+
ensureExternal(addr, 'Fn::ImportValue');
|
|
112
|
+
refs.add(addr);
|
|
113
|
+
});
|
|
114
|
+
// DependsOn at the resource top level.
|
|
115
|
+
if (body && typeof body === 'object') {
|
|
116
|
+
const d = body.DependsOn;
|
|
117
|
+
if (typeof d === 'string')
|
|
118
|
+
deps.add(d);
|
|
119
|
+
else if (Array.isArray(d))
|
|
120
|
+
for (const x of d)
|
|
121
|
+
if (typeof x === 'string')
|
|
122
|
+
deps.add(x);
|
|
123
|
+
// Nested stack: TemplateURL → external.
|
|
124
|
+
const props = body.Properties;
|
|
125
|
+
if (body.Type === 'AWS::CloudFormation::Stack' && props?.TemplateURL) {
|
|
126
|
+
const url = typeof props.TemplateURL === 'string' ? props.TemplateURL : 'nested-stack';
|
|
127
|
+
const addr = `Stack:${url}`;
|
|
128
|
+
ensureExternal(addr, 'AWS::CloudFormation::Stack');
|
|
129
|
+
refs.add(addr);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const add = (to, kind) => {
|
|
133
|
+
if (to === from)
|
|
134
|
+
return;
|
|
135
|
+
if (declared.has(to) || externalAddrs.has(to)) {
|
|
136
|
+
graph.references.push({ fromAddress: from, toAddress: to, kind });
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
for (const r of refs)
|
|
140
|
+
add(r, 'references');
|
|
141
|
+
for (const d of deps)
|
|
142
|
+
add(d, 'depends_on');
|
|
143
|
+
};
|
|
144
|
+
for (const [id, body] of Object.entries(resources))
|
|
145
|
+
emitRefs(id, body);
|
|
146
|
+
for (const [id, body] of Object.entries(outputs))
|
|
147
|
+
emitRefs(`Output.${id}`, body);
|
|
148
|
+
}
|
|
149
|
+
/** Recursively collect Ref/GetAtt/Sub targets (logical ids), ignoring pseudo-params. */
|
|
150
|
+
function collectIntrinsics(node, refs, onImport) {
|
|
151
|
+
if (Array.isArray(node)) {
|
|
152
|
+
for (const x of node)
|
|
153
|
+
collectIntrinsics(x, refs, onImport);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (!node || typeof node !== 'object')
|
|
157
|
+
return;
|
|
158
|
+
const rec = node;
|
|
159
|
+
if (typeof rec.Ref === 'string')
|
|
160
|
+
addLogical(rec.Ref, refs);
|
|
161
|
+
if ('Fn::GetAtt' in rec) {
|
|
162
|
+
const v = rec['Fn::GetAtt'];
|
|
163
|
+
const target = typeof v === 'string' ? v.split('.')[0] : Array.isArray(v) ? String(v[0]) : undefined;
|
|
164
|
+
if (target)
|
|
165
|
+
addLogical(target, refs);
|
|
166
|
+
}
|
|
167
|
+
if ('Fn::Sub' in rec) {
|
|
168
|
+
const v = rec['Fn::Sub'];
|
|
169
|
+
const tmpl = typeof v === 'string' ? v : Array.isArray(v) && typeof v[0] === 'string' ? v[0] : '';
|
|
170
|
+
for (const m of tmpl.matchAll(/\$\{([^}]+)\}/g))
|
|
171
|
+
addLogical(m[1].split('.')[0].trim(), refs);
|
|
172
|
+
}
|
|
173
|
+
if ('Fn::ImportValue' in rec) {
|
|
174
|
+
const v = rec['Fn::ImportValue'];
|
|
175
|
+
if (typeof v === 'string')
|
|
176
|
+
onImport(v);
|
|
177
|
+
}
|
|
178
|
+
for (const [k, v] of Object.entries(rec)) {
|
|
179
|
+
if (k === 'DependsOn')
|
|
180
|
+
continue; // handled at resource level
|
|
181
|
+
collectIntrinsics(v, refs, onImport);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function addLogical(name, refs) {
|
|
185
|
+
if (!name || name.startsWith('AWS::'))
|
|
186
|
+
return; // pseudo-parameter
|
|
187
|
+
refs.add(name);
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=cloudformation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudformation.js","sourceRoot":"","sources":["../../../../src/core/analyzer/iac/cloudformation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helm chart extraction (spec-07).
|
|
3
|
+
*
|
|
4
|
+
* A chart is a directory containing `Chart.yaml`. We parse Chart.yaml
|
|
5
|
+
* (name + dependencies), and the templates under `templates/`. Templates are
|
|
6
|
+
* Go-templated YAML, not valid YAML as-is, so we run a tolerant pre-pass that
|
|
7
|
+
* masks `{{ … }}` (never executing it) so the structure parses best-effort.
|
|
8
|
+
*
|
|
9
|
+
* Edges: chart → subchart dependency (external unless vendored under charts/),
|
|
10
|
+
* template → named-template (`include`/`template` → `define`), and template →
|
|
11
|
+
* values (`.Values.x` resolved to the longest matching values.yaml key).
|
|
12
|
+
*/
|
|
13
|
+
import type { IacGraph } from './types.js';
|
|
14
|
+
interface InFile {
|
|
15
|
+
path: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function extractHelm(files: InFile[]): IacGraph;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=helm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/iac/helm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAa,MAAM,YAAY,CAAC;AAGtD,UAAU,MAAM;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAElD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CA4BrD"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helm chart extraction (spec-07).
|
|
3
|
+
*
|
|
4
|
+
* A chart is a directory containing `Chart.yaml`. We parse Chart.yaml
|
|
5
|
+
* (name + dependencies), and the templates under `templates/`. Templates are
|
|
6
|
+
* Go-templated YAML, not valid YAML as-is, so we run a tolerant pre-pass that
|
|
7
|
+
* masks `{{ … }}` (never executing it) so the structure parses best-effort.
|
|
8
|
+
*
|
|
9
|
+
* Edges: chart → subchart dependency (external unless vendored under charts/),
|
|
10
|
+
* template → named-template (`include`/`template` → `define`), and template →
|
|
11
|
+
* values (`.Values.x` resolved to the longest matching values.yaml key).
|
|
12
|
+
*/
|
|
13
|
+
import { dirname, posix as posixPath } from 'node:path';
|
|
14
|
+
import { parseAllDocuments } from 'yaml';
|
|
15
|
+
import { emptyIacGraph } from './types.js';
|
|
16
|
+
export function extractHelm(files) {
|
|
17
|
+
const graph = emptyIacGraph();
|
|
18
|
+
const chartRoots = files
|
|
19
|
+
.filter((f) => /(^|\/)Chart\.ya?ml$/.test(f.path.replace(/\\/g, '/')))
|
|
20
|
+
.map((f) => posixPath.normalize(dirname(f.path.replace(/\\/g, '/'))));
|
|
21
|
+
const fileChart = (path) => {
|
|
22
|
+
const p = posixPath.normalize(path.replace(/\\/g, '/'));
|
|
23
|
+
let best = null;
|
|
24
|
+
for (const root of chartRoots) {
|
|
25
|
+
if ((p === root || p.startsWith(root + '/')) && (best === null || root.length > best.length))
|
|
26
|
+
best = root;
|
|
27
|
+
}
|
|
28
|
+
return best;
|
|
29
|
+
};
|
|
30
|
+
// Group files by chart root.
|
|
31
|
+
const byChart = new Map();
|
|
32
|
+
for (const f of files) {
|
|
33
|
+
const root = fileChart(f.path);
|
|
34
|
+
if (!root)
|
|
35
|
+
continue;
|
|
36
|
+
if (!byChart.has(root))
|
|
37
|
+
byChart.set(root, []);
|
|
38
|
+
byChart.get(root).push(f);
|
|
39
|
+
}
|
|
40
|
+
for (const [root, chartFiles] of byChart) {
|
|
41
|
+
extractChart(root, chartFiles, chartRoots, graph);
|
|
42
|
+
}
|
|
43
|
+
return graph;
|
|
44
|
+
}
|
|
45
|
+
function extractChart(root, chartFiles, allChartRoots, graph) {
|
|
46
|
+
const chartYaml = chartFiles.find((f) => /(^|\/)Chart\.ya?ml$/.test(f.path.replace(/\\/g, '/')));
|
|
47
|
+
if (!chartYaml)
|
|
48
|
+
return;
|
|
49
|
+
let meta = {};
|
|
50
|
+
try {
|
|
51
|
+
const docs = parseAllDocuments(chartYaml.content);
|
|
52
|
+
meta = (docs[0]?.toJS() ?? {});
|
|
53
|
+
}
|
|
54
|
+
catch { /* tolerate */ }
|
|
55
|
+
const chartName = typeof meta.name === 'string' ? meta.name : posixPath.basename(root);
|
|
56
|
+
const chartAddr = `chart.${chartName}`;
|
|
57
|
+
const module = {
|
|
58
|
+
address: chartAddr, type: 'chart', filePath: chartYaml.path, language: 'Helm', members: [],
|
|
59
|
+
};
|
|
60
|
+
graph.modules.push(module);
|
|
61
|
+
graph.resources.push({
|
|
62
|
+
address: chartAddr, type: 'chart', kind: 'module', filePath: chartYaml.path,
|
|
63
|
+
startLine: 1, signature: `chart: ${chartName}`, language: 'Helm',
|
|
64
|
+
});
|
|
65
|
+
// Subchart dependencies.
|
|
66
|
+
const deps = Array.isArray(meta.dependencies) ? meta.dependencies : [];
|
|
67
|
+
for (const dep of deps) {
|
|
68
|
+
const depName = typeof dep.name === 'string' ? dep.name : undefined;
|
|
69
|
+
if (!depName)
|
|
70
|
+
continue;
|
|
71
|
+
const alias = typeof dep.alias === 'string' ? dep.alias : depName;
|
|
72
|
+
const depAddr = `chart.${alias}`;
|
|
73
|
+
const vendored = allChartRoots.some((r) => r === posixPath.normalize(`${root}/charts/${depName}`));
|
|
74
|
+
if (!graph.resources.some((r) => r.address === depAddr)) {
|
|
75
|
+
graph.resources.push({
|
|
76
|
+
address: depAddr, type: 'chart', kind: 'module', filePath: chartYaml.path,
|
|
77
|
+
startLine: 1, isExternal: vendored ? undefined : true,
|
|
78
|
+
signature: `subchart: ${alias}`, language: 'Helm',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
graph.references.push({ fromAddress: chartAddr, toAddress: depAddr, kind: 'depends_on' });
|
|
82
|
+
module.members.push(depAddr);
|
|
83
|
+
}
|
|
84
|
+
// values.yaml → flattened dot-path set (for .Values.x resolution below).
|
|
85
|
+
const valuesFile = chartFiles.find((f) => /(^|\/)values\.ya?ml$/.test(f.path.replace(/\\/g, '/')));
|
|
86
|
+
const valuePaths = new Set();
|
|
87
|
+
if (valuesFile) {
|
|
88
|
+
try {
|
|
89
|
+
const v = (parseAllDocuments(valuesFile.content)[0]?.toJS() ?? {});
|
|
90
|
+
flattenKeys(v, '', valuePaths);
|
|
91
|
+
}
|
|
92
|
+
catch { /* tolerate malformed values */ }
|
|
93
|
+
}
|
|
94
|
+
const valuesFilePath = valuesFile?.path ?? chartYaml.path;
|
|
95
|
+
const ensureValueNode = (path) => {
|
|
96
|
+
const addr = `${chartName}:values:${path}`;
|
|
97
|
+
if (!graph.resources.some((r) => r.address === addr)) {
|
|
98
|
+
graph.resources.push({
|
|
99
|
+
address: addr, type: 'value', kind: 'value', filePath: valuesFilePath,
|
|
100
|
+
startLine: 1, signature: `.Values.${path}`, language: 'Helm',
|
|
101
|
+
});
|
|
102
|
+
module.members.push(addr);
|
|
103
|
+
}
|
|
104
|
+
return addr;
|
|
105
|
+
};
|
|
106
|
+
/** Resolve a referenced `.Values` path to the longest declared prefix, or null. */
|
|
107
|
+
const resolveValuePath = (path) => {
|
|
108
|
+
const parts = path.split('.');
|
|
109
|
+
for (let i = parts.length; i > 0; i--) {
|
|
110
|
+
const prefix = parts.slice(0, i).join('.');
|
|
111
|
+
if (valuePaths.has(prefix))
|
|
112
|
+
return prefix;
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
};
|
|
116
|
+
// Named templates (define) and includes across templates/_helpers.
|
|
117
|
+
for (const f of chartFiles) {
|
|
118
|
+
const rel = posixPath.relative(root, posixPath.normalize(f.path.replace(/\\/g, '/')));
|
|
119
|
+
if (!/(^|\/)templates\//.test(f.path.replace(/\\/g, '/')))
|
|
120
|
+
continue;
|
|
121
|
+
// define "NAME"
|
|
122
|
+
for (const m of f.content.matchAll(/\{\{-?\s*define\s+"([^"]+)"/g)) {
|
|
123
|
+
const defAddr = `${chartName}:define:${m[1]}`;
|
|
124
|
+
if (!graph.resources.some((r) => r.address === defAddr)) {
|
|
125
|
+
graph.resources.push({
|
|
126
|
+
address: defAddr, type: 'template', kind: 'value', filePath: f.path,
|
|
127
|
+
startLine: lineOfIndex(f.content, m.index ?? 0),
|
|
128
|
+
signature: `define "${m[1]}"`, language: 'Helm',
|
|
129
|
+
});
|
|
130
|
+
module.members.push(defAddr);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// template-file anchor node (source of include edges + best-effort manifests).
|
|
134
|
+
const anchorAddr = `${chartName}:tpl:${rel}`;
|
|
135
|
+
graph.resources.push({
|
|
136
|
+
address: anchorAddr, type: 'template', kind: 'manifest', filePath: f.path,
|
|
137
|
+
startLine: 1, signature: `template: ${rel}`, language: 'Helm',
|
|
138
|
+
});
|
|
139
|
+
module.members.push(anchorAddr);
|
|
140
|
+
// include "NAME" / template "NAME" → reference to the define node.
|
|
141
|
+
const seen = new Set();
|
|
142
|
+
for (const m of f.content.matchAll(/\{\{-?\s*(?:include|template)\s+"([^"]+)"/g)) {
|
|
143
|
+
const defAddr = `${chartName}:define:${m[1]}`;
|
|
144
|
+
if (seen.has(defAddr))
|
|
145
|
+
continue;
|
|
146
|
+
seen.add(defAddr);
|
|
147
|
+
graph.references.push({ fromAddress: anchorAddr, toAddress: defAddr, kind: 'references' });
|
|
148
|
+
}
|
|
149
|
+
// .Values.x references → values.yaml key nodes (longest declared prefix).
|
|
150
|
+
const seenValues = new Set();
|
|
151
|
+
for (const m of f.content.matchAll(/\.Values\.([A-Za-z_][\w.]*)/g)) {
|
|
152
|
+
const resolved = resolveValuePath(m[1].replace(/\.$/, ''));
|
|
153
|
+
if (!resolved || seenValues.has(resolved))
|
|
154
|
+
continue;
|
|
155
|
+
seenValues.add(resolved);
|
|
156
|
+
const valAddr = ensureValueNode(resolved);
|
|
157
|
+
graph.references.push({ fromAddress: anchorAddr, toAddress: valAddr, kind: 'references' });
|
|
158
|
+
}
|
|
159
|
+
// Best-effort manifest extraction (tolerant masked parse).
|
|
160
|
+
extractTemplateManifests(f, chartName, module, graph);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function extractTemplateManifests(f, chartName, module, graph) {
|
|
164
|
+
const masked = maskHelm(f.content);
|
|
165
|
+
let docs;
|
|
166
|
+
try {
|
|
167
|
+
docs = parseAllDocuments(masked);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
for (const doc of docs) {
|
|
173
|
+
let obj = null;
|
|
174
|
+
try {
|
|
175
|
+
obj = doc.toJS();
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (!obj || typeof obj !== 'object')
|
|
181
|
+
continue;
|
|
182
|
+
const kind = typeof obj.kind === 'string' ? obj.kind : '';
|
|
183
|
+
const meta = (obj.metadata ?? {});
|
|
184
|
+
const name = typeof meta.name === 'string' ? meta.name : '';
|
|
185
|
+
if (!kind || !name)
|
|
186
|
+
continue;
|
|
187
|
+
const addr = `${chartName}:${kind}/${name}`;
|
|
188
|
+
if (graph.resources.some((r) => r.address === addr))
|
|
189
|
+
continue;
|
|
190
|
+
graph.resources.push({
|
|
191
|
+
address: addr, type: kind, kind: 'manifest', filePath: f.path,
|
|
192
|
+
startLine: 1, signature: `${kind}/${name} (templated)`, language: 'Helm',
|
|
193
|
+
});
|
|
194
|
+
module.members.push(addr);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** Mask Go-template directives so the YAML structure parses (never executed). */
|
|
198
|
+
function maskHelm(content) {
|
|
199
|
+
return content
|
|
200
|
+
.split('\n')
|
|
201
|
+
.map((line) => {
|
|
202
|
+
const trimmed = line.trim();
|
|
203
|
+
// Drop whole-line control directives ({{ if }}, {{ end }}, {{- range }}, …).
|
|
204
|
+
if (/^\{\{-?.*-?\}\}$/.test(trimmed) && /\b(if|else|end|range|with|define|template|include|toYaml|nindent)\b/.test(trimmed)) {
|
|
205
|
+
return '';
|
|
206
|
+
}
|
|
207
|
+
// Replace inline expressions with a placeholder scalar.
|
|
208
|
+
return line.replace(/\{\{-?[\s\S]*?-?\}\}/g, 'helmval');
|
|
209
|
+
})
|
|
210
|
+
.join('\n');
|
|
211
|
+
}
|
|
212
|
+
/** Flatten a values object into dot-path keys (every node and leaf). */
|
|
213
|
+
function flattenKeys(obj, prefix, out) {
|
|
214
|
+
if (!obj || typeof obj !== 'object' || Array.isArray(obj))
|
|
215
|
+
return;
|
|
216
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
217
|
+
const path = prefix ? `${prefix}.${k}` : k;
|
|
218
|
+
out.add(path);
|
|
219
|
+
flattenKeys(v, path, out);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
function lineOfIndex(content, index) {
|
|
223
|
+
let n = 1;
|
|
224
|
+
for (let i = 0; i < index && i < content.length; i++)
|
|
225
|
+
if (content[i] === '\n')
|
|
226
|
+
n++;
|
|
227
|
+
return n;
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=helm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm.js","sourceRoot":"","sources":["../../../../src/core/analyzer/iac/helm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IaC graph builder (spec-07).
|
|
3
|
+
*
|
|
4
|
+
* Dispatches files by language to the per-ecosystem parsers, merges their
|
|
5
|
+
* normalized resource graphs, and projects the result onto the existing
|
|
6
|
+
* FunctionNode/CallEdge/ClassNode primitives. Kept thin on purpose: all
|
|
7
|
+
* parsing lives in the sibling ecosystem modules, mirroring src/core/scip/.
|
|
8
|
+
*/
|
|
9
|
+
import { type ProjectedIac } from './project.js';
|
|
10
|
+
import { type IacGraph } from './types.js';
|
|
11
|
+
export { isIacLanguage, IAC_LANGUAGES } from './types.js';
|
|
12
|
+
export { classifyYaml } from './classify-yaml.js';
|
|
13
|
+
export type { ProjectedIac } from './project.js';
|
|
14
|
+
interface InFile {
|
|
15
|
+
path: string;
|
|
16
|
+
content: string;
|
|
17
|
+
language: string;
|
|
18
|
+
}
|
|
19
|
+
/** Build the normalized IaC graph from a mixed file set (no projection). */
|
|
20
|
+
export declare function buildIacGraph(files: InFile[]): IacGraph;
|
|
21
|
+
/** Build and project the IaC graph onto existing graph primitives. */
|
|
22
|
+
export declare function buildProjectedIac(files: InFile[]): ProjectedIac;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/iac/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,UAAU,MAAM;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAEpE,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAgBvD;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAE/D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IaC graph builder (spec-07).
|
|
3
|
+
*
|
|
4
|
+
* Dispatches files by language to the per-ecosystem parsers, merges their
|
|
5
|
+
* normalized resource graphs, and projects the result onto the existing
|
|
6
|
+
* FunctionNode/CallEdge/ClassNode primitives. Kept thin on purpose: all
|
|
7
|
+
* parsing lives in the sibling ecosystem modules, mirroring src/core/scip/.
|
|
8
|
+
*/
|
|
9
|
+
import { extractTerraform } from './terraform.js';
|
|
10
|
+
import { extractKubernetes } from './kubernetes.js';
|
|
11
|
+
import { extractHelm } from './helm.js';
|
|
12
|
+
import { extractCloudFormation } from './cloudformation.js';
|
|
13
|
+
import { extractAnsible } from './ansible.js';
|
|
14
|
+
import { extractPulumi } from './pulumi.js';
|
|
15
|
+
import { extractCdk } from './cdk.js';
|
|
16
|
+
import { projectIacGraph } from './project.js';
|
|
17
|
+
import { mergeIacGraphs } from './types.js';
|
|
18
|
+
export { isIacLanguage, IAC_LANGUAGES } from './types.js';
|
|
19
|
+
export { classifyYaml } from './classify-yaml.js';
|
|
20
|
+
/** Build the normalized IaC graph from a mixed file set (no projection). */
|
|
21
|
+
export function buildIacGraph(files) {
|
|
22
|
+
const byLang = (lang) => files.filter((f) => f.language === lang);
|
|
23
|
+
const generalPurpose = files.filter((f) => f.language === 'TypeScript' || f.language === 'JavaScript' || f.language === 'Python' || f.language === 'Go');
|
|
24
|
+
const graphs = [
|
|
25
|
+
extractTerraform(byLang('Terraform')),
|
|
26
|
+
extractKubernetes(byLang('Kubernetes')),
|
|
27
|
+
extractHelm(byLang('Helm')),
|
|
28
|
+
extractCloudFormation(byLang('CloudFormation')),
|
|
29
|
+
extractAnsible(byLang('Ansible')),
|
|
30
|
+
// Pulumi, CDK, and CDKTF ride on existing general-purpose languages, not an IaC tag.
|
|
31
|
+
extractPulumi(generalPurpose),
|
|
32
|
+
extractCdk(generalPurpose),
|
|
33
|
+
];
|
|
34
|
+
return mergeIacGraphs(graphs);
|
|
35
|
+
}
|
|
36
|
+
/** Build and project the IaC graph onto existing graph primitives. */
|
|
37
|
+
export function buildProjectedIac(files) {
|
|
38
|
+
return projectIacGraph(buildIacGraph(files));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/analyzer/iac/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,eAAe,EAAqB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,KAAe;IAC3C,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CACpH,CAAC;IACF,MAAM,MAAM,GAAe;QACzB,gBAAgB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACvC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,qBAAqB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/C,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,qFAAqF;QACrF,aAAa,CAAC,cAAc,CAAC;QAC7B,UAAU,CAAC,cAAc,CAAC;KAC3B,CAAC;IACF,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,iBAAiB,CAAC,KAAe;IAC/C,OAAO,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes manifest extraction (spec-07).
|
|
3
|
+
*
|
|
4
|
+
* One node per YAML document (`---`-separated). Edges follow the typed
|
|
5
|
+
* references that operators reason about: label selectors, *KeyRef / envFrom,
|
|
6
|
+
* volume refs, serviceName, ownerReferences, Ingress→Service, serviceAccount.
|
|
7
|
+
* Unknown kinds (CRDs) still become nodes — only unresolved edges are dropped.
|
|
8
|
+
*/
|
|
9
|
+
import type { IacGraph } from './types.js';
|
|
10
|
+
export declare function extractKubernetes(files: Array<{
|
|
11
|
+
path: string;
|
|
12
|
+
content: string;
|
|
13
|
+
}>): IacGraph;
|
|
14
|
+
//# sourceMappingURL=kubernetes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes.d.ts","sourceRoot":"","sources":["../../../../src/core/analyzer/iac/kubernetes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAA6B,MAAM,YAAY,CAAC;AAkBtE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,QAAQ,CAgDV"}
|