awscfn 1.3.0 → 1.4.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/README.md CHANGED
@@ -115,6 +115,7 @@ awscfn create-stack -n <STACK_NAME> -t <TEMPLATE_FILE> -p <PARAMS_FILE>
115
115
  | `--name`, `-n` | Stack name |
116
116
  | `--template`, `-t` | CloudFormation template file |
117
117
  | `--params`, `-p` | Parameters file (YAML) |
118
+ | `--set`, `-s` | Override one or more parameters (repeatable `Key=Value`) |
118
119
 
119
120
  ### ⬆️ update-stack
120
121
 
@@ -127,6 +128,7 @@ awscfn update-stack -n <STACK_NAME> -t <TEMPLATE_FILE> -p <PARAMS_FILE>
127
128
  | `--name`, `-n` | Stack name |
128
129
  | `--template`, `-t` | CloudFormation template file |
129
130
  | `--params`, `-p` | Parameters file (YAML) |
131
+ | `--set`, `-s` | Override one or more parameters (repeatable `Key=Value`). You can omit `--params` to override only specific values on an existing stack. |
130
132
  | `--create` | If the stack doesn't exist, create it (instead of erroring) |
131
133
  | `-m` | Shorthand for `--create` |
132
134
 
@@ -148,6 +150,7 @@ awscfn preview-stack -n <STACK_NAME> -t <TEMPLATE_FILE> -p <PARAMS_FILE>
148
150
  | `--name`, `-n` | Stack name |
149
151
  | `--template`, `-t` | CloudFormation template file |
150
152
  | `--params`, `-p` | Parameters file (YAML) |
153
+ | `--set`, `-s` | Override one or more parameters (repeatable `Key=Value`) |
151
154
 
152
155
  Use this to review Add / Modify / Remove actions (and replacement hints) before running **`create-stack`** or **`update-stack`**.
153
156
 
