@aetherwing/fcp-terraform 0.1.1 → 0.1.2
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/dist/model.js +4 -0
- package/dist/ops.js +12 -1
- package/dist/verbs.js +4 -1
- package/package.json +1 -1
package/dist/model.js
CHANGED
|
@@ -165,6 +165,10 @@ export function removeConnection(config, id) {
|
|
|
165
165
|
* When forceString is true, skip number/bool detection (user explicitly quoted the value).
|
|
166
166
|
*/
|
|
167
167
|
export function makeAttribute(key, value, forceString) {
|
|
168
|
+
// String type prefix: s:VALUE forces string type (e.g., engine_version:s:15)
|
|
169
|
+
if (!forceString && value.startsWith("s:")) {
|
|
170
|
+
return { key, value: value.slice(2), valueType: "string" };
|
|
171
|
+
}
|
|
168
172
|
if (!forceString) {
|
|
169
173
|
if (value === "true" || value === "false") {
|
|
170
174
|
return { key, value, valueType: "bool" };
|
package/dist/ops.js
CHANGED
|
@@ -97,9 +97,20 @@ function handleSet(op, config, log) {
|
|
|
97
97
|
const block = findByLabel(config, label);
|
|
98
98
|
if (!block)
|
|
99
99
|
return { success: false, message: `block "${label}" not found` };
|
|
100
|
+
// Support positional expression syntax: set LABEL KEY "expression"
|
|
101
|
+
// When KEY is positionals[1] and expression is positionals[2], store as raw expression
|
|
102
|
+
if (Object.keys(op.params).length === 0 && op.positionals.length >= 3) {
|
|
103
|
+
const key = op.positionals[1];
|
|
104
|
+
const expr = op.positionals.slice(2).join(" ");
|
|
105
|
+
const before = block.attributes.get(key) ?? null;
|
|
106
|
+
const after = { key, value: expr, valueType: "expression" };
|
|
107
|
+
block.attributes.set(key, after);
|
|
108
|
+
log.append({ type: "attribute_set", blockId: block.id, key, before: before ? structuredClone(before) : null, after: structuredClone(after) });
|
|
109
|
+
return { success: true, message: `${label}: set ${key} (expression)`, prefix: "*" };
|
|
110
|
+
}
|
|
100
111
|
const keys = Object.keys(op.params);
|
|
101
112
|
if (keys.length === 0)
|
|
102
|
-
return { success: false, message: "set requires at least one key:value" };
|
|
113
|
+
return { success: false, message: "set requires at least one key:value or KEY \"expression\"" };
|
|
103
114
|
for (const [k, v] of Object.entries(op.params)) {
|
|
104
115
|
const before = block.attributes.get(k) ?? null;
|
|
105
116
|
const after = makeAttribute(k, v, op.quotedParams?.has(k));
|
package/dist/verbs.js
CHANGED
|
@@ -10,12 +10,13 @@ export const VERB_SPECS = [
|
|
|
10
10
|
{ verb: "connect", syntax: 'connect SRC -> TGT [label:TEXT]', category: "Connections", description: "Create a dependency between two blocks" },
|
|
11
11
|
{ verb: "disconnect", syntax: 'disconnect SRC -> TGT', category: "Connections", description: "Remove a dependency" },
|
|
12
12
|
// Editing
|
|
13
|
-
{ verb: "set", syntax: 'set LABEL key:value [key:value...]', category: "Editing", description: "Set attributes on an existing block" },
|
|
13
|
+
{ verb: "set", syntax: 'set LABEL key:value [key:value...]', category: "Editing", description: "Set attributes on an existing block. Use key:\"value\" to force string type on numbers (e.g., engine_version:\"15\"). Use key:s:VALUE as shorthand (e.g., engine_version:s:15). Use positional form for raw expressions: set LABEL KEY \"expression\"" },
|
|
14
14
|
{ verb: "unset", syntax: 'unset LABEL KEY [KEY...]', category: "Editing", description: "Remove attributes from a block" },
|
|
15
15
|
{ verb: "remove", syntax: 'remove LABEL | remove @SELECTOR', category: "Editing", description: "Remove a block by label or selector" },
|
|
16
16
|
{ verb: "label", syntax: 'label OLD_LABEL "new_label"', category: "Editing", description: "Rename a block" },
|
|
17
17
|
{ verb: "style", syntax: 'style LABEL tags:"Key=Val,Key2=Val2"', category: "Editing", description: "Set tags on a resource" },
|
|
18
18
|
{ verb: "nest", syntax: 'nest LABEL BLOCK_TYPE [key:value...]', category: "Editing", description: "Add a nested block (e.g., ingress, root_block_device)" },
|
|
19
|
+
{ verb: "unnest", syntax: 'unnest LABEL BLOCK_TYPE [INDEX]', category: "Editing", description: "Remove a nested block (last by default, or by index)" },
|
|
19
20
|
];
|
|
20
21
|
export const REFERENCE_CARD_SECTIONS = {
|
|
21
22
|
"Selectors": [
|
|
@@ -35,6 +36,8 @@ export const REFERENCE_CARD_SECTIONS = {
|
|
|
35
36
|
" - Provider auto-detected from resource type prefix (aws_, google_, azurerm_)",
|
|
36
37
|
" - Use `plan` query to preview generated HCL without saving",
|
|
37
38
|
" - Use `graph` query to visualize dependency graph",
|
|
39
|
+
" - Force string type: key:\"value\" or key:s:value (e.g., engine_version:s:15)",
|
|
40
|
+
" - Raw HCL expressions: set LABEL KEY \"expr\" (e.g., set role policy \"jsonencode({...})\")",
|
|
38
41
|
" - Call terraform_help for full reference",
|
|
39
42
|
].join("\n"),
|
|
40
43
|
};
|