From 56eb613d140ea4fe7005f00a49ecedba9c15913e Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Fri, 7 Nov 2025 16:02:10 -0500 Subject: [PATCH 1/2] fix: allow region override Signed-off-by: Simon MacDonald --- readme.md | 5 +-- src/index.js | 5 +-- test/unit/region-param-test.js | 61 ++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 test/unit/region-param-test.js diff --git a/readme.md b/readme.md index e6adb30..b8ca887 100644 --- a/readme.md +++ b/readme.md @@ -10,7 +10,7 @@ Architect Destroy destroys Architect-generated projects. More specifically, it d ## API -### `destroy({ appname, stackname, env, force, now, retries, credentials, quiet }, callback)` +### `destroy({ appname, stackname, env, force, now, retries, credentials, quiet, region }, callback)` Destroys all infrastructure associated to your Architect app. @@ -24,4 +24,5 @@ Destroys all infrastructure associated to your Architect app. removed? This API is pinged every 10 seconds. If `retries` is exhausted, `callback` will be invoked with an error. - `credentials`: (object) AWS credentials object with `accessKeyId`, `secretAccessKey`, and optionally `sessionToken` -- `quiet`: (boolean) suppress status output during destruction \ No newline at end of file +- `quiet`: (boolean) suppress status output during destruction +- `region`: (string) provide region override diff --git a/src/index.js b/src/index.js index 6b64800..f88e87f 100644 --- a/src/index.js +++ b/src/index.js @@ -23,9 +23,10 @@ function stackNotFound (StackName, err) { * @param {boolean} [params.force] - deletes app with impunity, regardless of tables or buckets * @param {object} [params.credentials] - AWS credentials object with accessKeyId, secretAccessKey, and optionally sessionToken * @param {boolean} [params.quiet] - suppress output + * @param {string} [params.region] - region override */ module.exports = function destroy (params, callback) { - let { appname, env, force = false, inventory, now, retries, stackname, update, credentials, quiet } = params + let { appname, env, force = false, inventory, now, retries, stackname, update, credentials, quiet, region } = params if (!update) update = updater('Destroy', { quiet }) // always validate input @@ -86,7 +87,7 @@ module.exports = function destroy (params, callback) { // Instantiate client function (callback) { let params = { - region: inventory.inv.aws.region, + region: region || inventory.inv.aws.region, plugins: [ import('@aws-lite/cloudformation'), import('@aws-lite/cloudwatch-logs'), diff --git a/test/unit/region-param-test.js b/test/unit/region-param-test.js new file mode 100644 index 0000000..a9dbb17 --- /dev/null +++ b/test/unit/region-param-test.js @@ -0,0 +1,61 @@ +let test = require('tape') +let proxyquire = require('proxyquire') +let inventory = require('@architect/inventory') + +let awsLiteArgs = [] +let mockAwsLite = (args) => { + awsLiteArgs.push(args) + return Promise.resolve({ + cloudformation: { DescribeStacks: ({ StackName }) => Promise.reject({ code: 'ValidationError', message: `Stack with id ${StackName} does not exist` }) }, + CloudFormation: { DescribeStacks: ({ StackName }) => Promise.reject({ code: 'ValidationError', message: `Stack with id ${StackName} does not exist` }) }, + ssm: { + GetParameter: () => Promise.resolve({ + Parameter: { + Value: 'test-bucket-name', + }, + }), + GetParametersByPath: () => Promise.resolve({ Parameters: [] }), + }, + s3: { + HeadBucket: () => Promise.reject({ code: 'NotFound' }), + }, + cloudwatchlogs: { + DescribeLogGroups: () => Promise.resolve({ logGroups: [] }), + }, + }) +} + +let destroy = proxyquire('../../', { + '@aws-lite/client': mockAwsLite, +}) + +test('destroy credentials accepted', async t => { + t.plan(2) + let inv = await inventory({ + rawArc: '@app\ntest-app\n@http\nget /', + deployStage: 'staging', + }) + try { + + await destroy({ + appname: 'test-app', + env: 'staging', + credentials: { + accessKeyId: 'ASIATEST123456789', + secretAccessKey: 'testSecretKey123456789', + sessionToken: 'testSessionToken123456789', + }, + inventory: inv, + now: true, // Skip the 5-second delay for testing + dryRun: true, + region: 'ca-central-1', + }) + + t.ok(awsLiteArgs[0].region, 'region is present') + t.equal(awsLiteArgs[0].region, 'ca-central-1', 'region is set correctly') + } + catch (err) { + + t.fail('Destroy failed: ' + err.message) + } +}) From 3949229d1c4b11688c4b071eb116ba3ea42aa4fe Mon Sep 17 00:00:00 2001 From: Simon MacDonald Date: Mon, 10 Nov 2025 10:25:46 -0500 Subject: [PATCH 2/2] doc: update changelog Signed-off-by: Simon MacDonald --- changelog.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/changelog.md b/changelog.md index ad36aae..11a17e7 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,31 @@ --- +## [5.0.2] 2025-11-10 + +### Changed + +- Added support for `region` parameter in programmatic API + +--- + +## [5.0.1] 2025-09-25 + +### Changed + +- Lock down dependencies. + +--- + +## [5.0.0] 2025-09-24 + +### Changed + +- Updated supported node.js versions to 20, 22 and 24. +- Removed dependencies that are vendored into `@architect/utils`. + +--- + ## [4.2.0] 2024-09-04 ### Changed