package/bin/awscfn CHANGED
@@ -91,6 +91,16 @@ const templateOpt = {
91
91
  const paramsOpt = {
92
92
  params: { type: 'string', alias: 'p', describe: 'Parameters file (YAML). Optional; omit to use template defaults.', demandOption: false },
93
93
  };
94
+ const setOpt = {
95
+ set: {
96
+ type: 'string',
97
+ alias: 's',
98
+ array: true,
99
+ describe: 'Override one or more parameters (repeatable). Format: Key=Value',
100
+ demandOption: false,
101
+ default: [],
102
+ },
103
+ };
94
104
  const createIfMissingOpt = {
95
105
  create: {
96
106
  type: 'boolean',
@@ -141,9 +151,9 @@ yargs
141
151
  .command(
142
152
  'create-stack',
143
153
  'Create a CloudFormation stack',
144
- (cmd) => cmd.options({ ...nameOpt, ...templateOpt, ...paramsOpt }),
145
- ({ name, template, params }) => {
146
- runCommand(() => createStack(name, template, params));
154
+ (cmd) => cmd.options({ ...nameOpt, ...templateOpt, ...paramsOpt, ...setOpt }),
155
+ ({ name, template, params, set }) => {
156
+ runCommand(() => createStack(name, template, params, require('../dist/cli/parseParamOverrides').parseParamOverrides(set).overrides));
147
157
  }
148
158
  )
149
159
  .command(
@@ -165,17 +175,17 @@ yargs
165
175
  .command(
166
176
  'update-stack',
167
177
  'Update a CloudFormation stack',
168
- (cmd) => cmd.options({ ...nameOpt, ...templateOpt, ...paramsOpt, ...createIfMissingOpt }),
169
- ({ name, template, params, create }) => {
170
- runCommand(() => updateStack(name, template, params, Boolean(create)));
178
+ (cmd) => cmd.options({ ...nameOpt, ...templateOpt, ...paramsOpt, ...createIfMissingOpt, ...setOpt }),
179
+ ({ name, template, params, create, set }) => {
180
+ runCommand(() => updateStack(name, template, params, Boolean(create), require('../dist/cli/parseParamOverrides').parseParamOverrides(set).overrides));
171
181
  }
172
182
  )
173
183
  .command(
174
184
  'preview-stack',
175
185
  'Preview changes without deploying (change set only)',
176
- (cmd) => cmd.options({ ...nameOpt, ...templateOpt, ...paramsOpt }),
177
- ({ name, template, params }) => {
178
- runCommand(() => previewStack(name, template, params));
186
+ (cmd) => cmd.options({ ...nameOpt, ...templateOpt, ...paramsOpt, ...setOpt }),
187
+ ({ name, template, params, set }) => {
188
+ runCommand(() => previewStack(name, template, params, require('../dist/cli/parseParamOverrides').parseParamOverrides(set).overrides));
179
189
  }
180
190
  )
181
191
  .completion(
@@ -6,5 +6,5 @@ export interface TemplateAndParams {
6
6
  * Load template from file and optional params. If no params file is given, uses {}.
7
7
  * CloudFormation will error if a required parameter has no default.
8
8
  */
9
- export declare function loadTemplateAndParams(templatePath: string, paramsPath: string | undefined): Promise<TemplateAndParams>;
9
+ export declare function loadTemplateAndParams(templatePath: string, paramsPath: string | undefined, overrides?: Record<string, string>): Promise<TemplateAndParams>;
10
10
  //# sourceMappingURL=loadTemplateAndParams.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadTemplateAndParams.d.ts","sourceRoot":"","sources":["../../src/cli/loadTemplateAndParams.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACvC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAS5B"}
1
+ {"version":3,"file":"loadTemplateAndParams.d.ts","sourceRoot":"","sources":["../../src/cli/loadTemplateAndParams.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACvC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,iBAAiB,CAAC,CAwB5B"}
@@ -8,11 +8,20 @@ const templateHasParameters_1 = require("../lib/templateHasParameters");
8
8
  * Load template from file and optional params. If no params file is given, uses {}.
9
9
  * CloudFormation will error if a required parameter has no default.
10
10
  */
11
- async function loadTemplateAndParams(templatePath, paramsPath) {
11
+ async function loadTemplateAndParams(templatePath, paramsPath, overrides) {
12
12
  const template = (0, node_fs_1.readFileSync)(templatePath, 'utf-8');
13
- const params = (paramsPath && (0, templateHasParameters_1.templateHasParameters)(template))
13
+ const hasParameters = (0, templateHasParameters_1.templateHasParameters)(template);
14
+ const fileParams = (paramsPath && (0, templateHasParameters_1.templateHasParameters)(template))
14
15
  ? (await (0, getParamsFromFile_1.getParamsFromFile)(paramsPath))
15
16
  : {};
17
+ if (!hasParameters && overrides && Object.keys(overrides).length > 0) {
18
+ throw new Error('Template does not declare Parameters, but --set was provided. '
19
+ + 'Remove --set or add a Parameters section to the template.');
20
+ }
21
+ const params = {
22
+ ...fileParams,
23
+ ...(overrides ?? {}),
24
+ };
16
25
  return { template, params };
17
26
  }
18
27
  //# sourceMappingURL=loadTemplateAndParams.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loadTemplateAndParams.js","sourceRoot":"","sources":["../../src/cli/loadTemplateAndParams.ts"],"names":[],"mappings":";;AAaA,sDAYC;AAzBD,qCAAqC;AACrC,gEAA2D;AAC3D,wEAAmE;AAOnE;;;GAGG;AACI,KAAK,UAAU,qBAAqB,CACvC,YAAoB,EACpB,UAA8B;IAG9B,MAAM,QAAQ,GAAG,IAAA,sBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,CAAC,UAAU,IAAI,IAAA,6CAAqB,EAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC,CAAE,CAAC,MAAM,IAAA,qCAAiB,EAAC,UAAU,CAAC,CAA6B;QACpE,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAC,CAAC;AAE9B,CAAC"}
1
+ {"version":3,"file":"loadTemplateAndParams.js","sourceRoot":"","sources":["../../src/cli/loadTemplateAndParams.ts"],"names":[],"mappings":";;AAaA,sDA4BC;AAzCD,qCAAqC;AACrC,gEAA2D;AAC3D,wEAAmE;AAOnE;;;GAGG;AACI,KAAK,UAAU,qBAAqB,CACvC,YAAoB,EACpB,UAA8B,EAC9B,SAAkC;IAGlC,MAAM,QAAQ,GAAG,IAAA,sBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,IAAA,6CAAqB,EAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,CAAC,UAAU,IAAI,IAAA,6CAAqB,EAAC,QAAQ,CAAC,CAAC;QAC9D,CAAC,CAAE,CAAC,MAAM,IAAA,qCAAiB,EAAC,UAAU,CAAC,CAA6B;QACpE,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,CAAC,aAAa,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAEnE,MAAM,IAAI,KAAK,CACX,gEAAgE;cAC9D,2DAA2D,CAChE,CAAC;IAEN,CAAC;IAED,MAAM,MAAM,GAAG;QACX,GAAG,UAAU;QACb,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;KACvB,CAAC;IAEF,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAC,CAAC;AAE9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loadTemplateAndParams.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadTemplateAndParams.spec.d.ts","sourceRoot":"","sources":["../../src/cli/loadTemplateAndParams.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const kizu_1 = require("kizu");
4
+ const node_fs_1 = require("node:fs");
5
+ const node_os_1 = require("node:os");
6
+ const node_path_1 = require("node:path");
7
+ const loadTemplateAndParams_1 = require("./loadTemplateAndParams");
8
+ (0, kizu_1.test)('loadTemplateAndParams throws when template has no Parameters but overrides provided', async (assert) => {
9
+ const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'awscfn-'));
10
+ const templatePath = (0, node_path_1.join)(dir, 'template.yaml');
11
+ (0, node_fs_1.writeFileSync)(templatePath, 'Resources: {}', 'utf-8');
12
+ await assert.throws(() => (0, loadTemplateAndParams_1.loadTemplateAndParams)(templatePath, undefined, { Foo: 'bar' }), /does not declare Parameters/i);
13
+ });
14
+ //# sourceMappingURL=loadTemplateAndParams.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadTemplateAndParams.spec.js","sourceRoot":"","sources":["../../src/cli/loadTemplateAndParams.spec.ts"],"names":[],"mappings":";;AAAA,+BAA0B;AAC1B,qCAAmD;AACnD,qCAA+B;AAC/B,yCAA+B;AAC/B,mEAA8D;AAE9D,IAAA,WAAI,EAAC,qFAAqF,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAEzG,MAAM,GAAG,GAAG,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAEhD,IAAA,uBAAa,EAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;IAEtD,MAAM,MAAM,CAAC,MAAM,CACf,GAAG,EAAE,CAAC,IAAA,6CAAqB,EAAC,YAAY,EAAE,SAAS,EAAE,EAAC,GAAG,EAAE,KAAK,EAAC,CAAC,EAClE,8BAA8B,CACjC,CAAC;AAEN,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ParamOverrideParseResult {
2
+ overrides: Record<string, string>;
3
+ }
4
+ /**
5
+ * Parse repeatable CLI overrides like:
6
+ * ["Foo=bar", "Env=prod"]
7
+ */
8
+ export declare function parseParamOverrides(values: unknown[] | undefined): ParamOverrideParseResult;
9
+ //# sourceMappingURL=parseParamOverrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseParamOverrides.d.ts","sourceRoot":"","sources":["../../src/cli/parseParamOverrides.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,wBAAwB,CAyB3F"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseParamOverrides = parseParamOverrides;
4
+ /**
5
+ * Parse repeatable CLI overrides like:
6
+ * ["Foo=bar", "Env=prod"]
7
+ */
8
+ function parseParamOverrides(values) {
9
+ const overrides = {};
10
+ if (!values)
11
+ return { overrides };
12
+ for (const raw of values) {
13
+ if (typeof raw !== 'string')
14
+ throw new Error(`Invalid --set value: ${String(raw)}`);
15
+ const idx = raw.indexOf('=');
16
+ if (idx <= 0)
17
+ throw new Error(`Invalid --set value (expected Key=Value): ${raw}`);
18
+ const key = raw.slice(0, idx).trim();
19
+ const value = raw.slice(idx + 1);
20
+ if (!key)
21
+ throw new Error(`Invalid --set value (empty key): ${raw}`);
22
+ overrides[key] = value;
23
+ }
24
+ return { overrides };
25
+ }
26
+ //# sourceMappingURL=parseParamOverrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseParamOverrides.js","sourceRoot":"","sources":["../../src/cli/parseParamOverrides.ts"],"names":[],"mappings":";;AAQA,kDAyBC;AA7BD;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAA6B;IAE7D,MAAM,SAAS,GAA2B,EAAE,CAAC;IAE7C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAC,SAAS,EAAC,CAAC;IAEhC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAEvB,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEpF,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE7B,IAAI,GAAG,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,EAAE,CAAC,CAAC;QAElF,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAEjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;QAErE,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAE3B,CAAC;IAED,OAAO,EAAC,SAAS,EAAC,CAAC;AAEvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parseParamOverrides.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseParamOverrides.spec.d.ts","sourceRoot":"","sources":["../../src/cli/parseParamOverrides.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const kizu_1 = require("kizu");
4
+ const parseParamOverrides_1 = require("./parseParamOverrides");
5
+ (0, kizu_1.test)('parseParamOverrides parses repeated Key=Value pairs', (assert) => {
6
+ const { overrides } = (0, parseParamOverrides_1.parseParamOverrides)(['Foo=bar', 'Env=prod']);
7
+ assert.equal(overrides, { Foo: 'bar', Env: 'prod' });
8
+ });
9
+ (0, kizu_1.test)('parseParamOverrides last value wins for duplicate keys', (assert) => {
10
+ const { overrides } = (0, parseParamOverrides_1.parseParamOverrides)(['Foo=bar', 'Foo=baz']);
11
+ assert.equal(overrides, { Foo: 'baz' });
12
+ });
13
+ (0, kizu_1.test)('parseParamOverrides throws on invalid format', (assert) => {
14
+ assert.throws(() => (0, parseParamOverrides_1.parseParamOverrides)(['NoEquals']), /expected Key=Value/);
15
+ });
16
+ //# sourceMappingURL=parseParamOverrides.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseParamOverrides.spec.js","sourceRoot":"","sources":["../../src/cli/parseParamOverrides.spec.ts"],"names":[],"mappings":";;AAAA,+BAA0B;AAC1B,+DAA0D;AAE1D,IAAA,WAAI,EAAC,qDAAqD,EAAE,CAAC,MAAM,EAAE,EAAE;IAEnE,MAAM,EAAC,SAAS,EAAC,GAAG,IAAA,yCAAmB,EAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAC,CAAC,CAAC;AAEvD,CAAC,CAAC,CAAC;AAEH,IAAA,WAAI,EAAC,wDAAwD,EAAE,CAAC,MAAM,EAAE,EAAE;IAEtE,MAAM,EAAC,SAAS,EAAC,GAAG,IAAA,yCAAmB,EAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEhE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAC,GAAG,EAAE,KAAK,EAAC,CAAC,CAAC;AAE1C,CAAC,CAAC,CAAC;AAEH,IAAA,WAAI,EAAC,8CAA8C,EAAE,CAAC,MAAM,EAAE,EAAE;IAE5D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yCAAmB,EAAC,CAAC,UAAU,CAAQ,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAExF,CAAC,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * CLI handler: create a new CloudFormation stack.
3
3
  */
4
- export declare function createStack(stackName: string, templatePath: string, paramsPath?: string): Promise<void>;
4
+ export declare function createStack(stackName: string, templatePath: string, paramsPath?: string, overrides?: Record<string, string>): Promise<void>;
5
5
  //# sourceMappingURL=createStack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createStack.d.ts","sourceRoot":"","sources":["../src/createStack.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,WAAW,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
1
+ {"version":3,"file":"createStack.d.ts","sourceRoot":"","sources":["../src/createStack.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,WAAW,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -41,9 +41,9 @@ const log_1 = require("./cli/log");
41
41
  /**
42
42
  * CLI handler: create a new CloudFormation stack.
43
43
  */
44
- async function createStack(stackName, templatePath, paramsPath) {
44
+ async function createStack(stackName, templatePath, paramsPath, overrides) {
45
45
  cfn.initCloudFormationClient();
46
- const { template, params } = await (0, loadTemplateAndParams_1.loadTemplateAndParams)(templatePath, paramsPath);
46
+ const { template, params } = await (0, loadTemplateAndParams_1.loadTemplateAndParams)(templatePath, paramsPath, overrides);
47
47
  const existing = await cfn.getStackByName(stackName);
48
48
  if (existing) {
49
49
  throw new Error('stack already exists, try update command');
@@ -1 +1 @@
1
- {"version":3,"file":"createStack.js","sourceRoot":"","sources":["../src/createStack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,kCAuBC;AA/BD,+CAAiC;AACjC,uEAAkE;AAClE,6DAA8D;AAC9D,mCAAyC;AAEzC;;GAEG;AACI,KAAK,UAAU,WAAW,CAC7B,SAAiB,EACjB,YAAoB,EACpB,UAAmB;IAGnB,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAE/B,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,MAAM,IAAA,6CAAqB,EAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,QAAQ,EAAE,CAAC;QAEX,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAEhE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,IAAA,yCAAsB,EAAC,QAAQ,CAAC,CAAC;IAEvC,IAAA,oBAAc,EAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;AAE/D,CAAC"}
1
+ {"version":3,"file":"createStack.js","sourceRoot":"","sources":["../src/createStack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,kCAwBC;AAhCD,+CAAiC;AACjC,uEAAkE;AAClE,6DAA8D;AAC9D,mCAAyC;AAEzC;;GAEG;AACI,KAAK,UAAU,WAAW,CAC7B,SAAiB,EACjB,YAAoB,EACpB,UAAmB,EACnB,SAAkC;IAGlC,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAE/B,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,MAAM,IAAA,6CAAqB,EAAC,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,QAAQ,EAAE,CAAC;QAEX,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAEhE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,IAAA,yCAAsB,EAAC,QAAQ,CAAC,CAAC;IAEvC,IAAA,oBAAc,EAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;AAE/D,CAAC"}
@@ -2,5 +2,5 @@
2
2
  * CLI: preview stack changes without executing (build change set, print table, delete change set).
3
3
  * CREATE vs UPDATE matches whether the stack already exists.
4
4
  */
5
- export declare function previewStack(stackName: string, templatePath: string, paramsPath?: string): Promise<void>;
5
+ export declare function previewStack(stackName: string, templatePath: string, paramsPath?: string, overrides?: Record<string, string>): Promise<void>;
6
6
  //# sourceMappingURL=previewStack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"previewStack.d.ts","sourceRoot":"","sources":["../src/previewStack.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAsB,YAAY,CAC9B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
1
+ {"version":3,"file":"previewStack.d.ts","sourceRoot":"","sources":["../src/previewStack.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAsB,YAAY,CAC9B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -43,9 +43,9 @@ const output_1 = require("./lib/output");
43
43
  * CLI: preview stack changes without executing (build change set, print table, delete change set).
44
44
  * CREATE vs UPDATE matches whether the stack already exists.
45
45
  */
46
- async function previewStack(stackName, templatePath, paramsPath) {
46
+ async function previewStack(stackName, templatePath, paramsPath, overrides) {
47
47
  cfn.initCloudFormationClient();
48
- const { template, params } = await (0, loadTemplateAndParams_1.loadTemplateAndParams)(templatePath, paramsPath);
48
+ const { template, params } = await (0, loadTemplateAndParams_1.loadTemplateAndParams)(templatePath, paramsPath, overrides);
49
49
  const existing = await cfn.getStackByName(stackName);
50
50
  if (existing?.StackStatus === client_cloudformation_1.StackStatus.ROLLBACK_COMPLETE) {
51
51
  (0, output_1.warn)(`Stack ${stackName} is in ROLLBACK_COMPLETE; update-stack would delete and recreate it. `
@@ -1 +1 @@
1
- {"version":3,"file":"previewStack.js","sourceRoot":"","sources":["../src/previewStack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,oCAiCC;AA3CD,0EAA2D;AAC3D,+CAAiC;AACjC,uEAAkE;AAClE,6DAA8D;AAC9D,yCAAuD;AAEvD;;;GAGG;AACI,KAAK,UAAU,YAAY,CAC9B,SAAiB,EACjB,YAAoB,EACpB,UAAmB;IAGnB,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAE/B,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,MAAM,IAAA,6CAAqB,EAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,QAAQ,EAAE,WAAW,KAAK,mCAAW,CAAC,iBAAiB,EAAE,CAAC;QAE1D,IAAA,aAAI,EACA,SAAS,SAAS,uEAAuE;cACvF,iCAAiC,CACtC,CAAC;QAEF,MAAM,IAAI,KAAK,CACX,4GAA4G,CAC/G,CAAC;IAEN,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,IAAA,yCAAsB,EAAC,QAAQ,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEjD,IAAA,aAAI,EAAC,GAAG,gBAAO,CAAC,KAAK,YAAY,IAAA,aAAI,EAAC,SAAS,CAAC,cAAc,IAAA,aAAI,EAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAEjF,MAAM,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAC,EAAE,SAAS,CAAC,CAAC;AAE/E,CAAC"}
1
+ {"version":3,"file":"previewStack.js","sourceRoot":"","sources":["../src/previewStack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,oCAkCC;AA5CD,0EAA2D;AAC3D,+CAAiC;AACjC,uEAAkE;AAClE,6DAA8D;AAC9D,yCAAuD;AAEvD;;;GAGG;AACI,KAAK,UAAU,YAAY,CAC9B,SAAiB,EACjB,YAAoB,EACpB,UAAmB,EACnB,SAAkC;IAGlC,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAE/B,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,MAAM,IAAA,6CAAqB,EAAC,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,QAAQ,EAAE,WAAW,KAAK,mCAAW,CAAC,iBAAiB,EAAE,CAAC;QAE1D,IAAA,aAAI,EACA,SAAS,SAAS,uEAAuE;cACvF,iCAAiC,CACtC,CAAC;QAEF,MAAM,IAAI,KAAK,CACX,4GAA4G,CAC/G,CAAC;IAEN,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,IAAA,yCAAsB,EAAC,QAAQ,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEjD,IAAA,aAAI,EAAC,GAAG,gBAAO,CAAC,KAAK,YAAY,IAAA,aAAI,EAAC,SAAS,CAAC,cAAc,IAAA,aAAI,EAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAEjF,MAAM,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAC,EAAE,SAAS,CAAC,CAAC;AAE/E,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * CLI handler: update an existing CloudFormation stack.
3
3
  */
4
- export declare function updateStack(stackName: string, templatePath: string, paramsPath?: string, create?: boolean): Promise<void>;
4
+ export declare function updateStack(stackName: string, templatePath: string, paramsPath?: string, create?: boolean, overrides?: Record<string, string>): Promise<void>;
5
5
  //# sourceMappingURL=updateStack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"updateStack.d.ts","sourceRoot":"","sources":["../src/updateStack.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,WAAW,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,GAAE,OAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
1
+ {"version":3,"file":"updateStack.d.ts","sourceRoot":"","sources":["../src/updateStack.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,WAAW,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,GAAE,OAAe,EACvB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
@@ -41,9 +41,9 @@ const log_1 = require("./cli/log");
41
41
  /**
42
42
  * CLI handler: update an existing CloudFormation stack.
43
43
  */
44
- async function updateStack(stackName, templatePath, paramsPath, create = false) {
44
+ async function updateStack(stackName, templatePath, paramsPath, create = false, overrides) {
45
45
  cfn.initCloudFormationClient();
46
- const { template, params } = await (0, loadTemplateAndParams_1.loadTemplateAndParams)(templatePath, paramsPath);
46
+ const { template, params } = await (0, loadTemplateAndParams_1.loadTemplateAndParams)(templatePath, paramsPath, overrides);
47
47
  const existing = await cfn.getStackByName(stackName);
48
48
  if (!existing) {
49
49
  if (!create) {
@@ -1 +1 @@
1
- {"version":3,"file":"updateStack.js","sourceRoot":"","sources":["../src/updateStack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,kCAoCC;AA5CD,+CAAiC;AACjC,uEAAkE;AAClE,6DAA8D;AAC9D,mCAAyC;AAEzC;;GAEG;AACI,KAAK,UAAU,WAAW,CAC7B,SAAiB,EACjB,YAAoB,EACpB,UAAmB,EACnB,SAAkB,KAAK;IAGvB,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAE/B,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,MAAM,IAAA,6CAAqB,EAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEZ,IAAI,CAAC,MAAM,EAAE,CAAC;YAEV,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAE3D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,IAAA,yCAAsB,EAAC,QAAQ,CAAC,CAAC;QAEvC,IAAA,oBAAc,EAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;QAE3D,OAAO;IAEX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,IAAA,yCAAsB,EAAC,QAAQ,CAAC,CAAC;IAEvC,IAAA,oBAAc,EAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;AAE9D,CAAC"}
1
+ {"version":3,"file":"updateStack.js","sourceRoot":"","sources":["../src/updateStack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,kCAqCC;AA7CD,+CAAiC;AACjC,uEAAkE;AAClE,6DAA8D;AAC9D,mCAAyC;AAEzC;;GAEG;AACI,KAAK,UAAU,WAAW,CAC7B,SAAiB,EACjB,YAAoB,EACpB,UAAmB,EACnB,SAAkB,KAAK,EACvB,SAAkC;IAGlC,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAE/B,MAAM,EAAC,QAAQ,EAAE,MAAM,EAAC,GAAG,MAAM,IAAA,6CAAqB,EAAC,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEZ,IAAI,CAAC,MAAM,EAAE,CAAC;YAEV,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAE3D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,IAAA,yCAAsB,EAAC,QAAQ,CAAC,CAAC;QAEvC,IAAA,oBAAc,EAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;QAE3D,OAAO;IAEX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,IAAA,yCAAsB,EAAC,QAAQ,CAAC,CAAC;IAEvC,IAAA,oBAAc,EAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;AAE9D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awscfn",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "CLI and TypeScript SDK for managing AWS CloudFormation stacks with simple YAML parameters and real-time event streaming.",
5
5
  "type": "commonjs",
6
6
  "main": "./dist/index.js",