@colbymchenry/codegraph-win32-arm64 1.2.0 → 1.3.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.
- package/lib/dist/bin/codegraph.d.ts +1 -1
- package/lib/dist/bin/codegraph.d.ts.map +1 -1
- package/lib/dist/bin/codegraph.js +232 -61
- package/lib/dist/bin/codegraph.js.map +1 -1
- package/lib/dist/bin/command-supervision.d.ts.map +1 -1
- package/lib/dist/bin/command-supervision.js +4 -1
- package/lib/dist/bin/command-supervision.js.map +1 -1
- package/lib/dist/db/migrations.d.ts +1 -1
- package/lib/dist/db/migrations.d.ts.map +1 -1
- package/lib/dist/db/migrations.js +19 -1
- package/lib/dist/db/migrations.js.map +1 -1
- package/lib/dist/db/queries.d.ts +51 -0
- package/lib/dist/db/queries.d.ts.map +1 -1
- package/lib/dist/db/queries.js +141 -0
- package/lib/dist/db/queries.js.map +1 -1
- package/lib/dist/db/schema.sql +19 -0
- package/lib/dist/directory.d.ts +9 -5
- package/lib/dist/directory.d.ts.map +1 -1
- package/lib/dist/directory.js +210 -19
- package/lib/dist/directory.js.map +1 -1
- package/lib/dist/extraction/cfml-extractor.d.ts +107 -0
- package/lib/dist/extraction/cfml-extractor.d.ts.map +1 -0
- package/lib/dist/extraction/cfml-extractor.js +494 -0
- package/lib/dist/extraction/cfml-extractor.js.map +1 -0
- package/lib/dist/extraction/grammars.d.ts +9 -0
- package/lib/dist/extraction/grammars.d.ts.map +1 -1
- package/lib/dist/extraction/grammars.js +115 -3
- package/lib/dist/extraction/grammars.js.map +1 -1
- package/lib/dist/extraction/index.d.ts +46 -1
- package/lib/dist/extraction/index.d.ts.map +1 -1
- package/lib/dist/extraction/index.js +254 -3
- package/lib/dist/extraction/index.js.map +1 -1
- package/lib/dist/extraction/languages/arkts.d.ts +3 -0
- package/lib/dist/extraction/languages/arkts.d.ts.map +1 -0
- package/lib/dist/extraction/languages/arkts.js +127 -0
- package/lib/dist/extraction/languages/arkts.js.map +1 -0
- package/lib/dist/extraction/languages/c-cpp.d.ts +42 -0
- package/lib/dist/extraction/languages/c-cpp.d.ts.map +1 -1
- package/lib/dist/extraction/languages/c-cpp.js +369 -4
- package/lib/dist/extraction/languages/c-cpp.js.map +1 -1
- package/lib/dist/extraction/languages/cfquery.d.ts +12 -0
- package/lib/dist/extraction/languages/cfquery.d.ts.map +1 -0
- package/lib/dist/extraction/languages/cfquery.js +28 -0
- package/lib/dist/extraction/languages/cfquery.js.map +1 -0
- package/lib/dist/extraction/languages/cfscript.d.ts +3 -0
- package/lib/dist/extraction/languages/cfscript.d.ts.map +1 -0
- package/lib/dist/extraction/languages/cfscript.js +73 -0
- package/lib/dist/extraction/languages/cfscript.js.map +1 -0
- package/lib/dist/extraction/languages/cobol.d.ts +33 -0
- package/lib/dist/extraction/languages/cobol.d.ts.map +1 -0
- package/lib/dist/extraction/languages/cobol.js +499 -0
- package/lib/dist/extraction/languages/cobol.js.map +1 -0
- package/lib/dist/extraction/languages/erlang.d.ts +3 -0
- package/lib/dist/extraction/languages/erlang.d.ts.map +1 -0
- package/lib/dist/extraction/languages/erlang.js +350 -0
- package/lib/dist/extraction/languages/erlang.js.map +1 -0
- package/lib/dist/extraction/languages/index.d.ts.map +1 -1
- package/lib/dist/extraction/languages/index.js +18 -0
- package/lib/dist/extraction/languages/index.js.map +1 -1
- package/lib/dist/extraction/languages/nix.d.ts +3 -0
- package/lib/dist/extraction/languages/nix.d.ts.map +1 -0
- package/lib/dist/extraction/languages/nix.js +294 -0
- package/lib/dist/extraction/languages/nix.js.map +1 -0
- package/lib/dist/extraction/languages/solidity.d.ts +3 -0
- package/lib/dist/extraction/languages/solidity.d.ts.map +1 -0
- package/lib/dist/extraction/languages/solidity.js +293 -0
- package/lib/dist/extraction/languages/solidity.js.map +1 -0
- package/lib/dist/extraction/languages/terraform.d.ts +3 -0
- package/lib/dist/extraction/languages/terraform.d.ts.map +1 -0
- package/lib/dist/extraction/languages/terraform.js +641 -0
- package/lib/dist/extraction/languages/terraform.js.map +1 -0
- package/lib/dist/extraction/languages/vbnet.d.ts +11 -0
- package/lib/dist/extraction/languages/vbnet.d.ts.map +1 -0
- package/lib/dist/extraction/languages/vbnet.js +141 -0
- package/lib/dist/extraction/languages/vbnet.js.map +1 -0
- package/lib/dist/extraction/mybatis-extractor.d.ts +30 -10
- package/lib/dist/extraction/mybatis-extractor.d.ts.map +1 -1
- package/lib/dist/extraction/mybatis-extractor.js +140 -38
- package/lib/dist/extraction/mybatis-extractor.js.map +1 -1
- package/lib/dist/extraction/tree-sitter-helpers.d.ts.map +1 -1
- package/lib/dist/extraction/tree-sitter-helpers.js +1 -0
- package/lib/dist/extraction/tree-sitter-helpers.js.map +1 -1
- package/lib/dist/extraction/tree-sitter-types.d.ts +3 -1
- package/lib/dist/extraction/tree-sitter-types.d.ts.map +1 -1
- package/lib/dist/extraction/tree-sitter.d.ts +38 -0
- package/lib/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/lib/dist/extraction/tree-sitter.js +753 -10
- package/lib/dist/extraction/tree-sitter.js.map +1 -1
- package/lib/dist/extraction/wasm/tree-sitter-arkts.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-terraform.wasm +0 -0
- package/lib/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
- package/lib/dist/index.d.ts +63 -1
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +306 -2
- package/lib/dist/index.js.map +1 -1
- package/lib/dist/installer/index.d.ts.map +1 -1
- package/lib/dist/installer/index.js +3 -1
- package/lib/dist/installer/index.js.map +1 -1
- package/lib/dist/mcp/daemon.d.ts +25 -3
- package/lib/dist/mcp/daemon.d.ts.map +1 -1
- package/lib/dist/mcp/daemon.js +39 -7
- package/lib/dist/mcp/daemon.js.map +1 -1
- package/lib/dist/mcp/dynamic-boundaries.d.ts.map +1 -1
- package/lib/dist/mcp/dynamic-boundaries.js +2 -1
- package/lib/dist/mcp/dynamic-boundaries.js.map +1 -1
- package/lib/dist/mcp/early-ppid.d.ts +26 -0
- package/lib/dist/mcp/early-ppid.d.ts.map +1 -0
- package/lib/dist/mcp/early-ppid.js +29 -0
- package/lib/dist/mcp/early-ppid.js.map +1 -0
- package/lib/dist/mcp/index.d.ts.map +1 -1
- package/lib/dist/mcp/index.js +21 -4
- package/lib/dist/mcp/index.js.map +1 -1
- package/lib/dist/mcp/proxy.d.ts.map +1 -1
- package/lib/dist/mcp/proxy.js +21 -3
- package/lib/dist/mcp/proxy.js.map +1 -1
- package/lib/dist/mcp/startup-handshake.d.ts +44 -0
- package/lib/dist/mcp/startup-handshake.d.ts.map +1 -0
- package/lib/dist/mcp/startup-handshake.js +73 -0
- package/lib/dist/mcp/startup-handshake.js.map +1 -0
- package/lib/dist/mcp/tools.d.ts +22 -0
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +74 -9
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/project-config.d.ts +38 -0
- package/lib/dist/project-config.d.ts.map +1 -1
- package/lib/dist/project-config.js +101 -2
- package/lib/dist/project-config.js.map +1 -1
- package/lib/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/lib/dist/resolution/callback-synthesizer.js +672 -0
- package/lib/dist/resolution/callback-synthesizer.js.map +1 -1
- package/lib/dist/resolution/frameworks/cics.d.ts +20 -0
- package/lib/dist/resolution/frameworks/cics.d.ts.map +1 -0
- package/lib/dist/resolution/frameworks/cics.js +90 -0
- package/lib/dist/resolution/frameworks/cics.js.map +1 -0
- package/lib/dist/resolution/frameworks/index.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/index.js +6 -0
- package/lib/dist/resolution/frameworks/index.js.map +1 -1
- package/lib/dist/resolution/frameworks/java.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/java.js +14 -6
- package/lib/dist/resolution/frameworks/java.js.map +1 -1
- package/lib/dist/resolution/frameworks/terraform.d.ts +38 -0
- package/lib/dist/resolution/frameworks/terraform.d.ts.map +1 -0
- package/lib/dist/resolution/frameworks/terraform.js +277 -0
- package/lib/dist/resolution/frameworks/terraform.js.map +1 -0
- package/lib/dist/resolution/import-resolver.d.ts +7 -0
- package/lib/dist/resolution/import-resolver.d.ts.map +1 -1
- package/lib/dist/resolution/import-resolver.js +129 -4
- package/lib/dist/resolution/import-resolver.js.map +1 -1
- package/lib/dist/resolution/index.d.ts +39 -6
- package/lib/dist/resolution/index.d.ts.map +1 -1
- package/lib/dist/resolution/index.js +287 -50
- package/lib/dist/resolution/index.js.map +1 -1
- package/lib/dist/resolution/name-matcher.d.ts +0 -3
- package/lib/dist/resolution/name-matcher.d.ts.map +1 -1
- package/lib/dist/resolution/name-matcher.js +225 -33
- package/lib/dist/resolution/name-matcher.js.map +1 -1
- package/lib/dist/resolution/strip-comments.d.ts +1 -1
- package/lib/dist/resolution/strip-comments.d.ts.map +1 -1
- package/lib/dist/resolution/strip-comments.js +49 -0
- package/lib/dist/resolution/strip-comments.js.map +1 -1
- package/lib/dist/resolution/types.d.ts +20 -0
- package/lib/dist/resolution/types.d.ts.map +1 -1
- package/lib/dist/resolution/workspace-packages.d.ts +10 -0
- package/lib/dist/resolution/workspace-packages.d.ts.map +1 -1
- package/lib/dist/resolution/workspace-packages.js +142 -4
- package/lib/dist/resolution/workspace-packages.js.map +1 -1
- package/lib/dist/search/identifier-segments.d.ts +60 -0
- package/lib/dist/search/identifier-segments.d.ts.map +1 -0
- package/lib/dist/search/identifier-segments.js +176 -0
- package/lib/dist/search/identifier-segments.js.map +1 -0
- package/lib/dist/sync/git-hooks.d.ts.map +1 -1
- package/lib/dist/sync/git-hooks.js +2 -0
- package/lib/dist/sync/git-hooks.js.map +1 -1
- package/lib/dist/sync/watcher.d.ts +10 -5
- package/lib/dist/sync/watcher.d.ts.map +1 -1
- package/lib/dist/sync/watcher.js +51 -14
- package/lib/dist/sync/watcher.js.map +1 -1
- package/lib/dist/sync/worktree.d.ts.map +1 -1
- package/lib/dist/sync/worktree.js +5 -0
- package/lib/dist/sync/worktree.js.map +1 -1
- package/lib/dist/types.d.ts +19 -1
- package/lib/dist/types.d.ts.map +1 -1
- package/lib/dist/types.js +10 -0
- package/lib/dist/types.js.map +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +1 -1
- package/package.json +1 -1
- package/lib/dist/reasoning/config.d.ts +0 -45
- package/lib/dist/reasoning/config.d.ts.map +0 -1
- package/lib/dist/reasoning/config.js +0 -171
- package/lib/dist/reasoning/config.js.map +0 -1
- package/lib/dist/reasoning/credentials.d.ts +0 -5
- package/lib/dist/reasoning/credentials.d.ts.map +0 -1
- package/lib/dist/reasoning/credentials.js +0 -83
- package/lib/dist/reasoning/credentials.js.map +0 -1
- package/lib/dist/reasoning/login.d.ts +0 -21
- package/lib/dist/reasoning/login.d.ts.map +0 -1
- package/lib/dist/reasoning/login.js +0 -85
- package/lib/dist/reasoning/login.js.map +0 -1
- package/lib/dist/reasoning/reasoner.d.ts +0 -43
- package/lib/dist/reasoning/reasoner.d.ts.map +0 -1
- package/lib/dist/reasoning/reasoner.js +0 -308
- package/lib/dist/reasoning/reasoner.js.map +0 -1
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.terraformExtractor = void 0;
|
|
4
|
+
const tree_sitter_helpers_1 = require("../tree-sitter-helpers");
|
|
5
|
+
// Grammar: tree-sitter-terraform (vendored at src/extraction/wasm/tree-sitter-terraform.wasm,
|
|
6
|
+
// built from @tree-sitter-grammars/tree-sitter-hcl, Apache-2.0). The HCL grammar
|
|
7
|
+
// is intentionally generic: ALL Terraform top-level constructs share the same
|
|
8
|
+
// AST node type `block`, distinguished only by the first `identifier` child
|
|
9
|
+
// (the block "type": resource, variable, data, module, output, locals, …).
|
|
10
|
+
// Labels for resources/data/modules/variables come from `string_lit` children
|
|
11
|
+
// AFTER that first identifier.
|
|
12
|
+
//
|
|
13
|
+
// resource "aws_s3_bucket" "my_bucket" { ... }
|
|
14
|
+
// └─ block
|
|
15
|
+
// ├─ identifier ("resource")
|
|
16
|
+
// ├─ string_lit ("aws_s3_bucket") ← type label
|
|
17
|
+
// ├─ string_lit ("my_bucket") ← name label
|
|
18
|
+
// ├─ block_start
|
|
19
|
+
// ├─ body
|
|
20
|
+
// │ ├─ attribute (identifier "bucket" "=" expression)
|
|
21
|
+
// │ └─ block ("tags" { ... }) ← nested block (skipped)
|
|
22
|
+
// └─ block_end
|
|
23
|
+
//
|
|
24
|
+
// References live inside `expression` subtrees: a leading `identifier` followed
|
|
25
|
+
// by zero or more `get_attr` (`.foo`) nodes. We synthesise qualified-name refs
|
|
26
|
+
// matching the node names emitted above (e.g. `var.region` → unresolved ref
|
|
27
|
+
// `var.region`, which the matcher resolves to the `variable "region"` node).
|
|
28
|
+
/** Built-in references that should NOT be resolved to project nodes. */
|
|
29
|
+
const BUILTIN_HEADS = new Set([
|
|
30
|
+
'each', // for_each iterator: each.key / each.value
|
|
31
|
+
'count', // count meta-argument: count.index
|
|
32
|
+
'self', // provisioner connection self.*
|
|
33
|
+
'path', // path.module / path.root / path.cwd
|
|
34
|
+
'terraform', // terraform.workspace
|
|
35
|
+
]);
|
|
36
|
+
/** Bare strings that we never want to treat as references. */
|
|
37
|
+
const BUILTIN_KEYWORDS = new Set(['null', 'true', 'false']);
|
|
38
|
+
/** Read a string_lit value (skipping the quotes / template start/end tokens). */
|
|
39
|
+
function stringLitValue(node, source) {
|
|
40
|
+
const literal = node.namedChildren.find((c) => c?.type === 'template_literal');
|
|
41
|
+
if (literal)
|
|
42
|
+
return (0, tree_sitter_helpers_1.getNodeText)(literal, source);
|
|
43
|
+
// Empty string ("") parses as quoted_template_start + quoted_template_end
|
|
44
|
+
// with no template_literal — return empty.
|
|
45
|
+
return '';
|
|
46
|
+
}
|
|
47
|
+
/** Block "type" and its label values. Returns null if the block is malformed. */
|
|
48
|
+
function readBlockHeader(block, source) {
|
|
49
|
+
const named = block.namedChildren.filter((c) => c !== null);
|
|
50
|
+
const first = named[0];
|
|
51
|
+
if (!first || first.type !== 'identifier')
|
|
52
|
+
return null;
|
|
53
|
+
const type = (0, tree_sitter_helpers_1.getNodeText)(first, source);
|
|
54
|
+
const labels = [];
|
|
55
|
+
for (let i = 1; i < named.length; i++) {
|
|
56
|
+
const child = named[i];
|
|
57
|
+
if (!child)
|
|
58
|
+
continue;
|
|
59
|
+
if (child.type === 'string_lit') {
|
|
60
|
+
labels.push(stringLitValue(child, source));
|
|
61
|
+
}
|
|
62
|
+
else if (child.type === 'identifier') {
|
|
63
|
+
// HCL allows unquoted identifier labels (rare in Terraform but legal).
|
|
64
|
+
labels.push((0, tree_sitter_helpers_1.getNodeText)(child, source));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { type, labels };
|
|
71
|
+
}
|
|
72
|
+
/** Find the `body` child of a block (it's after the labels and block_start). */
|
|
73
|
+
function getBlockBody(block) {
|
|
74
|
+
return block.namedChildren.find((c) => c?.type === 'body') ?? null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Walk an `expression` subtree and emit a reference for every dotted name
|
|
78
|
+
* whose head is a Terraform reference root (var / local / module / data / a
|
|
79
|
+
* resource type name). Skips built-ins.
|
|
80
|
+
*
|
|
81
|
+
* Patterns we recognise:
|
|
82
|
+
* var.X → ref "var.X" (variable "X")
|
|
83
|
+
* local.X → ref "local.X" (locals.X)
|
|
84
|
+
* module.M.O → ref "module.M" (module "M")
|
|
85
|
+
* data.T.N.A → ref "data.T.N" (data "T" "N")
|
|
86
|
+
* T.N[.A] → ref "T.N" (resource "T" "N", e.g. aws_x.y)
|
|
87
|
+
*/
|
|
88
|
+
function collectReferences(expr, source, onRef) {
|
|
89
|
+
// BFS for variable_expr and inspect each. variable_expr's only child is an
|
|
90
|
+
// identifier (the head); its siblings via get_attr / index chains live on
|
|
91
|
+
// the parent _expr_term, so walk the parent chain to collect them.
|
|
92
|
+
const queue = [expr];
|
|
93
|
+
while (queue.length) {
|
|
94
|
+
const n = queue.shift();
|
|
95
|
+
if (n.type === 'variable_expr') {
|
|
96
|
+
emitRefFromVariableExpr(n, source, onRef);
|
|
97
|
+
// Don't recurse into the chain we just read — but DO continue scanning
|
|
98
|
+
// siblings (e.g. function call arguments).
|
|
99
|
+
}
|
|
100
|
+
for (const c of n.namedChildren) {
|
|
101
|
+
if (c)
|
|
102
|
+
queue.push(c);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function emitRefFromVariableExpr(varExpr, source, onRef) {
|
|
107
|
+
const id = varExpr.namedChildren.find((c) => c?.type === 'identifier');
|
|
108
|
+
if (!id)
|
|
109
|
+
return;
|
|
110
|
+
const head = (0, tree_sitter_helpers_1.getNodeText)(id, source);
|
|
111
|
+
if (BUILTIN_HEADS.has(head) || BUILTIN_KEYWORDS.has(head))
|
|
112
|
+
return;
|
|
113
|
+
// Walk get_attr siblings on the parent. The AST shape is roughly:
|
|
114
|
+
// expression > _expr_term (hidden) → variable_expr + get_attr + get_attr + ...
|
|
115
|
+
// tree-sitter exposes _expr_term children flattened on `expression`.
|
|
116
|
+
const attrs = [];
|
|
117
|
+
let cursor = varExpr.nextNamedSibling;
|
|
118
|
+
while (cursor) {
|
|
119
|
+
if (cursor.type === 'get_attr') {
|
|
120
|
+
const attrId = cursor.namedChildren.find((c) => c?.type === 'identifier');
|
|
121
|
+
if (!attrId)
|
|
122
|
+
break;
|
|
123
|
+
attrs.push((0, tree_sitter_helpers_1.getNodeText)(attrId, source));
|
|
124
|
+
cursor = cursor.nextNamedSibling;
|
|
125
|
+
}
|
|
126
|
+
else if (cursor.type === 'index' || cursor.type === 'new_index' || cursor.type === 'legacy_index' || cursor.type === 'splat' || cursor.type === 'attr_splat' || cursor.type === 'full_splat') {
|
|
127
|
+
// foo[0], foo[*], foo.* — keep walking but don't add a segment.
|
|
128
|
+
cursor = cursor.nextNamedSibling;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const line = varExpr.startPosition.row + 1;
|
|
135
|
+
const col = varExpr.startPosition.column;
|
|
136
|
+
for (const qname of qualifyReference(head, attrs))
|
|
137
|
+
onRef(qname, line, col);
|
|
138
|
+
}
|
|
139
|
+
function qualifyReference(head, attrs) {
|
|
140
|
+
switch (head) {
|
|
141
|
+
case 'var':
|
|
142
|
+
// var.X — variable "X"
|
|
143
|
+
return attrs[0] ? [`var.${attrs[0]}`] : [];
|
|
144
|
+
case 'local':
|
|
145
|
+
// local.K — locals attribute K
|
|
146
|
+
return attrs[0] ? [`local.${attrs[0]}`] : [];
|
|
147
|
+
case 'module': {
|
|
148
|
+
// module.M[.OUTPUT] — module "M". A two-segment chain (`module.M.out`)
|
|
149
|
+
// additionally emits a scoped `module.M:output.out` ref that the
|
|
150
|
+
// Terraform resolver bridges to the `output "out"` node inside the
|
|
151
|
+
// module's source directory — the edge that carries impact across the
|
|
152
|
+
// module boundary instead of dead-ending at the declaration. Only the
|
|
153
|
+
// Terraform framework resolver understands the `:`-scoped spelling; if
|
|
154
|
+
// the module's source is a registry/git address the ref simply stays
|
|
155
|
+
// unresolved and the boundary remains visible.
|
|
156
|
+
if (!attrs[0])
|
|
157
|
+
return [];
|
|
158
|
+
const refs = [`module.${attrs[0]}`];
|
|
159
|
+
if (attrs[1])
|
|
160
|
+
refs.push(`module.${attrs[0]}:output.${attrs[1]}`);
|
|
161
|
+
// module.M.outputs.X — the cloudposse/atmos remote-state shape (the
|
|
162
|
+
// remote-state module re-exposes another component's outputs under its
|
|
163
|
+
// `outputs` map). Emit a scoped candidate the resolver bridges to that
|
|
164
|
+
// component's own `output "X"` when the target is provably unique;
|
|
165
|
+
// anything dynamic or ambiguous stays unresolved.
|
|
166
|
+
if (attrs[1] === 'outputs' && attrs[2])
|
|
167
|
+
refs.push(`module.${attrs[0]}:remote-output.${attrs[2]}`);
|
|
168
|
+
return refs;
|
|
169
|
+
}
|
|
170
|
+
case 'data':
|
|
171
|
+
// data.TYPE.NAME[.ATTR] — data "TYPE" "NAME"
|
|
172
|
+
return attrs[0] && attrs[1] ? [`data.${attrs[0]}.${attrs[1]}`] : [];
|
|
173
|
+
default:
|
|
174
|
+
// <type>.<name>[.<attr>...] — managed resource (e.g. aws_s3_bucket.my)
|
|
175
|
+
// Skip plain identifiers with no dotted chain — those are function calls,
|
|
176
|
+
// local-only variables, or template params.
|
|
177
|
+
if (!attrs[0])
|
|
178
|
+
return [];
|
|
179
|
+
return [`${head}.${attrs[0]}`];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
exports.terraformExtractor = {
|
|
183
|
+
// The HCL grammar exposes everything as `block` / `attribute`; the default
|
|
184
|
+
// dispatcher does not know how to read Terraform's first-identifier-as-type
|
|
185
|
+
// convention, so we drive extraction entirely from visitNode below.
|
|
186
|
+
functionTypes: [],
|
|
187
|
+
classTypes: [],
|
|
188
|
+
methodTypes: [],
|
|
189
|
+
interfaceTypes: [],
|
|
190
|
+
structTypes: [],
|
|
191
|
+
enumTypes: [],
|
|
192
|
+
typeAliasTypes: [],
|
|
193
|
+
importTypes: [],
|
|
194
|
+
callTypes: [],
|
|
195
|
+
variableTypes: [],
|
|
196
|
+
nameField: '',
|
|
197
|
+
bodyField: '',
|
|
198
|
+
paramsField: '',
|
|
199
|
+
visitNode: (node, ctx) => {
|
|
200
|
+
if (node.type !== 'block') {
|
|
201
|
+
// .tfvars files carry no blocks — just top-level `name = value`
|
|
202
|
+
// assignments, each of which SETS the root module variable of that
|
|
203
|
+
// name. Reference the variable from the file node so "what sets
|
|
204
|
+
// var.region" is answerable from the graph.
|
|
205
|
+
if (node.type === 'attribute' &&
|
|
206
|
+
ctx.filePath.endsWith('.tfvars') &&
|
|
207
|
+
node.parent?.type === 'body' &&
|
|
208
|
+
node.parent.parent?.type === 'config_file') {
|
|
209
|
+
const idNode = node.namedChildren.find((c) => c?.type === 'identifier');
|
|
210
|
+
const fileNodeId = ctx.nodeStack[0];
|
|
211
|
+
if (idNode && fileNodeId) {
|
|
212
|
+
ctx.addUnresolvedReference({
|
|
213
|
+
fromNodeId: fileNodeId,
|
|
214
|
+
referenceName: `var.${(0, tree_sitter_helpers_1.getNodeText)(idNode, ctx.source)}`,
|
|
215
|
+
referenceKind: 'references',
|
|
216
|
+
line: node.startPosition.row + 1,
|
|
217
|
+
column: node.startPosition.column,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
// Let the default walker descend into bodies/expressions; we only claim
|
|
223
|
+
// top-level blocks.
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
const header = readBlockHeader(node, ctx.source);
|
|
227
|
+
if (!header)
|
|
228
|
+
return false;
|
|
229
|
+
const { type, labels } = header;
|
|
230
|
+
const body = getBlockBody(node);
|
|
231
|
+
// --- locals: every attribute becomes its own constant ---
|
|
232
|
+
if (type === 'locals' && labels.length === 0) {
|
|
233
|
+
emitLocals(body, ctx);
|
|
234
|
+
return true; // we handled everything inside this block
|
|
235
|
+
}
|
|
236
|
+
// --- terraform { ... } settings block — no symbols, no refs to project ---
|
|
237
|
+
if (type === 'terraform' && labels.length === 0) {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
// --- moved / import / removed: state-migration blocks. Their from/to
|
|
241
|
+
// attributes hold resource addresses, so a refactor's paper trail joins
|
|
242
|
+
// the graph ("what references aws_instance.old" includes the moved
|
|
243
|
+
// block's file). No symbol is declared — anchor the refs to the file
|
|
244
|
+
// node. Scoped module refs are suppressed: `module.a.aws_x.b` here names
|
|
245
|
+
// a resource INSIDE a module instance, not a module output.
|
|
246
|
+
if ((type === 'moved' || type === 'import' || type === 'removed') && labels.length === 0) {
|
|
247
|
+
const fileNodeId = ctx.nodeStack[0];
|
|
248
|
+
if (body && fileNodeId) {
|
|
249
|
+
emitReferencesInBody(body, ctx, fileNodeId, { suppressScoped: true });
|
|
250
|
+
}
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
// --- assert { condition = … } (inside check blocks): the condition's
|
|
254
|
+
// references are real dependencies of the check; anchor them to the file
|
|
255
|
+
// node. The check block itself declares no symbol and is left to the
|
|
256
|
+
// default walker, so its nested scoped `data` blocks still index.
|
|
257
|
+
if (type === 'assert' && labels.length === 0) {
|
|
258
|
+
const fileNodeId = ctx.nodeStack[0];
|
|
259
|
+
if (body && fileNodeId) {
|
|
260
|
+
emitReferencesInBody(body, ctx, fileNodeId, { suppressScoped: true });
|
|
261
|
+
}
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
// --- resource / data / module / variable / output / provider ---
|
|
265
|
+
const decl = describeBlock(type, labels);
|
|
266
|
+
if (!decl) {
|
|
267
|
+
// Unknown top-level block (e.g. nested block hoisted as top-level via
|
|
268
|
+
// walker). Let the default walker continue.
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
// provider "aws" { alias = "east" } is addressed as `aws.east`; carry the
|
|
272
|
+
// alias in the node so aliased and default configurations of the same
|
|
273
|
+
// provider stop colliding on one qualified name.
|
|
274
|
+
if (type === 'provider' && body && labels[0]) {
|
|
275
|
+
const alias = readStringAttr(body, 'alias', ctx.source);
|
|
276
|
+
if (alias) {
|
|
277
|
+
decl.name = `${labels[0]}.${alias}`;
|
|
278
|
+
decl.qualifiedName = `provider.${labels[0]}.${alias}`;
|
|
279
|
+
decl.signature = `provider "${labels[0]}" alias="${alias}"`;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const created = ctx.createNode(decl.kind, decl.name, node, {
|
|
283
|
+
qualifiedName: decl.qualifiedName,
|
|
284
|
+
signature: decl.signature,
|
|
285
|
+
isExported: decl.kind === 'variable',
|
|
286
|
+
});
|
|
287
|
+
if (!created)
|
|
288
|
+
return true;
|
|
289
|
+
// Collect references inside this block's body (attribute expressions).
|
|
290
|
+
if (body) {
|
|
291
|
+
ctx.pushScope(created.id);
|
|
292
|
+
try {
|
|
293
|
+
// The `provider` / `providers` meta-arguments select a provider
|
|
294
|
+
// CONFIGURATION (`aws.east`), which the generic expression walk would
|
|
295
|
+
// misread as a resource reference — handle them explicitly and skip
|
|
296
|
+
// them in the walk.
|
|
297
|
+
const skipTopAttrs = new Set();
|
|
298
|
+
if (type === 'resource' || type === 'data') {
|
|
299
|
+
emitProviderSelectionRef(body, ctx, created.id);
|
|
300
|
+
skipTopAttrs.add('provider');
|
|
301
|
+
}
|
|
302
|
+
if (type === 'module') {
|
|
303
|
+
emitModuleProvidersRefs(body, ctx, created.id);
|
|
304
|
+
skipTopAttrs.add('providers');
|
|
305
|
+
}
|
|
306
|
+
emitReferencesInBody(body, ctx, created.id, { skipTopAttrs });
|
|
307
|
+
if (type === 'module' && labels[0]) {
|
|
308
|
+
emitModuleWiring(labels[0], node, body, ctx, created.id);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
finally {
|
|
312
|
+
ctx.popScope();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return true;
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* Module meta-arguments — attributes of a `module` block that configure the
|
|
320
|
+
* call itself rather than set one of the child module's input variables.
|
|
321
|
+
*/
|
|
322
|
+
const MODULE_META_ARGS = new Set(['source', 'version', 'count', 'for_each', 'providers', 'depends_on']);
|
|
323
|
+
/**
|
|
324
|
+
* Bridge a `module "M" { ... }` block across the module boundary with
|
|
325
|
+
* `:`-scoped references that only the Terraform framework resolver
|
|
326
|
+
* understands (a plain qualified name would let the generic matcher bind
|
|
327
|
+
* them to a same-named symbol in an unrelated module — a wrong edge is
|
|
328
|
+
* worse than none):
|
|
329
|
+
*
|
|
330
|
+
* - `module.M:file` (imports) → the module source directory's
|
|
331
|
+
* entry file, when `source` is a local `./`/`../` path. Registry and
|
|
332
|
+
* git sources emit nothing — an out-of-repo module stays a visible
|
|
333
|
+
* boundary instead of a guessed edge.
|
|
334
|
+
* - `module.M:var.<in>` (references) → the child module's
|
|
335
|
+
* `variable "<in>"` node, one per input attribute. This is what lets
|
|
336
|
+
* "what depends on modules/vpc's var.cidr" reach the callers.
|
|
337
|
+
*/
|
|
338
|
+
function emitModuleWiring(moduleName, block, body, ctx, fromNodeId) {
|
|
339
|
+
for (const attr of body.namedChildren) {
|
|
340
|
+
if (!attr || attr.type !== 'attribute')
|
|
341
|
+
continue;
|
|
342
|
+
const idNode = attr.namedChildren.find((c) => c?.type === 'identifier');
|
|
343
|
+
if (!idNode)
|
|
344
|
+
continue;
|
|
345
|
+
const attrName = (0, tree_sitter_helpers_1.getNodeText)(idNode, ctx.source);
|
|
346
|
+
if (attrName === 'source') {
|
|
347
|
+
const expr = attr.namedChildren.find((c) => c?.type === 'expression');
|
|
348
|
+
const lit = expr ? findStringLit(expr) : null;
|
|
349
|
+
const source = lit ? stringLitValue(lit, ctx.source) : '';
|
|
350
|
+
if (source.startsWith('./') || source.startsWith('../')) {
|
|
351
|
+
ctx.addUnresolvedReference({
|
|
352
|
+
fromNodeId,
|
|
353
|
+
referenceName: `module.${moduleName}:file`,
|
|
354
|
+
referenceKind: 'imports',
|
|
355
|
+
line: block.startPosition.row + 1,
|
|
356
|
+
column: block.startPosition.column,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
if (MODULE_META_ARGS.has(attrName))
|
|
362
|
+
continue;
|
|
363
|
+
ctx.addUnresolvedReference({
|
|
364
|
+
fromNodeId,
|
|
365
|
+
referenceName: `module.${moduleName}:var.${attrName}`,
|
|
366
|
+
referenceKind: 'references',
|
|
367
|
+
line: attr.startPosition.row + 1,
|
|
368
|
+
column: attr.startPosition.column,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/** First string_lit anywhere under an expression (source = "./modules/x"). */
|
|
373
|
+
function findStringLit(expr) {
|
|
374
|
+
const queue = [expr];
|
|
375
|
+
while (queue.length) {
|
|
376
|
+
const n = queue.shift();
|
|
377
|
+
if (n.type === 'string_lit')
|
|
378
|
+
return n;
|
|
379
|
+
for (const c of n.namedChildren) {
|
|
380
|
+
if (c)
|
|
381
|
+
queue.push(c);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
function describeBlock(type, labels) {
|
|
387
|
+
const [first, second] = labels;
|
|
388
|
+
switch (type) {
|
|
389
|
+
case 'resource': {
|
|
390
|
+
if (!first || !second)
|
|
391
|
+
return null;
|
|
392
|
+
return {
|
|
393
|
+
kind: 'class',
|
|
394
|
+
name: `${first}.${second}`,
|
|
395
|
+
qualifiedName: `${first}.${second}`,
|
|
396
|
+
signature: `resource "${first}" "${second}"`,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
case 'data': {
|
|
400
|
+
if (!first || !second)
|
|
401
|
+
return null;
|
|
402
|
+
return {
|
|
403
|
+
kind: 'class',
|
|
404
|
+
name: `${first}.${second}`,
|
|
405
|
+
qualifiedName: `data.${first}.${second}`,
|
|
406
|
+
signature: `data "${first}" "${second}"`,
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
case 'module': {
|
|
410
|
+
if (!first)
|
|
411
|
+
return null;
|
|
412
|
+
return {
|
|
413
|
+
kind: 'module',
|
|
414
|
+
name: first,
|
|
415
|
+
qualifiedName: `module.${first}`,
|
|
416
|
+
signature: `module "${first}"`,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
case 'variable': {
|
|
420
|
+
if (!first)
|
|
421
|
+
return null;
|
|
422
|
+
return {
|
|
423
|
+
kind: 'variable',
|
|
424
|
+
name: first,
|
|
425
|
+
qualifiedName: `var.${first}`,
|
|
426
|
+
signature: `variable "${first}"`,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
case 'output': {
|
|
430
|
+
if (!first)
|
|
431
|
+
return null;
|
|
432
|
+
return {
|
|
433
|
+
kind: 'variable',
|
|
434
|
+
name: first,
|
|
435
|
+
qualifiedName: `output.${first}`,
|
|
436
|
+
signature: `output "${first}"`,
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
case 'provider': {
|
|
440
|
+
if (!first)
|
|
441
|
+
return null;
|
|
442
|
+
return {
|
|
443
|
+
kind: 'namespace',
|
|
444
|
+
name: first,
|
|
445
|
+
qualifiedName: `provider.${first}`,
|
|
446
|
+
signature: `provider "${first}"`,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
default:
|
|
450
|
+
return null;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
function emitLocals(body, ctx) {
|
|
454
|
+
if (!body)
|
|
455
|
+
return;
|
|
456
|
+
for (const attr of body.namedChildren) {
|
|
457
|
+
if (!attr || attr.type !== 'attribute')
|
|
458
|
+
continue;
|
|
459
|
+
const idNode = attr.namedChildren.find((c) => c?.type === 'identifier');
|
|
460
|
+
if (!idNode)
|
|
461
|
+
continue;
|
|
462
|
+
const name = (0, tree_sitter_helpers_1.getNodeText)(idNode, ctx.source);
|
|
463
|
+
const created = ctx.createNode('constant', name, attr, {
|
|
464
|
+
qualifiedName: `local.${name}`,
|
|
465
|
+
signature: `local.${name}`,
|
|
466
|
+
});
|
|
467
|
+
if (!created)
|
|
468
|
+
continue;
|
|
469
|
+
const expr = attr.namedChildren.find((c) => c?.type === 'expression');
|
|
470
|
+
if (expr) {
|
|
471
|
+
ctx.pushScope(created.id);
|
|
472
|
+
try {
|
|
473
|
+
collectReferences(expr, ctx.source, (qname, line, column) => {
|
|
474
|
+
ctx.addUnresolvedReference({
|
|
475
|
+
fromNodeId: created.id,
|
|
476
|
+
referenceName: qname,
|
|
477
|
+
referenceKind: 'references',
|
|
478
|
+
line,
|
|
479
|
+
column,
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
finally {
|
|
484
|
+
ctx.popScope();
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
function emitReferencesInBody(body, ctx, fromNodeId, opts) {
|
|
490
|
+
const queue = [];
|
|
491
|
+
for (const c of body.namedChildren) {
|
|
492
|
+
if (!c)
|
|
493
|
+
continue;
|
|
494
|
+
if (opts?.skipTopAttrs && c.type === 'attribute') {
|
|
495
|
+
const id = c.namedChildren.find((x) => x?.type === 'identifier');
|
|
496
|
+
if (id && opts.skipTopAttrs.has((0, tree_sitter_helpers_1.getNodeText)(id, ctx.source)))
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
queue.push(c);
|
|
500
|
+
}
|
|
501
|
+
while (queue.length) {
|
|
502
|
+
const n = queue.shift();
|
|
503
|
+
if (n.type === 'expression') {
|
|
504
|
+
collectReferences(n, ctx.source, (qname, line, column) => {
|
|
505
|
+
if (opts?.suppressScoped && qname.includes(':'))
|
|
506
|
+
return;
|
|
507
|
+
ctx.addUnresolvedReference({
|
|
508
|
+
fromNodeId,
|
|
509
|
+
referenceName: qname,
|
|
510
|
+
referenceKind: 'references',
|
|
511
|
+
line,
|
|
512
|
+
column,
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
// Don't descend into expression — collectReferences already does.
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
518
|
+
for (const c of n.namedChildren) {
|
|
519
|
+
if (c)
|
|
520
|
+
queue.push(c);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Value of a direct string attribute of a body (`alias = "east"`), or null.
|
|
526
|
+
*/
|
|
527
|
+
function readStringAttr(body, name, source) {
|
|
528
|
+
for (const attr of body.namedChildren) {
|
|
529
|
+
if (!attr || attr.type !== 'attribute')
|
|
530
|
+
continue;
|
|
531
|
+
const idNode = attr.namedChildren.find((c) => c?.type === 'identifier');
|
|
532
|
+
if (!idNode || (0, tree_sitter_helpers_1.getNodeText)(idNode, source) !== name)
|
|
533
|
+
continue;
|
|
534
|
+
const expr = attr.namedChildren.find((c) => c?.type === 'expression');
|
|
535
|
+
const lit = expr ? findStringLit(expr) : null;
|
|
536
|
+
return lit ? stringLitValue(lit, source) : null;
|
|
537
|
+
}
|
|
538
|
+
return null;
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* `provider = aws.east` (or bare `provider = google-beta`) in a resource/data
|
|
542
|
+
* block selects a provider CONFIGURATION — reference `provider.aws.east` /
|
|
543
|
+
* `provider.google-beta` so the selection links to the aliased provider block
|
|
544
|
+
* instead of being misread as a resource named `aws.east`.
|
|
545
|
+
*/
|
|
546
|
+
function emitProviderSelectionRef(body, ctx, fromNodeId) {
|
|
547
|
+
for (const attr of body.namedChildren) {
|
|
548
|
+
if (!attr || attr.type !== 'attribute')
|
|
549
|
+
continue;
|
|
550
|
+
const idNode = attr.namedChildren.find((c) => c?.type === 'identifier');
|
|
551
|
+
if (!idNode || (0, tree_sitter_helpers_1.getNodeText)(idNode, ctx.source) !== 'provider')
|
|
552
|
+
continue;
|
|
553
|
+
const expr = attr.namedChildren.find((c) => c?.type === 'expression');
|
|
554
|
+
if (!expr)
|
|
555
|
+
return;
|
|
556
|
+
const sel = providerSelectionFromExpr(expr, ctx.source);
|
|
557
|
+
if (sel) {
|
|
558
|
+
ctx.addUnresolvedReference({
|
|
559
|
+
fromNodeId,
|
|
560
|
+
referenceName: `provider.${sel}`,
|
|
561
|
+
referenceKind: 'references',
|
|
562
|
+
line: attr.startPosition.row + 1,
|
|
563
|
+
column: attr.startPosition.column,
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* `providers = { aws = aws.east, aws.dns = aws.dns }` in a module block maps
|
|
571
|
+
* the child's provider slots (keys) to THIS scope's provider configurations
|
|
572
|
+
* (values) — reference each value.
|
|
573
|
+
*/
|
|
574
|
+
function emitModuleProvidersRefs(body, ctx, fromNodeId) {
|
|
575
|
+
for (const attr of body.namedChildren) {
|
|
576
|
+
if (!attr || attr.type !== 'attribute')
|
|
577
|
+
continue;
|
|
578
|
+
const idNode = attr.namedChildren.find((c) => c?.type === 'identifier');
|
|
579
|
+
if (!idNode || (0, tree_sitter_helpers_1.getNodeText)(idNode, ctx.source) !== 'providers')
|
|
580
|
+
continue;
|
|
581
|
+
// Find every object_elem and read its `val` side only — the key names the
|
|
582
|
+
// CHILD module's provider requirement, not a configuration here.
|
|
583
|
+
const queue = [attr];
|
|
584
|
+
while (queue.length) {
|
|
585
|
+
const n = queue.shift();
|
|
586
|
+
if (n.type === 'object_elem') {
|
|
587
|
+
const val = (0, tree_sitter_helpers_1.getChildByField)(n, 'val');
|
|
588
|
+
const sel = val ? providerSelectionFromExpr(val, ctx.source) : null;
|
|
589
|
+
if (sel) {
|
|
590
|
+
ctx.addUnresolvedReference({
|
|
591
|
+
fromNodeId,
|
|
592
|
+
referenceName: `provider.${sel}`,
|
|
593
|
+
referenceKind: 'references',
|
|
594
|
+
line: n.startPosition.row + 1,
|
|
595
|
+
column: n.startPosition.column,
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
continue;
|
|
599
|
+
}
|
|
600
|
+
for (const c of n.namedChildren) {
|
|
601
|
+
if (c)
|
|
602
|
+
queue.push(c);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Read a provider-configuration address (`aws`, `aws.east`, `google-beta`)
|
|
610
|
+
* from an expression. Anything more complex (conditionals, lookups) is
|
|
611
|
+
* dynamic — return null and leave it unresolved.
|
|
612
|
+
*/
|
|
613
|
+
function providerSelectionFromExpr(expr, source) {
|
|
614
|
+
const queue = [expr];
|
|
615
|
+
while (queue.length) {
|
|
616
|
+
const n = queue.shift();
|
|
617
|
+
if (n.type === 'variable_expr') {
|
|
618
|
+
const id = n.namedChildren.find((c) => c?.type === 'identifier');
|
|
619
|
+
if (!id)
|
|
620
|
+
return null;
|
|
621
|
+
const head = (0, tree_sitter_helpers_1.getNodeText)(id, source);
|
|
622
|
+
const next = n.nextNamedSibling;
|
|
623
|
+
if (next?.type === 'get_attr') {
|
|
624
|
+
const attrId = next.namedChildren.find((c) => c?.type === 'identifier');
|
|
625
|
+
// A second segment means something dynamic (e.g. var.x.y) — bail.
|
|
626
|
+
if (!attrId || next.nextNamedSibling)
|
|
627
|
+
return null;
|
|
628
|
+
return `${head}.${(0, tree_sitter_helpers_1.getNodeText)(attrId, source)}`;
|
|
629
|
+
}
|
|
630
|
+
return next ? null : head;
|
|
631
|
+
}
|
|
632
|
+
if (n.type === 'function_call' || n.type === 'conditional' || n.type === 'for_expr')
|
|
633
|
+
return null;
|
|
634
|
+
for (const c of n.namedChildren) {
|
|
635
|
+
if (c)
|
|
636
|
+
queue.push(c);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
//# sourceMappingURL=terraform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../../src/extraction/languages/terraform.ts"],"names":[],"mappings":"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"}
|