From 377c169912857a6126966929d564f969a99edc07 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 25 Nov 2022 14:32:01 +0100 Subject: [PATCH 01/20] feat: added SSMProvider.get --- package-lock.json | 2 +- packages/parameters/package.json | 2 +- packages/parameters/src/SSMProvider.ts | 32 +++++++++++ .../parameters/tests/unit/SSMProvider.test.ts | 56 +++++++++++++++++++ 4 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 packages/parameters/src/SSMProvider.ts create mode 100644 packages/parameters/tests/unit/SSMProvider.test.ts diff --git a/package-lock.json b/package-lock.json index 35a78618d4..2519165c52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30103,4 +30103,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 780c801029..245f43d4b2 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -58,4 +58,4 @@ "aws-sdk-client-mock": "^2.0.1", "aws-sdk-client-mock-jest": "^2.0.1" } -} +} \ No newline at end of file diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts new file mode 100644 index 0000000000..67296b476a --- /dev/null +++ b/packages/parameters/src/SSMProvider.ts @@ -0,0 +1,32 @@ +import { BaseProvider } from './BaseProvider'; +import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; +import type { SSMClientConfig, GetParameterCommandInput } from '@aws-sdk/client-ssm'; + +class SSMProvider extends BaseProvider { + public client: SSMClient; + + public constructor(config: SSMClientConfig = {}) { + super(); + this.client = new SSMClient(config); + } + + protected async _get(name: string, sdkOptions?: Partial): Promise { + const options: Partial = { + Name: name, + }; + if (sdkOptions) { + Object.assign(options, sdkOptions); + } + const result = await this.client.send(new GetParameterCommand(options)); + + return result.Parameter?.Value; + } + + protected async _getMultiple(_path: string): Promise> { + throw Error('Not implemented.'); + } +} + +export { + SSMProvider +}; \ No newline at end of file diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts new file mode 100644 index 0000000000..8f26866d01 --- /dev/null +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -0,0 +1,56 @@ +/** + * Test SSMProvider class + * + * @group unit/idempotency/all + */ +import { SSMProvider } from '../../src/SSMProvider'; +import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; + +describe('Class: SSMProvider', () => { + + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('Method: get', () => { + + test('when called without sdkOptions, it gets the parameter using the name only', () => { + + // Prepare + const provider = new SSMProvider(); + const client = mockClient(SSMClient).on(GetParameterCommand).resolves({}); + const parameterName = 'foo'; + + // Act + provider.get(parameterName); + + // Assess + expect(client).toReceiveCommandWith(GetParameterCommand, { + Name: parameterName + }); + + }); + + test('when called with sdkOptions, it gets the parameter using the parameters', () => { + + // Prepare + const provider = new SSMProvider(); + const client = mockClient(SSMClient).on(GetParameterCommand).resolves({}); + const parameterName = 'foo'; + + // Act + provider.get(parameterName, { sdkOptions: { } }); + + // Assess + expect(client).toReceiveCommandWith(GetParameterCommand, { + Name: parameterName, + + }); + + }); + + }); + +}); \ No newline at end of file From d9aadc9209217d53617627e3e7f20b43ffaee037 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 25 Nov 2022 15:05:10 +0000 Subject: [PATCH 02/20] added sdk as devDependency --- package-lock.json | 727 +++++++++++++++++++++++++ packages/parameters/src/SSMProvider.ts | 23 +- 2 files changed, 747 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2519165c52..be1f647afd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -836,6 +836,537 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/abort-controller": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.215.0.tgz", + "integrity": "sha512-HTvL542nawhVqe0oC1AJchdcomEOmPivJEzYUT1LqiG3e8ikxMNa2KWSqqLPeKi2t0A/cfQy7wDUyg9+BZhDSQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/config-resolver": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.215.0.tgz", + "integrity": "sha512-DxX4R+YYLQOtg0qfceKBrjVD4t1mQBG1eb7IVr2QSlckFCX8ztUNymFMuaSEo3938Jyy/NpgfUDpFqPDaSKnng==", + "dev": true, + "dependencies": { + "@aws-sdk/signature-v4": "3.215.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.215.0.tgz", + "integrity": "sha512-/4FUUR6u9gkNfxB6mEwBr0kk0myIkrDcXbAocWN3fPd/t7otzxpx/JqPZXgM6kcVP7M4T/QT75l1E1RRHLWCCQ==", + "dev": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.215.0", + "@aws-sdk/property-provider": "3.215.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/url-parser": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.215.0.tgz", + "integrity": "sha512-JfZyrJOE+0ik1PumsIUZd0NfgEx4sZ43VSdPCD9GRhssRWudNsSF1B5fz3xA5v+1y5oQPjXZyaWCzKtnYruiWw==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/querystring-builder": "3.215.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/hash-node": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.215.0.tgz", + "integrity": "sha512-MkSRuZvo1RCRmI0VNEmRYCGGD/DkMd9lqnLtOyglMPnSX1mhyD4/DyXmcc3rYa7PsjDRAfykGWJRiMqpoMLjiQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/invalid-dependency": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.215.0.tgz", + "integrity": "sha512-++bK4BUQe8/CL/YcLZcQB8qPOhiXxhbuhYzfFS7PNVvW1QOLqKRZL/lKs24gzjcOmw7IhAbCybDZwvu2TM4DAg==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-content-length": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.215.0.tgz", + "integrity": "sha512-zKJRb6jDLFl9nl/muSFbiQHA4uK3skinuDRcyLbpMvvzhuK/PVodv9QI1+wIUsFdXkaSxAlva1oG4bL8ZFi+sQ==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.215.0.tgz", + "integrity": "sha512-GOqI7VwoENZwn+6tIMrrJ4SipIqL2JCh+BNvORVcy7CQxn1ViKkna7iaCx+QMjpg/kn9cR6kfY0n1FmgZR1w9A==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-logger": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.215.0.tgz", + "integrity": "sha512-0h4GGF0rV3jnY3jxmcAWsOdqHCYf25s0biSjmgTei+l/5S+geOGrovRPCNep0LLg0i9D8bkZsXISojilETbf+g==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.215.0.tgz", + "integrity": "sha512-KQ+kiEsaluM4i6opjusUukxY78+UhfR7vzXHDkzZK/GplQ1hY0B+rwVO1eaULmlnmf3FK+Wd6lwrPV7xS2W+EA==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-retry": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.215.0.tgz", + "integrity": "sha512-I/dnUPVg2Kp3lW+MywBoPp06EOng8IfuaS9ph4bcJpQKrhNU5ekRgCHH2C4k1A6GcP8uyHxQ5TVV6j+l0QPIsA==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/service-error-classification": "3.215.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-middleware": "3.215.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-serde": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.215.0.tgz", + "integrity": "sha512-+uhLXdKvvQZcRRFc3UmemSr/YUHA4Jc+1YMjHxc3v8vvfztFJBb0wgBx999myOi8PmkYThlRBQDzXy9UCIhIJw==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-stack": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.215.0.tgz", + "integrity": "sha512-rdSVL7LxRgjlvoluqwODD4ypBy2k/YVl6FrDplyCMSi8m2WHZG99FzdmR9bpnWK+0DGzYZSMRYx6ynJ9N9PsSw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz", + "integrity": "sha512-X6GfoMNoEITTw7rGL/gWs8UZ0cmmmezvKcl+KtHsA642R05OR4mY5G7LdbWAw0bcrwKsuKOGmwUrC9lzGqbWUw==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/node-config-provider": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.215.0.tgz", + "integrity": "sha512-notckD94QwwxC0GsfpTxB7VH8SREIIlMsUSddqGtpModa0cq/wRb9rqnydZSoznbYpK1ND6h0C9hr/2PNz89zw==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.215.0", + "@aws-sdk/shared-ini-file-loader": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/node-http-handler": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.215.0.tgz", + "integrity": "sha512-btKWSR7m0UuWIN3p5MfSIvhqeYik7xri7U6nWuVI5GVzIYjzxEZOMvPAinDLDxL5wipodi0ZvTUNdDJdm7BcGQ==", + "dev": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.215.0", + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/querystring-builder": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/property-provider": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz", + "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/protocol-http": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.215.0.tgz", + "integrity": "sha512-qp6Y6v4S534LAjadiVl9p7ErK7ImphOKq6yhFyQwxko6iITLcz8ib3yU27fs4QJcnNj5ZooqW/YlL/0EikDxCQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/querystring-builder": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz", + "integrity": "sha512-eilk8CqG37BVhQklLif00K2dOJgDzacUi8h3KVQ72ry1V3h345i4HsmaFIxvnz8XtNyDvV8qFAzeYg9n2P9RQA==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/querystring-parser": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.215.0.tgz", + "integrity": "sha512-8h/9H8dWM4fZO27UGzo8W5JXln4yJMugPyUl4qFA437gzPgNFN95+oLJWXtHMlfCHC5T/PDKetY9TarMDgBD0Q==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/service-error-classification": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.215.0.tgz", + "integrity": "sha512-SKBvClGFGzMPsjBBKjneaUazLCNr6bSxe9eFvOr3gCwuwE2jPQwW3VE1mb62howuvm6cLthEDwLQp/FsT1gMsw==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz", + "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/signature-v4": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.215.0.tgz", + "integrity": "sha512-Rc73uUCi3eJneO25DydLTfJYamXeuKS9YIhNMTKlpvcN1UQAmAnUbAmCuEmqvkYOiGD1i4/kd8kBga708iIikQ==", + "dev": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.215.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/smithy-client": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz", + "integrity": "sha512-PiZfCdZkPohzMPrRmJ46TPOf2Tr/dhKYdwQArRnOOIsJABUGXjlzCUE8vysDN35XZYRx5f9hd+/U7kayhniq2w==", + "dev": true, + "dependencies": { + "@aws-sdk/middleware-stack": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", + "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/url-parser": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz", + "integrity": "sha512-r/qIk3TUlV36JvoRjTErFm0LzzgNKLB1YUG8zVZCGAc2TEATi8OVEmsZvi+KfTmsbszulITJVcjZKbHLbGoUzg==", + "dev": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "dev": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.215.0.tgz", + "integrity": "sha512-MiNfZgB0I4dR8CBxH163W7c9KvE38sgCHNPWopMqSX5ezz7cuCPohCU0XsWd4I7K31PvzuqmKgOiKBAZraQJMA==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.215.0", + "@aws-sdk/types": "3.215.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.215.0.tgz", + "integrity": "sha512-mSp3R8GljQ+4UT3QMOksQk9L0cWbFLvR7bBmAlt4+GobgTjpRfzFjBP3uwrCqFa3BKDUR3FeJq3qwo+xeY1Krg==", + "dev": true, + "dependencies": { + "@aws-sdk/config-resolver": "3.215.0", + "@aws-sdk/credential-provider-imds": "3.215.0", + "@aws-sdk/node-config-provider": "3.215.0", + "@aws-sdk/property-provider": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-middleware": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.215.0.tgz", + "integrity": "sha512-DfHGlFlQCr+T/xhjS36HH8JEThDVB5lg5NZ6x4Cibhyeps9YX/4ovLAIx3B19H34sdWhZi7q6LfslCHLRu2+7Q==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.215.0.tgz", + "integrity": "sha512-uZz6BJWr8sJcA+onveS1lFqnbIXBHwvkyHLgCuuGhAxd5yY6YNLhpJBnhy9Fb8/aSbk6yao3qxlokqw9gthmAw==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz", + "integrity": "sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw==", + "dev": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-utf8-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", + "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", + "dev": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/client-sts": { "version": "3.231.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.231.0.tgz", @@ -1127,6 +1658,142 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/middleware-serde": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.215.0.tgz", + "integrity": "sha512-+uhLXdKvvQZcRRFc3UmemSr/YUHA4Jc+1YMjHxc3v8vvfztFJBb0wgBx999myOi8PmkYThlRBQDzXy9UCIhIJw==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/protocol-http": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.215.0.tgz", + "integrity": "sha512-qp6Y6v4S534LAjadiVl9p7ErK7ImphOKq6yhFyQwxko6iITLcz8ib3yU27fs4QJcnNj5ZooqW/YlL/0EikDxCQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/querystring-parser": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.215.0.tgz", + "integrity": "sha512-8h/9H8dWM4fZO27UGzo8W5JXln4yJMugPyUl4qFA437gzPgNFN95+oLJWXtHMlfCHC5T/PDKetY9TarMDgBD0Q==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/signature-v4": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.215.0.tgz", + "integrity": "sha512-Rc73uUCi3eJneO25DydLTfJYamXeuKS9YIhNMTKlpvcN1UQAmAnUbAmCuEmqvkYOiGD1i4/kd8kBga708iIikQ==", + "dev": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.215.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/types": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", + "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/url-parser": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz", + "integrity": "sha512-r/qIk3TUlV36JvoRjTErFm0LzzgNKLB1YUG8zVZCGAc2TEATi8OVEmsZvi+KfTmsbszulITJVcjZKbHLbGoUzg==", + "dev": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/util-middleware": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.215.0.tgz", + "integrity": "sha512-DfHGlFlQCr+T/xhjS36HH8JEThDVB5lg5NZ6x4Cibhyeps9YX/4ovLAIx3B19H34sdWhZi7q6LfslCHLRu2+7Q==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.226.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz", @@ -1399,6 +2066,41 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/property-provider": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz", + "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz", + "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", + "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/types": { "version": "3.226.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz", @@ -1432,6 +2134,31 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-base64/node_modules/@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-base64/node_modules/@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "dev": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/util-body-length-browser": { "version": "3.188.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index 67296b476a..5d1fb94f24 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -2,16 +2,33 @@ import { BaseProvider } from './BaseProvider'; import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; import type { SSMClientConfig, GetParameterCommandInput } from '@aws-sdk/client-ssm'; +interface SSMProviderOptionsBase { + awsSdkV3Client?: SSMClient + sdkConfig?: SSMClientConfig +} + +interface SSMOne extends SSMProviderOptionsBase { + awsSdkV3Client?: SSMClient + sdkConfig?: never +} + +interface SSMTwo extends SSMProviderOptionsBase { + awsSdkV3Client?: never + sdkConfig?: SSMClientConfig +} + +type SSMProviderOptions = SSMOne | SSMTwo; + class SSMProvider extends BaseProvider { public client: SSMClient; - public constructor(config: SSMClientConfig = {}) { + public constructor(options: SSMProviderOptions = {}) { super(); - this.client = new SSMClient(config); + this.client = new SSMClient(options); } protected async _get(name: string, sdkOptions?: Partial): Promise { - const options: Partial = { + const options: GetParameterCommandInput = { Name: name, }; if (sdkOptions) { From 3e30c1be9a8801964a48aff2a9eba4e5913aba33 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Sat, 3 Dec 2022 18:15:41 -0800 Subject: [PATCH 03/20] build: updated dependencies --- package-lock.json | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index be1f647afd..51b3a9184b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1788,6 +1788,10 @@ "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", "dev": true, "dependencies": { + "@aws-sdk/config-resolver": "3.222.0", + "@aws-sdk/endpoint-cache": "3.208.0", + "@aws-sdk/protocol-http": "3.222.0", + "@aws-sdk/types": "3.222.0", "tslib": "^2.3.1" }, "engines": { @@ -2146,11 +2150,10 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/util-base64/node_modules/@aws-sdk/util-buffer-from": { + "node_modules/@aws-sdk/util-buffer-from": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", - "dev": true, "dependencies": { "@aws-sdk/is-array-buffer": "3.201.0", "tslib": "^2.3.1" @@ -2178,18 +2181,6 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", - "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-sdk/util-config-provider": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", From 44af8bc1035feeeb22ca0742707b17973cc7fb62 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Sat, 3 Dec 2022 18:27:59 -0800 Subject: [PATCH 04/20] feat: base get --- packages/parameters/src/SSMProvider.ts | 23 ++----------- .../parameters/tests/unit/SSMProvider.test.ts | 34 +++++++++++++++---- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index 5d1fb94f24..7cf52373ad 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -2,29 +2,12 @@ import { BaseProvider } from './BaseProvider'; import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; import type { SSMClientConfig, GetParameterCommandInput } from '@aws-sdk/client-ssm'; -interface SSMProviderOptionsBase { - awsSdkV3Client?: SSMClient - sdkConfig?: SSMClientConfig -} - -interface SSMOne extends SSMProviderOptionsBase { - awsSdkV3Client?: SSMClient - sdkConfig?: never -} - -interface SSMTwo extends SSMProviderOptionsBase { - awsSdkV3Client?: never - sdkConfig?: SSMClientConfig -} - -type SSMProviderOptions = SSMOne | SSMTwo; - class SSMProvider extends BaseProvider { public client: SSMClient; - public constructor(options: SSMProviderOptions = {}) { + public constructor(config: SSMClientConfig = {}) { super(); - this.client = new SSMClient(options); + this.client = new SSMClient(config); } protected async _get(name: string, sdkOptions?: Partial): Promise { @@ -39,7 +22,7 @@ class SSMProvider extends BaseProvider { return result.Parameter?.Value; } - protected async _getMultiple(_path: string): Promise> { + protected _getMultiple(_path: string): Promise> { throw Error('Not implemented.'); } } diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index 8f26866d01..1425513eda 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -16,24 +16,30 @@ describe('Class: SSMProvider', () => { describe('Method: get', () => { - test('when called without sdkOptions, it gets the parameter using the name only', () => { + test('when called without sdkOptions, it gets the parameter using the name and with no decryption', async () => { // Prepare const provider = new SSMProvider(); - const client = mockClient(SSMClient).on(GetParameterCommand).resolves({}); const parameterName = 'foo'; + const parameterValue = 'foo'; + const client = mockClient(SSMClient).on(GetParameterCommand).resolves({ + Parameter: { + Value: parameterValue, + }, + }); // Act - provider.get(parameterName); + const value = await provider.get(parameterName); // Assess expect(client).toReceiveCommandWith(GetParameterCommand, { - Name: parameterName + Name: parameterName, }); + expect(value).toBe(parameterValue); }); - test('when called with sdkOptions, it gets the parameter using the parameters', () => { + test('when called with sdkOptions, it gets the parameter using the parameters', async () => { // Prepare const provider = new SSMProvider(); @@ -41,16 +47,30 @@ describe('Class: SSMProvider', () => { const parameterName = 'foo'; // Act - provider.get(parameterName, { sdkOptions: { } }); + provider.get(parameterName, { sdkOptions: { WithDecryption: true } }); // Assess expect(client).toReceiveCommandWith(GetParameterCommand, { Name: parameterName, - + WithDecryption: true, }); }); }); + describe('Method: _getMultiple', () => { + + test('when called throws', async () => { + + // Prepare + const provider = new SSMProvider(); + + // Act / Assess + expect(provider.getMultiple('foo')).rejects.toThrow('Not implemented.'); + + }); + + }); + }); \ No newline at end of file From ced3850b62e236d81243a42d8b01840731b78cdf Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Sat, 3 Dec 2022 19:56:07 -0800 Subject: [PATCH 05/20] feat: added decrypt option to get param --- packages/parameters/src/types/SSMProvider.ts | 25 +++++++++++++++++++ .../tests/unit/BaseProvider.test.ts | 2 +- .../parameters/tests/unit/SSMProvider.test.ts | 18 +++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 packages/parameters/src/types/SSMProvider.ts diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts new file mode 100644 index 0000000000..e37350c7ef --- /dev/null +++ b/packages/parameters/src/types/SSMProvider.ts @@ -0,0 +1,25 @@ +import type { GetParameterCommandInput } from '@aws-sdk/client-ssm'; +import type { TransformOptions } from 'types/BaseProvider'; + +/** + * Options for the SSMProvider get method. + * + * @interface SSMGetOptionsInterface + * @extends {GetOptionsInterface} + * @property {boolean} decrypt - If true, the parameter will be decrypted. + * @property {Partial} sdkOptions - Options for the AWS SDK. + */ +interface SSMGetOptionsInterface { + maxAge?: number + sdkOptions?: Partial + forceFetch?: boolean + decrypt?: boolean + transform?: TransformOptions +} + +const isSSMGetOptionsInterface = (options: unknown): options is SSMGetOptionsInterface => (options as SSMGetOptionsInterface).decrypt !== undefined; + +export { + SSMGetOptionsInterface, + isSSMGetOptionsInterface, +}; \ No newline at end of file diff --git a/packages/parameters/tests/unit/BaseProvider.test.ts b/packages/parameters/tests/unit/BaseProvider.test.ts index 68e29d22d3..1227d68b1b 100644 --- a/packages/parameters/tests/unit/BaseProvider.test.ts +++ b/packages/parameters/tests/unit/BaseProvider.test.ts @@ -111,7 +111,7 @@ describe('Class: BaseProvider', () => { }); - test('when called and values cached are expired, it returns the remote values', async () => { + test('when called and cached value is expired, it returns the remote value', async () => { // Prepare const mockData = 'my-remote-value'; diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index 1425513eda..f2ea4376e3 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -57,6 +57,24 @@ describe('Class: SSMProvider', () => { }); + test('when called with the decrypt option, the WithDecryption parameter is passed to the sdk client', async () => { + + // Prepare + const provider = new SSMProvider(); + const client = mockClient(SSMClient).on(GetParameterCommand).resolves({}); + const parameterName = 'foo'; + + // Act + provider.get(parameterName, { decrypt: true }); + + // Assess + expect(client).toReceiveCommandWith(GetParameterCommand, { + Name: parameterName, + WithDecryption: true, + }); + + }); + }); describe('Method: _getMultiple', () => { From d8dfc43f71afb3a89defc1dc27138b353e11718c Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Sat, 3 Dec 2022 20:33:43 -0800 Subject: [PATCH 06/20] feat: implemented getParameter function --- packages/parameters/src/BaseProvider.ts | 3 + packages/parameters/src/SSMProvider.ts | 14 +++- .../parameters/tests/unit/SSMProvider.test.ts | 2 +- .../tests/unit/getParameter.test.ts | 65 +++++++++++++++++++ 4 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 packages/parameters/tests/unit/getParameter.test.ts diff --git a/packages/parameters/src/BaseProvider.ts b/packages/parameters/src/BaseProvider.ts index d677f06c21..13e02d8865 100644 --- a/packages/parameters/src/BaseProvider.ts +++ b/packages/parameters/src/BaseProvider.ts @@ -9,6 +9,9 @@ import type { BaseProviderInterface, GetMultipleOptionsInterface, GetOptionsInte // These providers are dinamycally intialized on first use of the helper functions const DEFAULT_PROVIDERS: Record = {}; +// These providers will be dynamically initialized on first use of the helper functions +const DEFAULT_PROVIDERS: { [key: string]: BaseProvider } = {}; + abstract class BaseProvider implements BaseProviderInterface { protected store: Map; diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index 7cf52373ad..9f86a4b0b2 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -1,6 +1,7 @@ -import { BaseProvider } from './BaseProvider'; +import { BaseProvider, DEFAULT_PROVIDERS } from './BaseProvider'; import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; import type { SSMClientConfig, GetParameterCommandInput } from '@aws-sdk/client-ssm'; +import type { SSMGetOptionsInterface } from 'types/SSMProvider'; class SSMProvider extends BaseProvider { public client: SSMClient; @@ -27,6 +28,15 @@ class SSMProvider extends BaseProvider { } } +const getParameter = (name: string, options?: SSMGetOptionsInterface): Promise> => { + if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { + DEFAULT_PROVIDERS.ssm = new SSMProvider(); + } + + return DEFAULT_PROVIDERS.ssm.get(name, options); +}; + export { - SSMProvider + SSMProvider, + getParameter, }; \ No newline at end of file diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index f2ea4376e3..90ad1f4809 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -1,7 +1,7 @@ /** * Test SSMProvider class * - * @group unit/idempotency/all + * @group unit/parameters/SSMProvider/class */ import { SSMProvider } from '../../src/SSMProvider'; import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; diff --git a/packages/parameters/tests/unit/getParameter.test.ts b/packages/parameters/tests/unit/getParameter.test.ts new file mode 100644 index 0000000000..b64609e46d --- /dev/null +++ b/packages/parameters/tests/unit/getParameter.test.ts @@ -0,0 +1,65 @@ +/** + * Test getParameter function + * + * @group unit/parameters/SSMProvider/getParameter/function + */ +import { DEFAULT_PROVIDERS } from '../../src/BaseProvider'; +import { SSMProvider, getParameter } from '../../src/SSMProvider'; +import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; + +describe('Function: getParameter', () => { + + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('when called and a default provider doesn\'t exist, it instantiates one and returns the value', async () => { + + // Prepare + const parameterName = 'foo'; + const parameterValue = 'foo'; + const client = mockClient(SSMClient).on(GetParameterCommand).resolves({ + Parameter: { + Value: parameterValue, + }, + }); + + // Act + const value = await getParameter(parameterName); + + // Assess + expect(client).toReceiveCommandWith(GetParameterCommand, { + Name: parameterName, + }); + expect(value).toBe(parameterValue); + + }); + + test('when called and a default provider exists, it uses it and returns the value', async () => { + + // Prepare + const provider = new SSMProvider(); + DEFAULT_PROVIDERS.ssm = provider; + const parameterName = 'foo'; + const parameterValue = 'foo'; + const client = mockClient(SSMClient).on(GetParameterCommand).resolves({ + Parameter: { + Value: parameterValue, + }, + }); + + // Act + const value = await getParameter(parameterName); + + // Assess + expect(client).toReceiveCommandWith(GetParameterCommand, { + Name: parameterName, + }); + expect(value).toBe(parameterValue); + expect(DEFAULT_PROVIDERS.ssm).toBe(provider); + + }); + +}); \ No newline at end of file From 6a0df44b1b4f8869bb3390c4c64b7ff95a997e5d Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 13 Dec 2022 12:43:35 +0100 Subject: [PATCH 07/20] feat: SSMProvider.getMultiple --- packages/parameters/src/BaseProvider.ts | 3 - packages/parameters/src/SSMProvider.ts | 43 +++++- packages/parameters/src/types/SSMProvider.ts | 19 ++- .../parameters/tests/unit/SSMProvider.test.ts | 143 +++++++++++++++++- 4 files changed, 193 insertions(+), 15 deletions(-) diff --git a/packages/parameters/src/BaseProvider.ts b/packages/parameters/src/BaseProvider.ts index 13e02d8865..d677f06c21 100644 --- a/packages/parameters/src/BaseProvider.ts +++ b/packages/parameters/src/BaseProvider.ts @@ -9,9 +9,6 @@ import type { BaseProviderInterface, GetMultipleOptionsInterface, GetOptionsInte // These providers are dinamycally intialized on first use of the helper functions const DEFAULT_PROVIDERS: Record = {}; -// These providers will be dynamically initialized on first use of the helper functions -const DEFAULT_PROVIDERS: { [key: string]: BaseProvider } = {}; - abstract class BaseProvider implements BaseProviderInterface { protected store: Map; diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index 9f86a4b0b2..5c62d578dd 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -1,7 +1,8 @@ import { BaseProvider, DEFAULT_PROVIDERS } from './BaseProvider'; -import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; -import type { SSMClientConfig, GetParameterCommandInput } from '@aws-sdk/client-ssm'; +import { SSMClient, GetParameterCommand, paginateGetParametersByPath } from '@aws-sdk/client-ssm'; +import type { SSMClientConfig, GetParameterCommandInput, GetParametersByPathCommandInput } from '@aws-sdk/client-ssm'; import type { SSMGetOptionsInterface } from 'types/SSMProvider'; +import { PaginationConfiguration } from '@aws-sdk/types'; class SSMProvider extends BaseProvider { public client: SSMClient; @@ -23,8 +24,42 @@ class SSMProvider extends BaseProvider { return result.Parameter?.Value; } - protected _getMultiple(_path: string): Promise> { - throw Error('Not implemented.'); + protected async _getMultiple(path: string, sdkOptions?: Partial): Promise> { + const options: GetParametersByPathCommandInput = { + Path: path, + }; + const paginationOptions: PaginationConfiguration = { + client: this.client + }; + if (sdkOptions) { + Object.assign(options, sdkOptions); + if (sdkOptions.MaxResults) { + paginationOptions.pageSize = sdkOptions.MaxResults; + } + } + + const parameters: Record = {}; + for await (const page of paginateGetParametersByPath(paginationOptions, options)) { + for (const parameter of page.Parameters || []) { + /** + * Standardize the parameter name + * + * The parameter name returned by SSM will contain the full path. + * However, for readability, we should return only the part after the path. + **/ + + // If the parameter is present in the response, then it has a Name + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + let name = parameter.Name!; + name = name.replace(path, ''); + if (name.startsWith('/')) { + name = name.replace('/', ''); + } + parameters[name] = parameter.Value; + } + } + + return parameters; } } diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index e37350c7ef..be976e3c8a 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -1,4 +1,4 @@ -import type { GetParameterCommandInput } from '@aws-sdk/client-ssm'; +import type { GetParameterCommandInput, GetParametersByPathCommandInput } from '@aws-sdk/client-ssm'; import type { TransformOptions } from 'types/BaseProvider'; /** @@ -19,7 +19,24 @@ interface SSMGetOptionsInterface { const isSSMGetOptionsInterface = (options: unknown): options is SSMGetOptionsInterface => (options as SSMGetOptionsInterface).decrypt !== undefined; +interface SSMGetMultipleOptionsInterface { + maxAge?: number + forceFetch?: boolean + sdkOptions?: Partial + decrypt?: boolean + recursive?: boolean + transform?: string + throwOnTransformError?: boolean +} + +const isSSMGetMultipleOptionsInterface = + (options: unknown): options is SSMGetMultipleOptionsInterface => + (options as SSMGetMultipleOptionsInterface).decrypt !== undefined || + (options as SSMGetMultipleOptionsInterface).recursive !== undefined; + export { SSMGetOptionsInterface, isSSMGetOptionsInterface, + SSMGetMultipleOptionsInterface, + isSSMGetMultipleOptionsInterface, }; \ No newline at end of file diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index 90ad1f4809..f5b535b87d 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -4,7 +4,7 @@ * @group unit/parameters/SSMProvider/class */ import { SSMProvider } from '../../src/SSMProvider'; -import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; +import { SSMClient, GetParameterCommand, GetParametersByPathCommand } from '@aws-sdk/client-ssm'; import { mockClient } from 'aws-sdk-client-mock'; import 'aws-sdk-client-mock-jest'; @@ -14,7 +14,7 @@ describe('Class: SSMProvider', () => { jest.clearAllMocks(); }); - describe('Method: get', () => { + describe('Method: _get', () => { test('when called without sdkOptions, it gets the parameter using the name and with no decryption', async () => { @@ -47,7 +47,7 @@ describe('Class: SSMProvider', () => { const parameterName = 'foo'; // Act - provider.get(parameterName, { sdkOptions: { WithDecryption: true } }); + await provider.get(parameterName, { sdkOptions: { WithDecryption: true } }); // Assess expect(client).toReceiveCommandWith(GetParameterCommand, { @@ -65,7 +65,7 @@ describe('Class: SSMProvider', () => { const parameterName = 'foo'; // Act - provider.get(parameterName, { decrypt: true }); + await provider.get(parameterName, { decrypt: true }); // Assess expect(client).toReceiveCommandWith(GetParameterCommand, { @@ -79,13 +79,142 @@ describe('Class: SSMProvider', () => { describe('Method: _getMultiple', () => { - test('when called throws', async () => { + test('when called with only a path, it passes it to the sdk', async () => { // Prepare const provider = new SSMProvider(); + const client = mockClient(SSMClient).on(GetParametersByPathCommand) + .resolves({}); + const parameterPath = '/foo'; - // Act / Assess - expect(provider.getMultiple('foo')).rejects.toThrow('Not implemented.'); + // Act + await provider.getMultiple(parameterPath); + + // Assess + expect(client).toReceiveCommandWith(GetParametersByPathCommand, { + Path: parameterPath, + }); + + }); + + test('when called with a path and sdkOptions, it passes them to the sdk', async () => { + + // Prepare + const provider = new SSMProvider(); + const client = mockClient(SSMClient).on(GetParametersByPathCommand) + .resolves({ + Parameters: [] + }); + const parameterPath = '/foo'; + + // Act + await provider.getMultiple(parameterPath, { sdkOptions: { MaxResults: 10 } }); + + // Assess + expect(client).toReceiveCommandWith(GetParametersByPathCommand, { + Path: parameterPath, + MaxResults: 10, + }); + + }); + + test('when called with no options, it uses the default sdk options', async () => { + + // Prepare + const provider = new SSMProvider(); + const client = mockClient(SSMClient).on(GetParametersByPathCommand) + .resolves({ + Parameters: [] + }); + const parameterPath = '/foo'; + + // Act + await provider.getMultiple(parameterPath); + + // Assess + expect(client).toReceiveCommandWith(GetParametersByPathCommand, { + Path: parameterPath, + }); + + }); + + test('when called with decrypt or recursive, it passes them to the sdk', async () => { + + // Prepare + const provider = new SSMProvider(); + const client = mockClient(SSMClient).on(GetParametersByPathCommand) + .resolves({ + Parameters: [] + }); + const parameterPath = '/foo'; + + // Act + await provider.getMultiple(parameterPath, { recursive: false, decrypt: true }); + + // Assess + expect(client).toReceiveCommandWith(GetParametersByPathCommand, { + Path: parameterPath, + Recursive: false, + WithDecryption: true, + }); + + }); + + test('when multiple parameters that share the same path as suffix are retrieved, it returns an object with the names only', async () => { + + // Prepare + const provider = new SSMProvider(); + mockClient(SSMClient).on(GetParametersByPathCommand) + .resolves({ + Parameters: [ { + 'Name':'/foo/bar', + 'Value':'bar', + }, { + 'Name':'/foo/baz', + 'Value':'baz', + } ] + }); + const parameterPath = '/foo'; + + // Act + const parameters = await provider.getMultiple(parameterPath); + + // Assess + expect(parameters).toEqual({ + 'bar': 'bar', + 'baz': 'baz', + }); + + }); + + test('when multiple pages are found, it returns an object with all the parameters', async () => { + + // Prepare + const provider = new SSMProvider(); + mockClient(SSMClient).on(GetParametersByPathCommand) + .resolvesOnce({ + Parameters: [{ + 'Name':'/foo/bar', + 'Value':'bar', + }], + NextToken: 'someToken', + }) + .resolves({ + Parameters: [{ + 'Name':'/foo/baz', + 'Value':'baz', + }] + }); + const parameterPath = '/foo'; + + // Act + const parameters = await provider.getMultiple(parameterPath); + + // Assess + expect(parameters).toEqual({ + 'bar': 'bar', + 'baz': 'baz', + }); }); From fc71a247dd59cf80d31c3f19cbf2ef6ddc8323cd Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 13 Dec 2022 12:57:13 +0100 Subject: [PATCH 08/20] feat: getParameters fn --- packages/parameters/src/SSMProvider.ts | 13 +++- .../parameters/tests/unit/SSMProvider.test.ts | 8 +-- .../tests/unit/getParameters.test.ts | 71 +++++++++++++++++++ 3 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 packages/parameters/tests/unit/getParameters.test.ts diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index 5c62d578dd..d97a553d4a 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -1,8 +1,8 @@ import { BaseProvider, DEFAULT_PROVIDERS } from './BaseProvider'; import { SSMClient, GetParameterCommand, paginateGetParametersByPath } from '@aws-sdk/client-ssm'; import type { SSMClientConfig, GetParameterCommandInput, GetParametersByPathCommandInput } from '@aws-sdk/client-ssm'; -import type { SSMGetOptionsInterface } from 'types/SSMProvider'; -import { PaginationConfiguration } from '@aws-sdk/types'; +import type { SSMGetMultipleOptionsInterface, SSMGetOptionsInterface } from 'types/SSMProvider'; +import type { PaginationConfiguration } from '@aws-sdk/types'; class SSMProvider extends BaseProvider { public client: SSMClient; @@ -71,7 +71,16 @@ const getParameter = (name: string, options?: SSMGetOptionsInterface): Promise> => { + if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { + DEFAULT_PROVIDERS.ssm = new SSMProvider(); + } + + return DEFAULT_PROVIDERS.ssm.getMultiple(path, options); +}; + export { SSMProvider, getParameter, + getParameters, }; \ No newline at end of file diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index f5b535b87d..234df846e6 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -194,15 +194,15 @@ describe('Class: SSMProvider', () => { mockClient(SSMClient).on(GetParametersByPathCommand) .resolvesOnce({ Parameters: [{ - 'Name':'/foo/bar', - 'Value':'bar', + Name:'/foo/bar', + Value:'bar', }], NextToken: 'someToken', }) .resolves({ Parameters: [{ - 'Name':'/foo/baz', - 'Value':'baz', + Name:'/foo/baz', + Value:'baz', }] }); const parameterPath = '/foo'; diff --git a/packages/parameters/tests/unit/getParameters.test.ts b/packages/parameters/tests/unit/getParameters.test.ts new file mode 100644 index 0000000000..3c964941ec --- /dev/null +++ b/packages/parameters/tests/unit/getParameters.test.ts @@ -0,0 +1,71 @@ +/** + * Test getParameters function + * + * @group unit/parameters/SSMProvider/getParameters/function + */ +import { DEFAULT_PROVIDERS } from '../../src/BaseProvider'; +import { SSMProvider, getParameters } from '../../src/SSMProvider'; +import { SSMClient, GetParametersByPathCommand } from '@aws-sdk/client-ssm'; +import { mockClient } from 'aws-sdk-client-mock'; +import 'aws-sdk-client-mock-jest'; + +describe('Function: getParameters', () => { + + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('when called and a default provider doesn\'t exist, it instantiates one and returns the value', async () => { + + // Prepare + const parameterPath = '/foo'; + const parameterValue = 'bar'; + const client = mockClient(SSMClient).on(GetParametersByPathCommand).resolves({ + Parameters: [{ + Name: '/foo/bar', + Value: parameterValue, + }], + }); + + // Act + const parameters = await getParameters(parameterPath); + + // Assess + expect(client).toReceiveCommandWith(GetParametersByPathCommand, { + Path: parameterPath, + }); + expect(parameters).toEqual({ + bar: parameterValue, + }); + + }); + + test('when called and a default provider exists, it uses it and returns the value', async () => { + + // Prepare + const provider = new SSMProvider(); + DEFAULT_PROVIDERS.ssm = provider; + const parameterPath = '/foo'; + const parameterValue = 'bar'; + const client = mockClient(SSMClient).on(GetParametersByPathCommand).resolves({ + Parameters: [{ + Name: '/foo/bar', + Value: parameterValue, + }], + }); + + // Act + const parameters = await getParameters(parameterPath); + + // Assess + expect(client).toReceiveCommandWith(GetParametersByPathCommand, { + Path: parameterPath, + }); + expect(parameters).toEqual({ + 'bar': parameterValue, + }); + expect(DEFAULT_PROVIDERS.ssm).toBe(provider); + + }); + +}); \ No newline at end of file From fa89c805a6a41193d423ce5a70da624f7308fbf4 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 21 Dec 2022 15:26:00 +0100 Subject: [PATCH 09/20] chore: merge conflicts --- package-lock.json | 1378 ++++++++++++++++++++------------------------- 1 file changed, 599 insertions(+), 779 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51b3a9184b..f73c13e702 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,9 +72,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.30.tgz", - "integrity": "sha512-mFRF5n1jxjKpX8ZZSCRhJc6Hj8BkeZFUPwK0j6jRcouQQZHsZyydbf4UuzMYQ4SZU6cCLM7DKmWO0Kx156ZSnw==", + "version": "2.2.36", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.36.tgz", + "integrity": "sha512-q4jde7ZqXjOfnEPjfn/VNIKmTFBg4GWCn5KxB8EDny6FWhGE+TkJxTjyu4KgUvcRZCvNqsdWvxGMQOFTTsqaVA==", "dev": true }, "node_modules/@aws-cdk/asset-kubectl-v20": { @@ -90,9 +90,9 @@ "dev": true }, "node_modules/@aws-cdk/cfnspec": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-2.55.0.tgz", - "integrity": "sha512-lwBV4MxkIO0IIctyylsG+RkdgcMkUdogY34dx23bFuaxmchmGEsx++PyOS4Q/UQojc01JuOiIN5xT9iQBNQQvA==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-2.55.1.tgz", + "integrity": "sha512-jJCaEV9pTLFft2eYkwmblfxUBQeJSH4KbMteiVQdp6wkYbzoj/sjyFInfKHgtfIOeqjNtPZ74Dhl5fRJsOpBDw==", "dev": true, "dependencies": { "fs-extra": "^9.1.0", @@ -100,9 +100,9 @@ } }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.55.0.tgz", - "integrity": "sha512-SZ1Ojl8lOm0X1TUWCR8dTuGMmEJwtZwfTo1S39BiF4RsUungksBj30Us8wtdgaPrWx455mUgbWaY9JQ4ZcEyJw==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.55.1.tgz", + "integrity": "sha512-VVVQaqHP2PsNGRwfPsq1RxoOfyC54DO8RH+2nHqCyPIfSmrIH6Ux5Uk7KAURyXKdb3SjKra66bxPOzvXHOaBXg==", "bundleDependencies": [ "jsonschema", "semver" @@ -159,12 +159,12 @@ "license": "ISC" }, "node_modules/@aws-cdk/cloudformation-diff": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.55.0.tgz", - "integrity": "sha512-yvZOH37itWcDwvQdnGOTQPtR+GkgLf9lYsICrOmly/+di++H5p29VS8hgm67n5Mk7EWz0KyqnbZ9hiM++TJ6Jw==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.55.1.tgz", + "integrity": "sha512-WgLubFXoQFGZuOkm7YtJx+kS8EN6rX9K6s257qFR7yNGpKBANSPVvWmlWX2qSvg++AkNSxKsuaZi+4V50TNbdA==", "dev": true, "dependencies": { - "@aws-cdk/cfnspec": "2.55.0", + "@aws-cdk/cfnspec": "2.55.1", "@types/node": "^14.18.34", "chalk": "^4", "diff": "^5.1.0", @@ -177,28 +177,28 @@ } }, "node_modules/@aws-cdk/cloudformation-diff/node_modules/@types/node": { - "version": "14.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.34.tgz", - "integrity": "sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==", + "version": "14.18.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.35.tgz", + "integrity": "sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw==", "dev": true }, "node_modules/@aws-cdk/cx-api": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-2.55.0.tgz", - "integrity": "sha512-KhYPBqEL24mQuEqHHdhcSc8jy7w69bD+NQjji54QGEA1tp+1gaUebTBIlTiOPbB3fzU8GR3f3ALnOQI3wJzr/Q==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-2.55.1.tgz", + "integrity": "sha512-gWQCn/9gaayf2ev0HjCMQleY1gWJZGImLhsUF8kneYnOPCm/r0qpIzy3BxiWiDFLPh9gykDvHQhpH6EG0aXnGA==", "bundleDependencies": [ "semver" ], "dev": true, "dependencies": { - "@aws-cdk/cloud-assembly-schema": "2.55.0", + "@aws-cdk/cloud-assembly-schema": "2.55.1", "semver": "^7.3.8" }, "engines": { "node": ">= 14.15.0" }, "peerDependencies": { - "@aws-cdk/cloud-assembly-schema": "2.55.0" + "@aws-cdk/cloud-assembly-schema": "2.55.1" } }, "node_modules/@aws-cdk/cx-api/node_modules/lru-cache": { @@ -347,25 +347,25 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.231.0.tgz", - "integrity": "sha512-WvNM3NmsFFB7S7I5B2PECe945bEzdwU3MElLznmcbccaRf31S61C4EAkghm6hXz0EoZlgdRfBqHaRB1PgmAUuA==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.235.0.tgz", + "integrity": "sha512-GTRrc7EED3er8HNlnfLHI4oFT/sXS84rlUy3acYzLTiYfASK3YUspZ/cu7CF7MGJaiXXIS1pEm88rK2N4hap/g==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.231.0", - "@aws-sdk/config-resolver": "3.231.0", - "@aws-sdk/credential-provider-node": "3.231.0", + "@aws-sdk/client-sts": "3.235.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-node": "3.235.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", "@aws-sdk/middleware-content-length": "3.226.0", "@aws-sdk/middleware-endpoint": "3.226.0", - "@aws-sdk/middleware-endpoint-discovery": "3.231.0", + "@aws-sdk/middleware-endpoint-discovery": "3.234.0", "@aws-sdk/middleware-host-header": "3.226.0", "@aws-sdk/middleware-logger": "3.226.0", "@aws-sdk/middleware-recursion-detection": "3.226.0", - "@aws-sdk/middleware-retry": "3.229.0", + "@aws-sdk/middleware-retry": "3.235.0", "@aws-sdk/middleware-serde": "3.226.0", "@aws-sdk/middleware-signing": "3.226.0", "@aws-sdk/middleware-stack": "3.226.0", @@ -373,14 +373,14 @@ "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/node-http-handler": "3.226.0", "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/url-parser": "3.226.0", "@aws-sdk/util-base64": "3.208.0", "@aws-sdk/util-body-length-browser": "3.188.0", "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.226.0", - "@aws-sdk/util-defaults-mode-node": "3.231.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", "@aws-sdk/util-endpoints": "3.226.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", @@ -751,13 +751,13 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.231.0.tgz", - "integrity": "sha512-/q7BptaMiT6/wxW9vE/gcQuApMXio5vdTuqt77A6+mjqhNzYFfCn7RRS4BU8KEOpZObnYBKP3mYe3NDccEbMzQ==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.235.0.tgz", + "integrity": "sha512-CdZ2EnDuB6V41u6brk/Nt19EZneLorsNkNWr4J7zkR/2gKiqdUN6PUs6jxDtK9M7V/r81jaE0ViLwLVmYhL/bQ==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -766,21 +766,21 @@ "@aws-sdk/middleware-host-header": "3.226.0", "@aws-sdk/middleware-logger": "3.226.0", "@aws-sdk/middleware-recursion-detection": "3.226.0", - "@aws-sdk/middleware-retry": "3.229.0", + "@aws-sdk/middleware-retry": "3.235.0", "@aws-sdk/middleware-serde": "3.226.0", "@aws-sdk/middleware-stack": "3.226.0", "@aws-sdk/middleware-user-agent": "3.226.0", "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/node-http-handler": "3.226.0", "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/url-parser": "3.226.0", "@aws-sdk/util-base64": "3.208.0", "@aws-sdk/util-body-length-browser": "3.188.0", "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.226.0", - "@aws-sdk/util-defaults-mode-node": "3.231.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", "@aws-sdk/util-endpoints": "3.226.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", @@ -794,13 +794,13 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.231.0.tgz", - "integrity": "sha512-yqEZW9/Q6VvMDMcQoE52oa/oa6F8z8cqyax7m29VpuVrncYcfELpkZKWPoaJVfierR5ysKfKiAU0acPgMpvllQ==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.235.0.tgz", + "integrity": "sha512-oSF0lSPmE5jaaigxc5TZyDjqfgTiDsromEdvv5s5a/qAOZBNtsVaS4+8cn9kIt43Ceo7dxHXk7cwvXMNPwVnWw==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -809,21 +809,21 @@ "@aws-sdk/middleware-host-header": "3.226.0", "@aws-sdk/middleware-logger": "3.226.0", "@aws-sdk/middleware-recursion-detection": "3.226.0", - "@aws-sdk/middleware-retry": "3.229.0", + "@aws-sdk/middleware-retry": "3.235.0", "@aws-sdk/middleware-serde": "3.226.0", "@aws-sdk/middleware-stack": "3.226.0", "@aws-sdk/middleware-user-agent": "3.226.0", "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/node-http-handler": "3.226.0", "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/url-parser": "3.226.0", "@aws-sdk/util-base64": "3.208.0", "@aws-sdk/util-body-length-browser": "3.188.0", "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.226.0", - "@aws-sdk/util-defaults-mode-node": "3.231.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", "@aws-sdk/util-endpoints": "3.226.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", @@ -1368,14 +1368,14 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.231.0.tgz", - "integrity": "sha512-5WYqlcbM49ofOFBsu28QBt3t26M5D9XynhSaswSrCzawwdNkIMYQrKOCplF5mqOy+GywVIRrFeCVVrAKPMZJxQ==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.235.0.tgz", + "integrity": "sha512-P1pqvg7brdBUGrTlyMc+LCe6rnWrWufdd7bpzuC9lcVzkoOHJw8j8wDItwoCsvy1O3SeK7vtmOTLxV2yuTEO3Q==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.231.0", - "@aws-sdk/credential-provider-node": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-node": "3.235.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -1384,7 +1384,7 @@ "@aws-sdk/middleware-host-header": "3.226.0", "@aws-sdk/middleware-logger": "3.226.0", "@aws-sdk/middleware-recursion-detection": "3.226.0", - "@aws-sdk/middleware-retry": "3.229.0", + "@aws-sdk/middleware-retry": "3.235.0", "@aws-sdk/middleware-sdk-sts": "3.226.0", "@aws-sdk/middleware-serde": "3.226.0", "@aws-sdk/middleware-signing": "3.226.0", @@ -1393,14 +1393,14 @@ "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/node-http-handler": "3.226.0", "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/url-parser": "3.226.0", "@aws-sdk/util-base64": "3.208.0", "@aws-sdk/util-body-length-browser": "3.188.0", "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.226.0", - "@aws-sdk/util-defaults-mode-node": "3.231.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", "@aws-sdk/util-endpoints": "3.226.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", @@ -1415,9 +1415,9 @@ } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.231.0.tgz", - "integrity": "sha512-qpjV4Fw/NQ4a0p5/qwzqaShflYRlY/SPcgA7N5GTJjIjZjg3NV+5BKJSF3VeZcNKfbXq68kkn207OSCpyheYxQ==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz", + "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==", "dependencies": { "@aws-sdk/signature-v4": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -1458,13 +1458,14 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.231.0.tgz", - "integrity": "sha512-4JJgrJg2O91Vki4m5nSQNZGX/5yAYgzG1IOjeZ+8vCDxfR+jA2O9+/Xhi2/8aDpb1da77OJ+cK1+ezzSMchIfQ==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.235.0.tgz", + "integrity": "sha512-i3efxJw+9hN/opmjlRqT0lv/gKjOHmgGBUbFCdbCmSUTc8QH3sbkIY6FLX2q0PSu4q4CpCwWZ587lkThtFerJA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.231.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.235.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -1476,15 +1477,15 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.231.0.tgz", - "integrity": "sha512-DOojjyYdLNeBQv9+PaDXmvvww9SmcZsaL1YCl27e5larcJSMfT41vn4WRnVRu2zBI2BIi464Z8ziRRKwd2YFVg==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.235.0.tgz", + "integrity": "sha512-xJSAntEBlbXbngSzpyMnlZzOldxV0sNOQ7ggDUmIQNVWbu3XwP6MiA8CjAHnH10vs6+pcyHtpfUj3evdQZ4JlQ==", "dependencies": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/credential-provider-ini": "3.231.0", + "@aws-sdk/credential-provider-ini": "3.235.0", "@aws-sdk/credential-provider-process": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.231.0", + "@aws-sdk/credential-provider-sso": "3.235.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -1510,14 +1511,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.231.0.tgz", - "integrity": "sha512-aImUD+PAqZ7A2C1ef7gskMN3KuxFT4Am1Vrl6M0oLGyrhKG2QtRT/UaXJE+Yt6d/C2qc2OsQ9j2oim7D6Qha/A==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.235.0.tgz", + "integrity": "sha512-+7UORB7Wo/d0mEz7J16/hsRumIhtdl4KekJfrXH5OrLiXXIsn68wmQkrvwD2CibbtgOY0P69G12qbcBHkg3qng==", "dependencies": { - "@aws-sdk/client-sso": "3.231.0", + "@aws-sdk/client-sso": "3.235.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", - "@aws-sdk/token-providers": "3.231.0", + "@aws-sdk/token-providers": "3.235.0", "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" }, @@ -1596,11 +1597,11 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.231.0.tgz", - "integrity": "sha512-q1gvuxBQGR+xflaTbEP9Q+jCqnuqtznVrKt26skVUvzjmJJLB1dxHxwUPHv6SKO3R+bby7ATlVGQwQkZxViSGA==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.235.0.tgz", + "integrity": "sha512-jugMLrtVBCxK5+vFTEhm6Gb5MbvE14HUvN/WoMhAZFOYD0v0DEfzutyD2mwCpCJQJeQbMKz3q6YEhDFgbyBXSA==", "dependencies": { - "@aws-sdk/util-dynamodb": "3.231.0", + "@aws-sdk/util-dynamodb": "3.235.0", "tslib": "^2.3.1" }, "engines": { @@ -1644,11 +1645,11 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.231.0.tgz", - "integrity": "sha512-8HRZRrZWuAlm/I8uwFG8+iK8TCJWHSizRTEZfNazx7V5anOk55UeCVg3ifuXnFPmGeb4VDBRTn4h2dUx4LRKLQ==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.234.0.tgz", + "integrity": "sha512-HNZJbxXrSJfITJjAisqrju7T4S7U186xcmYr28CZX9XQNm6fc/bxcqj+8JRntWsekiJYyTvQLIrKxiCaa+TA9A==", "dependencies": { - "@aws-sdk/config-resolver": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", "@aws-sdk/endpoint-cache": "3.208.0", "@aws-sdk/protocol-http": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -1658,146 +1659,6 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/is-array-buffer": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", - "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", - "dev": true, - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/middleware-serde": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.215.0.tgz", - "integrity": "sha512-+uhLXdKvvQZcRRFc3UmemSr/YUHA4Jc+1YMjHxc3v8vvfztFJBb0wgBx999myOi8PmkYThlRBQDzXy9UCIhIJw==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/protocol-http": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.215.0.tgz", - "integrity": "sha512-qp6Y6v4S534LAjadiVl9p7ErK7ImphOKq6yhFyQwxko6iITLcz8ib3yU27fs4QJcnNj5ZooqW/YlL/0EikDxCQ==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/querystring-parser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.215.0.tgz", - "integrity": "sha512-8h/9H8dWM4fZO27UGzo8W5JXln4yJMugPyUl4qFA437gzPgNFN95+oLJWXtHMlfCHC5T/PDKetY9TarMDgBD0Q==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/signature-v4": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.215.0.tgz", - "integrity": "sha512-Rc73uUCi3eJneO25DydLTfJYamXeuKS9YIhNMTKlpvcN1UQAmAnUbAmCuEmqvkYOiGD1i4/kd8kBga708iIikQ==", - "dev": true, - "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.215.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.215.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/types": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", - "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/url-parser": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz", - "integrity": "sha512-r/qIk3TUlV36JvoRjTErFm0LzzgNKLB1YUG8zVZCGAc2TEATi8OVEmsZvi+KfTmsbszulITJVcjZKbHLbGoUzg==", - "dev": true, - "dependencies": { - "@aws-sdk/querystring-parser": "3.215.0", - "@aws-sdk/types": "3.215.0", - "tslib": "^2.3.1" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/util-config-provider": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", - "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", - "dev": true, - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", - "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", - "dev": true, - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/util-middleware": { - "version": "3.215.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.215.0.tgz", - "integrity": "sha512-DfHGlFlQCr+T/xhjS36HH8JEThDVB5lg5NZ6x4Cibhyeps9YX/4ovLAIx3B19H34sdWhZi7q6LfslCHLRu2+7Q==", - "dev": true, - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-endpoint/node_modules/@aws-sdk/util-uri-escape": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", - "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", - "dev": true, - "dependencies": { - "@aws-sdk/config-resolver": "3.222.0", - "@aws-sdk/endpoint-cache": "3.208.0", - "@aws-sdk/protocol-http": "3.222.0", - "@aws-sdk/types": "3.222.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-sdk/middleware-host-header": { "version": "3.226.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz", @@ -1837,14 +1698,15 @@ } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.229.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.229.0.tgz", - "integrity": "sha512-/y0BWio9b2RRH2QvRTohbuqE0vhH4IZKlc6k+JRbGV9aSwyOzACU/L/qkGftC/W0puvgNvZYjGxmB6cGHAEZaw==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz", + "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==", "dependencies": { "@aws-sdk/protocol-http": "3.226.0", "@aws-sdk/service-error-classification": "3.229.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/util-middleware": "3.226.0", + "@aws-sdk/util-retry": "3.229.0", "tslib": "^2.3.1", "uuid": "^8.3.2" }, @@ -2043,9 +1905,9 @@ } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.226.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.226.0.tgz", - "integrity": "sha512-BWr1FhWSUhkSBp0TLzliD5AQBjA2Jmo9FlOOt+cBwd9BKkSGlGj+HgATYJ83Sjjg2+J6qvEZBxB78LKVHhorBw==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz", + "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==", "dependencies": { "@aws-sdk/middleware-stack": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -2056,11 +1918,11 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.231.0.tgz", - "integrity": "sha512-sxx6X/moSdukyrnoBtLxmgQQLWqixMc/qAM5yNg5lfNoGamWslH6CnT1HlxTFv71q8/1xwnvZ4LC2kbD6vDc6Q==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.235.0.tgz", + "integrity": "sha512-TdUbQ0wWVTO7azF/8ojtd4MNFjEfQKhGoGib0g/W5pa/FJryOkiIP8U4POC/I+0ATMkLK3vAC07kNHtey0ooZg==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.231.0", + "@aws-sdk/client-sso-oidc": "3.235.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -2138,30 +2000,6 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/util-base64/node_modules/@aws-sdk/is-array-buffer": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", - "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", - "dev": true, - "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", - "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-sdk/util-body-length-browser": { "version": "3.188.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", @@ -2193,9 +2031,9 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.226.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.226.0.tgz", - "integrity": "sha512-chLx+6AeMSjuPsCVbI1B4Pg3jftjjcsuTsJucjo0DKBb1VSWqPCitmOILQVvKiA2Km8TSs3VcbUuOCyDExkzAg==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz", + "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==", "dependencies": { "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -2207,11 +2045,11 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.231.0.tgz", - "integrity": "sha512-jH+9z96x8Oxv+bqBdD7x8CRvbKzM9id+VHzI9+h1oTY9J+6MkUubPshliBTQeus5pD03NBOS/2F3GX2rJ9Avuw==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz", + "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==", "dependencies": { - "@aws-sdk/config-resolver": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", "@aws-sdk/credential-provider-imds": "3.226.0", "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/property-provider": "3.226.0", @@ -2223,9 +2061,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.231.0.tgz", - "integrity": "sha512-7+Mj3wBqUdgV0U+9Va+89qafclXhEsjULTbfNdfic4C3PVtcRb1B5on5EPg3g2r3OlDoJBYFjoyW4CAro7TCiA==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.235.0.tgz", + "integrity": "sha512-y3gC1o16yN7F/Vt4UM9QKOx3qNxZmu/y8YAWS0vC+ZCZqjh4vf+0AuzQWmat+2pHV5qUAgBxOcpr+K3uz1kTiw==", "dependencies": { "tslib": "^2.3.1" }, @@ -3093,9 +2931,9 @@ } }, "node_modules/@commitlint/load/node_modules/@types/node": { - "version": "14.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.34.tgz", - "integrity": "sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==", + "version": "14.18.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.35.tgz", + "integrity": "sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw==", "dev": true }, "node_modules/@commitlint/message": { @@ -3240,9 +3078,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.7.tgz", - "integrity": "sha512-yhzDbiVcmq6T1/XEvdcJIVcXHdLjDJ5cQ0Dp9R9p9ERMBTeO1dR5tc8YYv8zwDeBw1xZm+Eo3MRo8cwclhBS0g==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.10.tgz", + "integrity": "sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==", "cpu": [ "arm" ], @@ -3256,9 +3094,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.7.tgz", - "integrity": "sha512-tYFw0lBJSEvLoGzzYh1kXuzoX1iPkbOk3O29VqzQb0HbOy7t/yw1hGkvwoJhXHwzQUPsShyYcTgRf6bDBcfnTw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.10.tgz", + "integrity": "sha512-47Y+NwVKTldTlDhSgJHZ/RpvBQMUDG7eKihqaF/u6g7s0ZPz4J1vy8A3rwnnUOF2CuDn7w7Gj/QcMoWz3U3SJw==", "cpu": [ "arm64" ], @@ -3272,9 +3110,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.7.tgz", - "integrity": "sha512-3P2OuTxwAtM3k/yEWTNUJRjMPG1ce8rXs51GTtvEC5z1j8fC1plHeVVczdeHECU7aM2/Buc0MwZ6ciM/zysnWg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.10.tgz", + "integrity": "sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg==", "cpu": [ "x64" ], @@ -3288,9 +3126,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.7.tgz", - "integrity": "sha512-VUb9GK23z8jkosHU9yJNUgQpsfJn+7ZyBm6adi2Ec5/U241eR1tAn82QicnUzaFDaffeixiHwikjmnec/YXEZg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.10.tgz", + "integrity": "sha512-bH/bpFwldyOKdi9HSLCLhhKeVgRYr9KblchwXgY2NeUHBB/BzTUHtUSBgGBmpydB1/4E37m+ggXXfSrnD7/E7g==", "cpu": [ "arm64" ], @@ -3304,9 +3142,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.7.tgz", - "integrity": "sha512-duterlv3tit3HI9vhzMWnSVaB1B6YsXpFq1Ntd6Fou82BB1l4tucYy3FI9dHv3tvtDuS0NiGf/k6XsdBqPZ01w==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.10.tgz", + "integrity": "sha512-OXt7ijoLuy+AjDSKQWu+KdDFMBbdeaL6wtgMKtDUXKWHiAMKHan5+R1QAG6HD4+K0nnOvEJXKHeA9QhXNAjOTQ==", "cpu": [ "x64" ], @@ -3320,9 +3158,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.7.tgz", - "integrity": "sha512-9kkycpBFes/vhi7B7o0cf+q2WdJi+EpVzpVTqtWFNiutARWDFFLcB93J8PR1cG228sucsl3B+7Ts27izE6qiaQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.10.tgz", + "integrity": "sha512-shSQX/3GHuspE3Uxtq5kcFG/zqC+VuMnJkqV7LczO41cIe6CQaXHD3QdMLA4ziRq/m0vZo7JdterlgbmgNIAlQ==", "cpu": [ "arm64" ], @@ -3336,9 +3174,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.7.tgz", - "integrity": "sha512-5Ahf6jzWXJ4J2uh9dpy5DKOO+PeRUE/9DMys6VuYfwgQzd6n5+pVFm58L2Z2gRe611RX6SdydnNaiIKM3svY7g==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.10.tgz", + "integrity": "sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA==", "cpu": [ "x64" ], @@ -3352,9 +3190,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.7.tgz", - "integrity": "sha512-QqJnyCfu5OF78Olt7JJSZ7OSv/B4Hf+ZJWp4kkq9xwMsgu7yWq3crIic8gGOpDYTqVKKMDAVDgRXy5Wd/nWZyQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.10.tgz", + "integrity": "sha512-c360287ZWI2miBnvIj23bPyVctgzeMT2kQKR+x94pVqIN44h3GF8VMEs1SFPH1UgyDr3yBbx3vowDS1SVhyVhA==", "cpu": [ "arm" ], @@ -3368,9 +3206,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.7.tgz", - "integrity": "sha512-2wv0xYDskk2+MzIm/AEprDip39a23Chptc4mL7hsHg26P0gD8RUhzmDu0KCH2vMThUI1sChXXoK9uH0KYQKaDg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.10.tgz", + "integrity": "sha512-2aqeNVxIaRfPcIaMZIFoblLh588sWyCbmj1HHCCs9WmeNWm+EIN0SmvsmPvTa/TsNZFKnxTcvkX2eszTcCqIrA==", "cpu": [ "arm64" ], @@ -3384,9 +3222,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.7.tgz", - "integrity": "sha512-APVYbEilKbD5ptmKdnIcXej2/+GdV65TfTjxR2Uk8t1EsOk49t6HapZW6DS/Bwlvh5hDwtLapdSumIVNGxgqLg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.10.tgz", + "integrity": "sha512-sqMIEWeyrLGU7J5RB5fTkLRIFwsgsQ7ieWXlDLEmC2HblPYGb3AucD7inw2OrKFpRPKsec1l+lssiM3+NV5aOw==", "cpu": [ "ia32" ], @@ -3400,9 +3238,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.7.tgz", - "integrity": "sha512-5wPUAGclplQrAW7EFr3F84Y/d++7G0KykohaF4p54+iNWhUnMVU8Bh2sxiEOXUy4zKIdpHByMgJ5/Ko6QhtTUw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.10.tgz", + "integrity": "sha512-O7Pd5hLEtTg37NC73pfhUOGTjx/+aXu5YoSq3ahCxcN7Bcr2F47mv+kG5t840thnsEzrv0oB70+LJu3gUgchvg==", "cpu": [ "loong64" ], @@ -3416,9 +3254,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.7.tgz", - "integrity": "sha512-hxzlXtWF6yWfkE/SMTscNiVqLOAn7fOuIF3q/kiZaXxftz1DhZW/HpnTmTTWrzrS7zJWQxHHT4QSxyAj33COmA==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.10.tgz", + "integrity": "sha512-FN8mZOH7531iPHM0kaFhAOqqNHoAb6r/YHW2ZIxNi0a85UBi2DO4Vuyn7t1p4UN8a4LoAnLOT1PqNgHkgBJgbA==", "cpu": [ "mips64el" ], @@ -3432,9 +3270,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.7.tgz", - "integrity": "sha512-WM83Dac0LdXty5xPhlOuCD5Egfk1xLND/oRLYeB7Jb/tY4kzFSDgLlq91wYbHua/s03tQGA9iXvyjgymMw62Vw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.10.tgz", + "integrity": "sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg==", "cpu": [ "ppc64" ], @@ -3448,9 +3286,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.7.tgz", - "integrity": "sha512-3nkNnNg4Ax6MS/l8O8Ynq2lGEVJYyJ2EoY3PHjNJ4PuZ80EYLMrFTFZ4L/Hc16AxgtXKwmNP9TM0YKNiBzBiJQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.10.tgz", + "integrity": "sha512-XMqtpjwzbmlar0BJIxmzu/RZ7EWlfVfH68Vadrva0Wj5UKOdKvqskuev2jY2oPV3aoQUyXwnMbMrFmloO2GfAw==", "cpu": [ "riscv64" ], @@ -3464,9 +3302,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.7.tgz", - "integrity": "sha512-3SA/2VJuv0o1uD7zuqxEP+RrAyRxnkGddq0bwHQ98v1KNlzXD/JvxwTO3T6GM5RH6JUd29RTVQTOJfyzMkkppA==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.10.tgz", + "integrity": "sha512-fu7XtnoeRNFMx8DjK3gPWpFBDM2u5ba+FYwg27SjMJwKvJr4bDyKz5c+FLXLUSSAkMAt/UL+cUbEbra+rYtUgw==", "cpu": [ "s390x" ], @@ -3480,9 +3318,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.7.tgz", - "integrity": "sha512-xi/tbqCqvPIzU+zJVyrpz12xqciTAPMi2fXEWGnapZymoGhuL2GIWIRXg4O2v5BXaYA5TSaiKYE14L0QhUTuQg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.10.tgz", + "integrity": "sha512-61lcjVC/RldNNMUzQQdyCWjCxp9YLEQgIxErxU9XluX7juBdGKb0pvddS0vPNuCvotRbzijZ1pzII+26haWzbA==", "cpu": [ "x64" ], @@ -3496,9 +3334,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.7.tgz", - "integrity": "sha512-NUsYbq3B+JdNKn8SXkItFvdes9qTwEoS3aLALtiWciW/ystiCKM20Fgv9XQBOXfhUHyh5CLEeZDXzLOrwBXuCQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.10.tgz", + "integrity": "sha512-JeZXCX3viSA9j4HqSoygjssdqYdfHd6yCFWyfSekLbz4Ef+D2EjvsN02ZQPwYl5a5gg/ehdHgegHhlfOFP0HCA==", "cpu": [ "x64" ], @@ -3512,9 +3350,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.7.tgz", - "integrity": "sha512-qjwzsgeve9I8Tbsko2FEkdSk2iiezuNGFgipQxY/736NePXDaDZRodIejYGWOlbYXugdxb0nif5yvypH6lKBmA==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.10.tgz", + "integrity": "sha512-3qpxQKuEVIIg8SebpXsp82OBrqjPV/OwNWmG+TnZDr3VGyChNnGMHccC1xkbxCHDQNnnXjxhMQNyHmdFJbmbRA==", "cpu": [ "x64" ], @@ -3528,9 +3366,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.7.tgz", - "integrity": "sha512-mFWDz4RoBTzPphTCkM7Kc7Qpa0o/Z01acajR+Ai7LdfKgcP/C6jYOaKwv7nKzD0+MjOT20j7You9g4ozYy1dKQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.10.tgz", + "integrity": "sha512-z+q0xZ+et/7etz7WoMyXTHZ1rB8PMSNp/FOqURLJLOPb3GWJ2aj4oCqFCjPwEbW1rsT7JPpxeH/DwGAWk/I1Bg==", "cpu": [ "x64" ], @@ -3544,9 +3382,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.7.tgz", - "integrity": "sha512-m39UmX19RvEIuC8sYZ0M+eQtdXw4IePDSZ78ZQmYyFaXY9krq4YzQCK2XWIJomNLtg4q+W5aXr8bW3AbqWNoVg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.10.tgz", + "integrity": "sha512-+YYu5sbQ9npkNT9Dec+tn1F/kjg6SMgr6bfi/6FpXYZvCRfu2YFPZGb+3x8K30s8eRxFpoG4sGhiSUkr1xbHEw==", "cpu": [ "arm64" ], @@ -3560,9 +3398,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.7.tgz", - "integrity": "sha512-1cbzSEZA1fANwmT6rjJ4G1qQXHxCxGIcNYFYR9ctI82/prT38lnwSRZ0i5p/MVXksw9eMlHlet6pGu2/qkXFCg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.10.tgz", + "integrity": "sha512-Aw7Fupk7XNehR1ftHGYwUteyJ2q+em/aE+fVU3YMTBN2V5A7Z4aVCSV+SvCp9HIIHZavPFBpbdP3VfjQpdf6Xg==", "cpu": [ "ia32" ], @@ -3576,9 +3414,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.7.tgz", - "integrity": "sha512-QaQ8IH0JLacfGf5cf0HCCPnQuCTd/dAI257vXBgb/cccKGbH/6pVtI1gwhdAQ0Y48QSpTIFrh9etVyNdZY+zzw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.10.tgz", + "integrity": "sha512-qddWullt3sC1EIpfHvCRBq3H4g3L86DZpD6n8k2XFjFVyp01D++uNbN1hT/JRsHxTbyyemZcpwL5aRlJwc/zFw==", "cpu": [ "x64" ], @@ -3592,15 +3430,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -5703,9 +5541,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", - "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" + "version": "18.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -5720,9 +5558,9 @@ "dev": true }, "node_modules/@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "node_modules/@types/promise-retry": { @@ -5789,14 +5627,14 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", - "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", + "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/type-utils": "5.46.1", - "@typescript-eslint/utils": "5.46.1", + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/type-utils": "5.47.0", + "@typescript-eslint/utils": "5.47.0", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -5822,14 +5660,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", - "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", + "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/typescript-estree": "5.47.0", "debug": "^4.3.4" }, "engines": { @@ -5849,13 +5687,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", - "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", + "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/visitor-keys": "5.46.1" + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/visitor-keys": "5.47.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5866,13 +5704,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", - "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", + "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.46.1", - "@typescript-eslint/utils": "5.46.1", + "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/utils": "5.47.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -5893,9 +5731,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", - "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", + "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5906,13 +5744,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", - "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", + "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/visitor-keys": "5.46.1", + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/visitor-keys": "5.47.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5933,16 +5771,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", - "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", + "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/typescript-estree": "5.47.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -5959,12 +5797,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", - "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", + "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/types": "5.47.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -6447,9 +6285,9 @@ } }, "node_modules/aws-cdk": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.55.0.tgz", - "integrity": "sha512-SlsaKh1tEiFLWas99OffxoTLugkEZZHY552QeY4ZPXJaUx9kocGYc9s13IO8Y9/cBfoQVvh2KLev4J2+63vKyg==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.55.1.tgz", + "integrity": "sha512-M/d4lO7rLMvPedNj7pEQtwyxn7nVLluiHggftXlYHOIeaoMG1QCbH1zTuZtMZZxdRRD4ZiOEHvvPYFU/HMcrPQ==", "dev": true, "bin": { "cdk": "bin/cdk" @@ -6462,9 +6300,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.55.0.tgz", - "integrity": "sha512-YCtfmMiITU5ncrrQmq5wls2EeCUOLOBDLWO2ZkaUozIS+VbEDChK8rT66OmgQSPwFntKNSJq0P65tR7kN5/i8g==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.55.1.tgz", + "integrity": "sha512-v0MhL6RqazQ2HKj9TXJvXKQcQNIDYeRzcOJ2xB2Usz56xodArc2goLu2P51X5J84xOO4w2AgNaWMCBzd7MbyOQ==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -6668,9 +6506,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1276.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1276.0.tgz", - "integrity": "sha512-0TGPsW/uMQy0trfYZD+dvSQ9Bf8NmKK9ISj5xQJGopNt/Kxh0vLKBPy2mFmKdxeFtis6wn4c9uTp7/3p0ADa1w==", + "version": "2.1279.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1279.0.tgz", + "integrity": "sha512-52NbHEZTLlrld6XDLvVaOwEI0p4nYTYVuninX8s4kdkBXeTezaBahsufWT7LmeYh10gp70dnwaUxvja1TjmeRA==", "dev": true, "dependencies": { "buffer": "4.9.2", @@ -7378,14 +7216,14 @@ "dev": true }, "node_modules/cdk-assets": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/cdk-assets/-/cdk-assets-2.55.0.tgz", - "integrity": "sha512-okqVag8vV57IeqFJp3lGtHIgDZaCpKJXZ8xRl8dfDayzNuxnuEyJzyAbo8SzlxwE3E+nqvJPVE4hdz0VbtwvqQ==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/cdk-assets/-/cdk-assets-2.55.1.tgz", + "integrity": "sha512-ow6ajx3Dgs+ZD3iTu72lYLK97yHEuP1yvOkwKsrJvUkGwGox77btY51gDbp54owonzRHyt3lgfXvzAcq/ne4eg==", "dev": true, "hasShrinkwrap": true, "dependencies": { - "@aws-cdk/cloud-assembly-schema": "2.55.0", - "@aws-cdk/cx-api": "2.55.0", + "@aws-cdk/cloud-assembly-schema": "2.55.1", + "@aws-cdk/cx-api": "2.55.1", "archiver": "^5.3.1", "aws-sdk": "^2.1211.0", "glob": "^7.2.3", @@ -7401,7 +7239,7 @@ } }, "node_modules/cdk-assets/node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "2.55.0", + "version": "2.55.1", "dev": true, "dependencies": { "jsonschema": "^1.4.1", @@ -7409,10 +7247,10 @@ } }, "node_modules/cdk-assets/node_modules/@aws-cdk/cx-api": { - "version": "2.55.0", + "version": "2.55.1", "dev": true, "dependencies": { - "@aws-cdk/cloud-assembly-schema": "2.55.0", + "@aws-cdk/cloud-assembly-schema": "2.55.1", "semver": "^7.3.8" } }, @@ -8543,9 +8381,9 @@ "dev": true }, "node_modules/constructs": { - "version": "10.1.190", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.190.tgz", - "integrity": "sha512-wGMEBsIKp/tP+b2q3XEtIh/KJPZ2uk7G2XyEbGVEatOo6OQHFhXfBi9BCk8725zuWYP/gZUQJfAvd7KZ+lY5Yw==", + "version": "10.1.196", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.196.tgz", + "integrity": "sha512-vgVM3vTWu8ZdHEa/icSzmZZOU5berKI+g8eosPKu+KOoAtS6o/eXqYObXejh79vy+rHyKK7yulUtSGCXU4ynUQ==", "dev": true, "engines": { "node": ">= 14.17.0" @@ -9277,9 +9115,9 @@ } }, "node_modules/esbuild": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.7.tgz", - "integrity": "sha512-P6OBFYFSQOGzfApqCeYKqfKRRbCIRsdppTXFo4aAvtiW3o8TTyiIplBvHJI171saPAiy3WlawJHCveJVIOIx1A==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.10.tgz", + "integrity": "sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==", "dev": true, "hasInstallScript": true, "bin": { @@ -9289,28 +9127,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.16.7", - "@esbuild/android-arm64": "0.16.7", - "@esbuild/android-x64": "0.16.7", - "@esbuild/darwin-arm64": "0.16.7", - "@esbuild/darwin-x64": "0.16.7", - "@esbuild/freebsd-arm64": "0.16.7", - "@esbuild/freebsd-x64": "0.16.7", - "@esbuild/linux-arm": "0.16.7", - "@esbuild/linux-arm64": "0.16.7", - "@esbuild/linux-ia32": "0.16.7", - "@esbuild/linux-loong64": "0.16.7", - "@esbuild/linux-mips64el": "0.16.7", - "@esbuild/linux-ppc64": "0.16.7", - "@esbuild/linux-riscv64": "0.16.7", - "@esbuild/linux-s390x": "0.16.7", - "@esbuild/linux-x64": "0.16.7", - "@esbuild/netbsd-x64": "0.16.7", - "@esbuild/openbsd-x64": "0.16.7", - "@esbuild/sunos-x64": "0.16.7", - "@esbuild/win32-arm64": "0.16.7", - "@esbuild/win32-ia32": "0.16.7", - "@esbuild/win32-x64": "0.16.7" + "@esbuild/android-arm": "0.16.10", + "@esbuild/android-arm64": "0.16.10", + "@esbuild/android-x64": "0.16.10", + "@esbuild/darwin-arm64": "0.16.10", + "@esbuild/darwin-x64": "0.16.10", + "@esbuild/freebsd-arm64": "0.16.10", + "@esbuild/freebsd-x64": "0.16.10", + "@esbuild/linux-arm": "0.16.10", + "@esbuild/linux-arm64": "0.16.10", + "@esbuild/linux-ia32": "0.16.10", + "@esbuild/linux-loong64": "0.16.10", + "@esbuild/linux-mips64el": "0.16.10", + "@esbuild/linux-ppc64": "0.16.10", + "@esbuild/linux-riscv64": "0.16.10", + "@esbuild/linux-s390x": "0.16.10", + "@esbuild/linux-x64": "0.16.10", + "@esbuild/netbsd-x64": "0.16.10", + "@esbuild/openbsd-x64": "0.16.10", + "@esbuild/sunos-x64": "0.16.10", + "@esbuild/win32-arm64": "0.16.10", + "@esbuild/win32-ia32": "0.16.10", + "@esbuild/win32-x64": "0.16.10" } }, "node_modules/escalade": { @@ -9408,13 +9246,13 @@ } }, "node_modules/eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -9433,7 +9271,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -11077,9 +10915,9 @@ "dev": true }, "node_modules/ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -13583,13 +13421,13 @@ } }, "node_modules/nise": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.3.tgz", - "integrity": "sha512-U597iWTTBBYIV72986jyU382/MMZ70ApWcRmkoF1AZ75bpqOtI3Gugv/6+0jLgoDOabmcSwYBkSSAWIp1eA5cg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -13605,21 +13443,12 @@ } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "@sinonjs/commons": "^2.0.0" } }, "node_modules/node-fetch": { @@ -13799,9 +13628,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", - "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, "node_modules/nopt": { @@ -15328,9 +15157,9 @@ } }, "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -16728,14 +16557,14 @@ } }, "node_modules/typedoc": { - "version": "0.23.22", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.22.tgz", - "integrity": "sha512-5sJkjK60xp8A7YpcYniu3+Wf0QcgojEnhzHuCN+CkdpQkKRhOspon/9+sGTkGI8kjVkZs3KHrhltpQyVhRMVfw==", + "version": "0.23.23", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.23.tgz", + "integrity": "sha512-cg1YQWj+/BU6wq74iott513U16fbrPCbyYs04PHZgvoKJIc6EY4xNobyDZh4KMfRGW8Yjv6wwIzQyoqopKOUGw==", "dev": true, "dependencies": { "lunr": "^2.3.9", - "marked": "^4.0.19", - "minimatch": "^5.1.0", + "marked": "^4.2.4", + "minimatch": "^5.1.1", "shiki": "^0.11.1" }, "bin": { @@ -16767,9 +16596,9 @@ } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -17573,9 +17402,9 @@ } }, "@aws-cdk/asset-awscli-v1": { - "version": "2.2.30", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.30.tgz", - "integrity": "sha512-mFRF5n1jxjKpX8ZZSCRhJc6Hj8BkeZFUPwK0j6jRcouQQZHsZyydbf4UuzMYQ4SZU6cCLM7DKmWO0Kx156ZSnw==", + "version": "2.2.36", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.36.tgz", + "integrity": "sha512-q4jde7ZqXjOfnEPjfn/VNIKmTFBg4GWCn5KxB8EDny6FWhGE+TkJxTjyu4KgUvcRZCvNqsdWvxGMQOFTTsqaVA==", "dev": true }, "@aws-cdk/asset-kubectl-v20": { @@ -17591,9 +17420,9 @@ "dev": true }, "@aws-cdk/cfnspec": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-2.55.0.tgz", - "integrity": "sha512-lwBV4MxkIO0IIctyylsG+RkdgcMkUdogY34dx23bFuaxmchmGEsx++PyOS4Q/UQojc01JuOiIN5xT9iQBNQQvA==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cfnspec/-/cfnspec-2.55.1.tgz", + "integrity": "sha512-jJCaEV9pTLFft2eYkwmblfxUBQeJSH4KbMteiVQdp6wkYbzoj/sjyFInfKHgtfIOeqjNtPZ74Dhl5fRJsOpBDw==", "dev": true, "requires": { "fs-extra": "^9.1.0", @@ -17601,9 +17430,9 @@ } }, "@aws-cdk/cloud-assembly-schema": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.55.0.tgz", - "integrity": "sha512-SZ1Ojl8lOm0X1TUWCR8dTuGMmEJwtZwfTo1S39BiF4RsUungksBj30Us8wtdgaPrWx455mUgbWaY9JQ4ZcEyJw==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-2.55.1.tgz", + "integrity": "sha512-VVVQaqHP2PsNGRwfPsq1RxoOfyC54DO8RH+2nHqCyPIfSmrIH6Ux5Uk7KAURyXKdb3SjKra66bxPOzvXHOaBXg==", "dev": true, "requires": { "jsonschema": "^1.4.1", @@ -17639,12 +17468,12 @@ } }, "@aws-cdk/cloudformation-diff": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.55.0.tgz", - "integrity": "sha512-yvZOH37itWcDwvQdnGOTQPtR+GkgLf9lYsICrOmly/+di++H5p29VS8hgm67n5Mk7EWz0KyqnbZ9hiM++TJ6Jw==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloudformation-diff/-/cloudformation-diff-2.55.1.tgz", + "integrity": "sha512-WgLubFXoQFGZuOkm7YtJx+kS8EN6rX9K6s257qFR7yNGpKBANSPVvWmlWX2qSvg++AkNSxKsuaZi+4V50TNbdA==", "dev": true, "requires": { - "@aws-cdk/cfnspec": "2.55.0", + "@aws-cdk/cfnspec": "2.55.1", "@types/node": "^14.18.34", "chalk": "^4", "diff": "^5.1.0", @@ -17654,20 +17483,20 @@ }, "dependencies": { "@types/node": { - "version": "14.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.34.tgz", - "integrity": "sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==", + "version": "14.18.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.35.tgz", + "integrity": "sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw==", "dev": true } } }, "@aws-cdk/cx-api": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-2.55.0.tgz", - "integrity": "sha512-KhYPBqEL24mQuEqHHdhcSc8jy7w69bD+NQjji54QGEA1tp+1gaUebTBIlTiOPbB3fzU8GR3f3ALnOQI3wJzr/Q==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cx-api/-/cx-api-2.55.1.tgz", + "integrity": "sha512-gWQCn/9gaayf2ev0HjCMQleY1gWJZGImLhsUF8kneYnOPCm/r0qpIzy3BxiWiDFLPh9gykDvHQhpH6EG0aXnGA==", "dev": true, "requires": { - "@aws-cdk/cloud-assembly-schema": "2.55.0", + "@aws-cdk/cloud-assembly-schema": "2.55.1", "semver": "^7.3.8" }, "dependencies": { @@ -17839,25 +17668,25 @@ } }, "@aws-sdk/client-dynamodb": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.231.0.tgz", - "integrity": "sha512-WvNM3NmsFFB7S7I5B2PECe945bEzdwU3MElLznmcbccaRf31S61C4EAkghm6hXz0EoZlgdRfBqHaRB1PgmAUuA==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.235.0.tgz", + "integrity": "sha512-GTRrc7EED3er8HNlnfLHI4oFT/sXS84rlUy3acYzLTiYfASK3YUspZ/cu7CF7MGJaiXXIS1pEm88rK2N4hap/g==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.231.0", - "@aws-sdk/config-resolver": "3.231.0", - "@aws-sdk/credential-provider-node": "3.231.0", + "@aws-sdk/client-sts": "3.235.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-node": "3.235.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", "@aws-sdk/middleware-content-length": "3.226.0", "@aws-sdk/middleware-endpoint": "3.226.0", - "@aws-sdk/middleware-endpoint-discovery": "3.231.0", + "@aws-sdk/middleware-endpoint-discovery": "3.234.0", "@aws-sdk/middleware-host-header": "3.226.0", "@aws-sdk/middleware-logger": "3.226.0", "@aws-sdk/middleware-recursion-detection": "3.226.0", - "@aws-sdk/middleware-retry": "3.229.0", + "@aws-sdk/middleware-retry": "3.235.0", "@aws-sdk/middleware-serde": "3.226.0", "@aws-sdk/middleware-signing": "3.226.0", "@aws-sdk/middleware-stack": "3.226.0", @@ -17865,14 +17694,14 @@ "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/node-http-handler": "3.226.0", "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/url-parser": "3.226.0", "@aws-sdk/util-base64": "3.208.0", "@aws-sdk/util-body-length-browser": "3.188.0", "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.226.0", - "@aws-sdk/util-defaults-mode-node": "3.231.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", "@aws-sdk/util-endpoints": "3.226.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", @@ -18199,13 +18028,13 @@ } }, "@aws-sdk/client-sso": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.231.0.tgz", - "integrity": "sha512-/q7BptaMiT6/wxW9vE/gcQuApMXio5vdTuqt77A6+mjqhNzYFfCn7RRS4BU8KEOpZObnYBKP3mYe3NDccEbMzQ==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.235.0.tgz", + "integrity": "sha512-CdZ2EnDuB6V41u6brk/Nt19EZneLorsNkNWr4J7zkR/2gKiqdUN6PUs6jxDtK9M7V/r81jaE0ViLwLVmYhL/bQ==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -18214,21 +18043,21 @@ "@aws-sdk/middleware-host-header": "3.226.0", "@aws-sdk/middleware-logger": "3.226.0", "@aws-sdk/middleware-recursion-detection": "3.226.0", - "@aws-sdk/middleware-retry": "3.229.0", + "@aws-sdk/middleware-retry": "3.235.0", "@aws-sdk/middleware-serde": "3.226.0", "@aws-sdk/middleware-stack": "3.226.0", "@aws-sdk/middleware-user-agent": "3.226.0", "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/node-http-handler": "3.226.0", "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/url-parser": "3.226.0", "@aws-sdk/util-base64": "3.208.0", "@aws-sdk/util-body-length-browser": "3.188.0", "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.226.0", - "@aws-sdk/util-defaults-mode-node": "3.231.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", "@aws-sdk/util-endpoints": "3.226.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", @@ -18239,13 +18068,13 @@ } }, "@aws-sdk/client-sso-oidc": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.231.0.tgz", - "integrity": "sha512-yqEZW9/Q6VvMDMcQoE52oa/oa6F8z8cqyax7m29VpuVrncYcfELpkZKWPoaJVfierR5ysKfKiAU0acPgMpvllQ==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.235.0.tgz", + "integrity": "sha512-oSF0lSPmE5jaaigxc5TZyDjqfgTiDsromEdvv5s5a/qAOZBNtsVaS4+8cn9kIt43Ceo7dxHXk7cwvXMNPwVnWw==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -18254,21 +18083,21 @@ "@aws-sdk/middleware-host-header": "3.226.0", "@aws-sdk/middleware-logger": "3.226.0", "@aws-sdk/middleware-recursion-detection": "3.226.0", - "@aws-sdk/middleware-retry": "3.229.0", + "@aws-sdk/middleware-retry": "3.235.0", "@aws-sdk/middleware-serde": "3.226.0", "@aws-sdk/middleware-stack": "3.226.0", "@aws-sdk/middleware-user-agent": "3.226.0", "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/node-http-handler": "3.226.0", "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/url-parser": "3.226.0", "@aws-sdk/util-base64": "3.208.0", "@aws-sdk/util-body-length-browser": "3.188.0", "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.226.0", - "@aws-sdk/util-defaults-mode-node": "3.231.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", "@aws-sdk/util-endpoints": "3.226.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", @@ -18279,14 +18108,14 @@ } }, "@aws-sdk/client-sts": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.231.0.tgz", - "integrity": "sha512-5WYqlcbM49ofOFBsu28QBt3t26M5D9XynhSaswSrCzawwdNkIMYQrKOCplF5mqOy+GywVIRrFeCVVrAKPMZJxQ==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.235.0.tgz", + "integrity": "sha512-P1pqvg7brdBUGrTlyMc+LCe6rnWrWufdd7bpzuC9lcVzkoOHJw8j8wDItwoCsvy1O3SeK7vtmOTLxV2yuTEO3Q==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.231.0", - "@aws-sdk/credential-provider-node": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-node": "3.235.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -18295,7 +18124,7 @@ "@aws-sdk/middleware-host-header": "3.226.0", "@aws-sdk/middleware-logger": "3.226.0", "@aws-sdk/middleware-recursion-detection": "3.226.0", - "@aws-sdk/middleware-retry": "3.229.0", + "@aws-sdk/middleware-retry": "3.235.0", "@aws-sdk/middleware-sdk-sts": "3.226.0", "@aws-sdk/middleware-serde": "3.226.0", "@aws-sdk/middleware-signing": "3.226.0", @@ -18304,14 +18133,14 @@ "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/node-http-handler": "3.226.0", "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/url-parser": "3.226.0", "@aws-sdk/util-base64": "3.208.0", "@aws-sdk/util-body-length-browser": "3.188.0", "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.226.0", - "@aws-sdk/util-defaults-mode-node": "3.231.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", "@aws-sdk/util-endpoints": "3.226.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", @@ -18323,9 +18152,9 @@ } }, "@aws-sdk/config-resolver": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.231.0.tgz", - "integrity": "sha512-qpjV4Fw/NQ4a0p5/qwzqaShflYRlY/SPcgA7N5GTJjIjZjg3NV+5BKJSF3VeZcNKfbXq68kkn207OSCpyheYxQ==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz", + "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==", "requires": { "@aws-sdk/signature-v4": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -18357,13 +18186,14 @@ } }, "@aws-sdk/credential-provider-ini": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.231.0.tgz", - "integrity": "sha512-4JJgrJg2O91Vki4m5nSQNZGX/5yAYgzG1IOjeZ+8vCDxfR+jA2O9+/Xhi2/8aDpb1da77OJ+cK1+ezzSMchIfQ==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.235.0.tgz", + "integrity": "sha512-i3efxJw+9hN/opmjlRqT0lv/gKjOHmgGBUbFCdbCmSUTc8QH3sbkIY6FLX2q0PSu4q4CpCwWZ587lkThtFerJA==", "requires": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.231.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.235.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -18372,15 +18202,15 @@ } }, "@aws-sdk/credential-provider-node": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.231.0.tgz", - "integrity": "sha512-DOojjyYdLNeBQv9+PaDXmvvww9SmcZsaL1YCl27e5larcJSMfT41vn4WRnVRu2zBI2BIi464Z8ziRRKwd2YFVg==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.235.0.tgz", + "integrity": "sha512-xJSAntEBlbXbngSzpyMnlZzOldxV0sNOQ7ggDUmIQNVWbu3XwP6MiA8CjAHnH10vs6+pcyHtpfUj3evdQZ4JlQ==", "requires": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/credential-provider-ini": "3.231.0", + "@aws-sdk/credential-provider-ini": "3.235.0", "@aws-sdk/credential-provider-process": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.231.0", + "@aws-sdk/credential-provider-sso": "3.235.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -18400,14 +18230,14 @@ } }, "@aws-sdk/credential-provider-sso": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.231.0.tgz", - "integrity": "sha512-aImUD+PAqZ7A2C1ef7gskMN3KuxFT4Am1Vrl6M0oLGyrhKG2QtRT/UaXJE+Yt6d/C2qc2OsQ9j2oim7D6Qha/A==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.235.0.tgz", + "integrity": "sha512-+7UORB7Wo/d0mEz7J16/hsRumIhtdl4KekJfrXH5OrLiXXIsn68wmQkrvwD2CibbtgOY0P69G12qbcBHkg3qng==", "requires": { - "@aws-sdk/client-sso": "3.231.0", + "@aws-sdk/client-sso": "3.235.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", - "@aws-sdk/token-providers": "3.231.0", + "@aws-sdk/token-providers": "3.235.0", "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" } @@ -18471,11 +18301,11 @@ } }, "@aws-sdk/lib-dynamodb": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.231.0.tgz", - "integrity": "sha512-q1gvuxBQGR+xflaTbEP9Q+jCqnuqtznVrKt26skVUvzjmJJLB1dxHxwUPHv6SKO3R+bby7ATlVGQwQkZxViSGA==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.235.0.tgz", + "integrity": "sha512-jugMLrtVBCxK5+vFTEhm6Gb5MbvE14HUvN/WoMhAZFOYD0v0DEfzutyD2mwCpCJQJeQbMKz3q6YEhDFgbyBXSA==", "requires": { - "@aws-sdk/util-dynamodb": "3.231.0", + "@aws-sdk/util-dynamodb": "3.235.0", "tslib": "^2.3.1" } }, @@ -18505,11 +18335,11 @@ } }, "@aws-sdk/middleware-endpoint-discovery": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.231.0.tgz", - "integrity": "sha512-8HRZRrZWuAlm/I8uwFG8+iK8TCJWHSizRTEZfNazx7V5anOk55UeCVg3ifuXnFPmGeb4VDBRTn4h2dUx4LRKLQ==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.234.0.tgz", + "integrity": "sha512-HNZJbxXrSJfITJjAisqrju7T4S7U186xcmYr28CZX9XQNm6fc/bxcqj+8JRntWsekiJYyTvQLIrKxiCaa+TA9A==", "requires": { - "@aws-sdk/config-resolver": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", "@aws-sdk/endpoint-cache": "3.208.0", "@aws-sdk/protocol-http": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -18546,14 +18376,15 @@ } }, "@aws-sdk/middleware-retry": { - "version": "3.229.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.229.0.tgz", - "integrity": "sha512-/y0BWio9b2RRH2QvRTohbuqE0vhH4IZKlc6k+JRbGV9aSwyOzACU/L/qkGftC/W0puvgNvZYjGxmB6cGHAEZaw==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz", + "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==", "requires": { "@aws-sdk/protocol-http": "3.226.0", "@aws-sdk/service-error-classification": "3.229.0", "@aws-sdk/types": "3.226.0", "@aws-sdk/util-middleware": "3.226.0", + "@aws-sdk/util-retry": "3.229.0", "tslib": "^2.3.1", "uuid": "^8.3.2" }, @@ -18706,9 +18537,9 @@ } }, "@aws-sdk/smithy-client": { - "version": "3.226.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.226.0.tgz", - "integrity": "sha512-BWr1FhWSUhkSBp0TLzliD5AQBjA2Jmo9FlOOt+cBwd9BKkSGlGj+HgATYJ83Sjjg2+J6qvEZBxB78LKVHhorBw==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz", + "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==", "requires": { "@aws-sdk/middleware-stack": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -18716,11 +18547,11 @@ } }, "@aws-sdk/token-providers": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.231.0.tgz", - "integrity": "sha512-sxx6X/moSdukyrnoBtLxmgQQLWqixMc/qAM5yNg5lfNoGamWslH6CnT1HlxTFv71q8/1xwnvZ4LC2kbD6vDc6Q==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.235.0.tgz", + "integrity": "sha512-TdUbQ0wWVTO7azF/8ojtd4MNFjEfQKhGoGib0g/W5pa/FJryOkiIP8U4POC/I+0ATMkLK3vAC07kNHtey0ooZg==", "requires": { - "@aws-sdk/client-sso-oidc": "3.231.0", + "@aws-sdk/client-sso-oidc": "3.235.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -18788,9 +18619,9 @@ } }, "@aws-sdk/util-defaults-mode-browser": { - "version": "3.226.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.226.0.tgz", - "integrity": "sha512-chLx+6AeMSjuPsCVbI1B4Pg3jftjjcsuTsJucjo0DKBb1VSWqPCitmOILQVvKiA2Km8TSs3VcbUuOCyDExkzAg==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz", + "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==", "requires": { "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -18799,11 +18630,11 @@ } }, "@aws-sdk/util-defaults-mode-node": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.231.0.tgz", - "integrity": "sha512-jH+9z96x8Oxv+bqBdD7x8CRvbKzM9id+VHzI9+h1oTY9J+6MkUubPshliBTQeus5pD03NBOS/2F3GX2rJ9Avuw==", + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz", + "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==", "requires": { - "@aws-sdk/config-resolver": "3.231.0", + "@aws-sdk/config-resolver": "3.234.0", "@aws-sdk/credential-provider-imds": "3.226.0", "@aws-sdk/node-config-provider": "3.226.0", "@aws-sdk/property-provider": "3.226.0", @@ -18812,9 +18643,9 @@ } }, "@aws-sdk/util-dynamodb": { - "version": "3.231.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.231.0.tgz", - "integrity": "sha512-7+Mj3wBqUdgV0U+9Va+89qafclXhEsjULTbfNdfic4C3PVtcRb1B5on5EPg3g2r3OlDoJBYFjoyW4CAro7TCiA==", + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.235.0.tgz", + "integrity": "sha512-y3gC1o16yN7F/Vt4UM9QKOx3qNxZmu/y8YAWS0vC+ZCZqjh4vf+0AuzQWmat+2pHV5qUAgBxOcpr+K3uz1kTiw==", "requires": { "tslib": "^2.3.1" } @@ -19473,9 +19304,9 @@ }, "dependencies": { "@types/node": { - "version": "14.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.34.tgz", - "integrity": "sha512-hcU9AIQVHmPnmjRK+XUUYlILlr9pQrsqSrwov/JK1pnf3GTQowVBhx54FbvM0AU/VXGH4i3+vgXS5EguR7fysA==", + "version": "14.18.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.35.tgz", + "integrity": "sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw==", "dev": true } } @@ -19596,169 +19427,169 @@ } }, "@esbuild/android-arm": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.7.tgz", - "integrity": "sha512-yhzDbiVcmq6T1/XEvdcJIVcXHdLjDJ5cQ0Dp9R9p9ERMBTeO1dR5tc8YYv8zwDeBw1xZm+Eo3MRo8cwclhBS0g==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.10.tgz", + "integrity": "sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.7.tgz", - "integrity": "sha512-tYFw0lBJSEvLoGzzYh1kXuzoX1iPkbOk3O29VqzQb0HbOy7t/yw1hGkvwoJhXHwzQUPsShyYcTgRf6bDBcfnTw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.10.tgz", + "integrity": "sha512-47Y+NwVKTldTlDhSgJHZ/RpvBQMUDG7eKihqaF/u6g7s0ZPz4J1vy8A3rwnnUOF2CuDn7w7Gj/QcMoWz3U3SJw==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.7.tgz", - "integrity": "sha512-3P2OuTxwAtM3k/yEWTNUJRjMPG1ce8rXs51GTtvEC5z1j8fC1plHeVVczdeHECU7aM2/Buc0MwZ6ciM/zysnWg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.10.tgz", + "integrity": "sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.7.tgz", - "integrity": "sha512-VUb9GK23z8jkosHU9yJNUgQpsfJn+7ZyBm6adi2Ec5/U241eR1tAn82QicnUzaFDaffeixiHwikjmnec/YXEZg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.10.tgz", + "integrity": "sha512-bH/bpFwldyOKdi9HSLCLhhKeVgRYr9KblchwXgY2NeUHBB/BzTUHtUSBgGBmpydB1/4E37m+ggXXfSrnD7/E7g==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.7.tgz", - "integrity": "sha512-duterlv3tit3HI9vhzMWnSVaB1B6YsXpFq1Ntd6Fou82BB1l4tucYy3FI9dHv3tvtDuS0NiGf/k6XsdBqPZ01w==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.10.tgz", + "integrity": "sha512-OXt7ijoLuy+AjDSKQWu+KdDFMBbdeaL6wtgMKtDUXKWHiAMKHan5+R1QAG6HD4+K0nnOvEJXKHeA9QhXNAjOTQ==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.7.tgz", - "integrity": "sha512-9kkycpBFes/vhi7B7o0cf+q2WdJi+EpVzpVTqtWFNiutARWDFFLcB93J8PR1cG228sucsl3B+7Ts27izE6qiaQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.10.tgz", + "integrity": "sha512-shSQX/3GHuspE3Uxtq5kcFG/zqC+VuMnJkqV7LczO41cIe6CQaXHD3QdMLA4ziRq/m0vZo7JdterlgbmgNIAlQ==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.7.tgz", - "integrity": "sha512-5Ahf6jzWXJ4J2uh9dpy5DKOO+PeRUE/9DMys6VuYfwgQzd6n5+pVFm58L2Z2gRe611RX6SdydnNaiIKM3svY7g==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.10.tgz", + "integrity": "sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.7.tgz", - "integrity": "sha512-QqJnyCfu5OF78Olt7JJSZ7OSv/B4Hf+ZJWp4kkq9xwMsgu7yWq3crIic8gGOpDYTqVKKMDAVDgRXy5Wd/nWZyQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.10.tgz", + "integrity": "sha512-c360287ZWI2miBnvIj23bPyVctgzeMT2kQKR+x94pVqIN44h3GF8VMEs1SFPH1UgyDr3yBbx3vowDS1SVhyVhA==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.7.tgz", - "integrity": "sha512-2wv0xYDskk2+MzIm/AEprDip39a23Chptc4mL7hsHg26P0gD8RUhzmDu0KCH2vMThUI1sChXXoK9uH0KYQKaDg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.10.tgz", + "integrity": "sha512-2aqeNVxIaRfPcIaMZIFoblLh588sWyCbmj1HHCCs9WmeNWm+EIN0SmvsmPvTa/TsNZFKnxTcvkX2eszTcCqIrA==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.7.tgz", - "integrity": "sha512-APVYbEilKbD5ptmKdnIcXej2/+GdV65TfTjxR2Uk8t1EsOk49t6HapZW6DS/Bwlvh5hDwtLapdSumIVNGxgqLg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.10.tgz", + "integrity": "sha512-sqMIEWeyrLGU7J5RB5fTkLRIFwsgsQ7ieWXlDLEmC2HblPYGb3AucD7inw2OrKFpRPKsec1l+lssiM3+NV5aOw==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.7.tgz", - "integrity": "sha512-5wPUAGclplQrAW7EFr3F84Y/d++7G0KykohaF4p54+iNWhUnMVU8Bh2sxiEOXUy4zKIdpHByMgJ5/Ko6QhtTUw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.10.tgz", + "integrity": "sha512-O7Pd5hLEtTg37NC73pfhUOGTjx/+aXu5YoSq3ahCxcN7Bcr2F47mv+kG5t840thnsEzrv0oB70+LJu3gUgchvg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.7.tgz", - "integrity": "sha512-hxzlXtWF6yWfkE/SMTscNiVqLOAn7fOuIF3q/kiZaXxftz1DhZW/HpnTmTTWrzrS7zJWQxHHT4QSxyAj33COmA==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.10.tgz", + "integrity": "sha512-FN8mZOH7531iPHM0kaFhAOqqNHoAb6r/YHW2ZIxNi0a85UBi2DO4Vuyn7t1p4UN8a4LoAnLOT1PqNgHkgBJgbA==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.7.tgz", - "integrity": "sha512-WM83Dac0LdXty5xPhlOuCD5Egfk1xLND/oRLYeB7Jb/tY4kzFSDgLlq91wYbHua/s03tQGA9iXvyjgymMw62Vw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.10.tgz", + "integrity": "sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.7.tgz", - "integrity": "sha512-3nkNnNg4Ax6MS/l8O8Ynq2lGEVJYyJ2EoY3PHjNJ4PuZ80EYLMrFTFZ4L/Hc16AxgtXKwmNP9TM0YKNiBzBiJQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.10.tgz", + "integrity": "sha512-XMqtpjwzbmlar0BJIxmzu/RZ7EWlfVfH68Vadrva0Wj5UKOdKvqskuev2jY2oPV3aoQUyXwnMbMrFmloO2GfAw==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.7.tgz", - "integrity": "sha512-3SA/2VJuv0o1uD7zuqxEP+RrAyRxnkGddq0bwHQ98v1KNlzXD/JvxwTO3T6GM5RH6JUd29RTVQTOJfyzMkkppA==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.10.tgz", + "integrity": "sha512-fu7XtnoeRNFMx8DjK3gPWpFBDM2u5ba+FYwg27SjMJwKvJr4bDyKz5c+FLXLUSSAkMAt/UL+cUbEbra+rYtUgw==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.7.tgz", - "integrity": "sha512-xi/tbqCqvPIzU+zJVyrpz12xqciTAPMi2fXEWGnapZymoGhuL2GIWIRXg4O2v5BXaYA5TSaiKYE14L0QhUTuQg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.10.tgz", + "integrity": "sha512-61lcjVC/RldNNMUzQQdyCWjCxp9YLEQgIxErxU9XluX7juBdGKb0pvddS0vPNuCvotRbzijZ1pzII+26haWzbA==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.7.tgz", - "integrity": "sha512-NUsYbq3B+JdNKn8SXkItFvdes9qTwEoS3aLALtiWciW/ystiCKM20Fgv9XQBOXfhUHyh5CLEeZDXzLOrwBXuCQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.10.tgz", + "integrity": "sha512-JeZXCX3viSA9j4HqSoygjssdqYdfHd6yCFWyfSekLbz4Ef+D2EjvsN02ZQPwYl5a5gg/ehdHgegHhlfOFP0HCA==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.7.tgz", - "integrity": "sha512-qjwzsgeve9I8Tbsko2FEkdSk2iiezuNGFgipQxY/736NePXDaDZRodIejYGWOlbYXugdxb0nif5yvypH6lKBmA==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.10.tgz", + "integrity": "sha512-3qpxQKuEVIIg8SebpXsp82OBrqjPV/OwNWmG+TnZDr3VGyChNnGMHccC1xkbxCHDQNnnXjxhMQNyHmdFJbmbRA==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.7.tgz", - "integrity": "sha512-mFWDz4RoBTzPphTCkM7Kc7Qpa0o/Z01acajR+Ai7LdfKgcP/C6jYOaKwv7nKzD0+MjOT20j7You9g4ozYy1dKQ==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.10.tgz", + "integrity": "sha512-z+q0xZ+et/7etz7WoMyXTHZ1rB8PMSNp/FOqURLJLOPb3GWJ2aj4oCqFCjPwEbW1rsT7JPpxeH/DwGAWk/I1Bg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.7.tgz", - "integrity": "sha512-m39UmX19RvEIuC8sYZ0M+eQtdXw4IePDSZ78ZQmYyFaXY9krq4YzQCK2XWIJomNLtg4q+W5aXr8bW3AbqWNoVg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.10.tgz", + "integrity": "sha512-+YYu5sbQ9npkNT9Dec+tn1F/kjg6SMgr6bfi/6FpXYZvCRfu2YFPZGb+3x8K30s8eRxFpoG4sGhiSUkr1xbHEw==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.7.tgz", - "integrity": "sha512-1cbzSEZA1fANwmT6rjJ4G1qQXHxCxGIcNYFYR9ctI82/prT38lnwSRZ0i5p/MVXksw9eMlHlet6pGu2/qkXFCg==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.10.tgz", + "integrity": "sha512-Aw7Fupk7XNehR1ftHGYwUteyJ2q+em/aE+fVU3YMTBN2V5A7Z4aVCSV+SvCp9HIIHZavPFBpbdP3VfjQpdf6Xg==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.7.tgz", - "integrity": "sha512-QaQ8IH0JLacfGf5cf0HCCPnQuCTd/dAI257vXBgb/cccKGbH/6pVtI1gwhdAQ0Y48QSpTIFrh9etVyNdZY+zzw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.10.tgz", + "integrity": "sha512-qddWullt3sC1EIpfHvCRBq3H4g3L86DZpD6n8k2XFjFVyp01D++uNbN1hT/JRsHxTbyyemZcpwL5aRlJwc/zFw==", "dev": true, "optional": true }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -21520,9 +21351,9 @@ "dev": true }, "@types/node": { - "version": "18.11.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", - "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" + "version": "18.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -21537,9 +21368,9 @@ "dev": true }, "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "@types/promise-retry": { @@ -21606,14 +21437,14 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", - "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", + "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/type-utils": "5.46.1", - "@typescript-eslint/utils": "5.46.1", + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/type-utils": "5.47.0", + "@typescript-eslint/utils": "5.47.0", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -21623,53 +21454,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", - "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", + "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/typescript-estree": "5.47.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", - "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", + "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/visitor-keys": "5.46.1" + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/visitor-keys": "5.47.0" } }, "@typescript-eslint/type-utils": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", - "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", + "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.46.1", - "@typescript-eslint/utils": "5.46.1", + "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/utils": "5.47.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", - "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", + "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", - "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", + "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/visitor-keys": "5.46.1", + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/visitor-keys": "5.47.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -21678,28 +21509,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", - "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", + "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.46.1", - "@typescript-eslint/types": "5.46.1", - "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/typescript-estree": "5.47.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", - "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", + "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/types": "5.47.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -22079,18 +21910,18 @@ "dev": true }, "aws-cdk": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.55.0.tgz", - "integrity": "sha512-SlsaKh1tEiFLWas99OffxoTLugkEZZHY552QeY4ZPXJaUx9kocGYc9s13IO8Y9/cBfoQVvh2KLev4J2+63vKyg==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.55.1.tgz", + "integrity": "sha512-M/d4lO7rLMvPedNj7pEQtwyxn7nVLluiHggftXlYHOIeaoMG1QCbH1zTuZtMZZxdRRD4ZiOEHvvPYFU/HMcrPQ==", "dev": true, "requires": { "fsevents": "2.3.2" } }, "aws-cdk-lib": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.55.0.tgz", - "integrity": "sha512-YCtfmMiITU5ncrrQmq5wls2EeCUOLOBDLWO2ZkaUozIS+VbEDChK8rT66OmgQSPwFntKNSJq0P65tR7kN5/i8g==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.55.1.tgz", + "integrity": "sha512-v0MhL6RqazQ2HKj9TXJvXKQcQNIDYeRzcOJ2xB2Usz56xodArc2goLu2P51X5J84xOO4w2AgNaWMCBzd7MbyOQ==", "dev": true, "requires": { "@aws-cdk/asset-awscli-v1": "^2.2.30", @@ -22223,9 +22054,9 @@ } }, "aws-sdk": { - "version": "2.1276.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1276.0.tgz", - "integrity": "sha512-0TGPsW/uMQy0trfYZD+dvSQ9Bf8NmKK9ISj5xQJGopNt/Kxh0vLKBPy2mFmKdxeFtis6wn4c9uTp7/3p0ADa1w==", + "version": "2.1279.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1279.0.tgz", + "integrity": "sha512-52NbHEZTLlrld6XDLvVaOwEI0p4nYTYVuninX8s4kdkBXeTezaBahsufWT7LmeYh10gp70dnwaUxvja1TjmeRA==", "dev": true, "requires": { "buffer": "4.9.2", @@ -22771,13 +22602,13 @@ "dev": true }, "cdk-assets": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/cdk-assets/-/cdk-assets-2.55.0.tgz", - "integrity": "sha512-okqVag8vV57IeqFJp3lGtHIgDZaCpKJXZ8xRl8dfDayzNuxnuEyJzyAbo8SzlxwE3E+nqvJPVE4hdz0VbtwvqQ==", + "version": "2.55.1", + "resolved": "https://registry.npmjs.org/cdk-assets/-/cdk-assets-2.55.1.tgz", + "integrity": "sha512-ow6ajx3Dgs+ZD3iTu72lYLK97yHEuP1yvOkwKsrJvUkGwGox77btY51gDbp54owonzRHyt3lgfXvzAcq/ne4eg==", "dev": true, "requires": { - "@aws-cdk/cloud-assembly-schema": "2.55.0", - "@aws-cdk/cx-api": "2.55.0", + "@aws-cdk/cloud-assembly-schema": "2.55.1", + "@aws-cdk/cx-api": "2.55.1", "archiver": "^5.3.1", "aws-sdk": "^2.1211.0", "glob": "^7.2.3", @@ -22786,7 +22617,7 @@ }, "dependencies": { "@aws-cdk/cloud-assembly-schema": { - "version": "2.55.0", + "version": "2.55.1", "dev": true, "requires": { "jsonschema": "^1.4.1", @@ -22794,10 +22625,10 @@ } }, "@aws-cdk/cx-api": { - "version": "2.55.0", + "version": "2.55.1", "dev": true, "requires": { - "@aws-cdk/cloud-assembly-schema": "2.55.0", + "@aws-cdk/cloud-assembly-schema": "2.55.1", "semver": "^7.3.8" } }, @@ -23878,9 +23709,9 @@ "dev": true }, "constructs": { - "version": "10.1.190", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.190.tgz", - "integrity": "sha512-wGMEBsIKp/tP+b2q3XEtIh/KJPZ2uk7G2XyEbGVEatOo6OQHFhXfBi9BCk8725zuWYP/gZUQJfAvd7KZ+lY5Yw==", + "version": "10.1.196", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.196.tgz", + "integrity": "sha512-vgVM3vTWu8ZdHEa/icSzmZZOU5berKI+g8eosPKu+KOoAtS6o/eXqYObXejh79vy+rHyKK7yulUtSGCXU4ynUQ==", "dev": true }, "conventional-changelog-angular": { @@ -24439,33 +24270,33 @@ } }, "esbuild": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.7.tgz", - "integrity": "sha512-P6OBFYFSQOGzfApqCeYKqfKRRbCIRsdppTXFo4aAvtiW3o8TTyiIplBvHJI171saPAiy3WlawJHCveJVIOIx1A==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.16.7", - "@esbuild/android-arm64": "0.16.7", - "@esbuild/android-x64": "0.16.7", - "@esbuild/darwin-arm64": "0.16.7", - "@esbuild/darwin-x64": "0.16.7", - "@esbuild/freebsd-arm64": "0.16.7", - "@esbuild/freebsd-x64": "0.16.7", - "@esbuild/linux-arm": "0.16.7", - "@esbuild/linux-arm64": "0.16.7", - "@esbuild/linux-ia32": "0.16.7", - "@esbuild/linux-loong64": "0.16.7", - "@esbuild/linux-mips64el": "0.16.7", - "@esbuild/linux-ppc64": "0.16.7", - "@esbuild/linux-riscv64": "0.16.7", - "@esbuild/linux-s390x": "0.16.7", - "@esbuild/linux-x64": "0.16.7", - "@esbuild/netbsd-x64": "0.16.7", - "@esbuild/openbsd-x64": "0.16.7", - "@esbuild/sunos-x64": "0.16.7", - "@esbuild/win32-arm64": "0.16.7", - "@esbuild/win32-ia32": "0.16.7", - "@esbuild/win32-x64": "0.16.7" + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.10.tgz", + "integrity": "sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.10", + "@esbuild/android-arm64": "0.16.10", + "@esbuild/android-x64": "0.16.10", + "@esbuild/darwin-arm64": "0.16.10", + "@esbuild/darwin-x64": "0.16.10", + "@esbuild/freebsd-arm64": "0.16.10", + "@esbuild/freebsd-x64": "0.16.10", + "@esbuild/linux-arm": "0.16.10", + "@esbuild/linux-arm64": "0.16.10", + "@esbuild/linux-ia32": "0.16.10", + "@esbuild/linux-loong64": "0.16.10", + "@esbuild/linux-mips64el": "0.16.10", + "@esbuild/linux-ppc64": "0.16.10", + "@esbuild/linux-riscv64": "0.16.10", + "@esbuild/linux-s390x": "0.16.10", + "@esbuild/linux-x64": "0.16.10", + "@esbuild/netbsd-x64": "0.16.10", + "@esbuild/openbsd-x64": "0.16.10", + "@esbuild/sunos-x64": "0.16.10", + "@esbuild/win32-arm64": "0.16.10", + "@esbuild/win32-ia32": "0.16.10", + "@esbuild/win32-x64": "0.16.10" } }, "escalade": { @@ -24535,13 +24366,13 @@ } }, "eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -24560,7 +24391,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -25827,9 +25658,9 @@ "dev": true }, "ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "ignore-walk": { @@ -27786,13 +27617,13 @@ "dev": true }, "nise": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.3.tgz", - "integrity": "sha512-U597iWTTBBYIV72986jyU382/MMZ70ApWcRmkoF1AZ75bpqOtI3Gugv/6+0jLgoDOabmcSwYBkSSAWIp1eA5cg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/fake-timers": "^10.0.2", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", "path-to-regexp": "^1.7.0" @@ -27808,23 +27639,12 @@ } }, "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } + "@sinonjs/commons": "^2.0.0" } } } @@ -27978,9 +27798,9 @@ "dev": true }, "node-releases": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.7.tgz", - "integrity": "sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, "nopt": { @@ -29176,9 +28996,9 @@ } }, "minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -30223,14 +30043,14 @@ } }, "typedoc": { - "version": "0.23.22", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.22.tgz", - "integrity": "sha512-5sJkjK60xp8A7YpcYniu3+Wf0QcgojEnhzHuCN+CkdpQkKRhOspon/9+sGTkGI8kjVkZs3KHrhltpQyVhRMVfw==", + "version": "0.23.23", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.23.tgz", + "integrity": "sha512-cg1YQWj+/BU6wq74iott513U16fbrPCbyYs04PHZgvoKJIc6EY4xNobyDZh4KMfRGW8Yjv6wwIzQyoqopKOUGw==", "dev": true, "requires": { "lunr": "^2.3.9", - "marked": "^4.0.19", - "minimatch": "^5.1.0", + "marked": "^4.2.4", + "minimatch": "^5.1.1", "shiki": "^0.11.1" }, "dependencies": { @@ -30244,9 +30064,9 @@ } }, "minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" From 9c904d60460e9221e73eae73aabb38a2a873d861 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 21 Dec 2022 15:37:53 +0100 Subject: [PATCH 10/20] refactor: moved SSM specific logic from BaseProvider to SSMProvider --- packages/parameters/src/SSMProvider.ts | 33 ++++++++++++-------- packages/parameters/src/types/SSMProvider.ts | 9 ------ 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index d97a553d4a..e695571bcc 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -12,34 +12,41 @@ class SSMProvider extends BaseProvider { this.client = new SSMClient(config); } - protected async _get(name: string, sdkOptions?: Partial): Promise { - const options: GetParameterCommandInput = { + protected async _get(name: string, options?: SSMGetOptionsInterface): Promise { + const sdkOptions: GetParameterCommandInput = { Name: name, }; - if (sdkOptions) { - Object.assign(options, sdkOptions); + if (options) { + if (options.hasOwnProperty('decrypt')) sdkOptions.WithDecryption = options.decrypt; + if (options.hasOwnProperty('sdkOptions')) { + Object.assign(sdkOptions, options.sdkOptions); + } } - const result = await this.client.send(new GetParameterCommand(options)); + const result = await this.client.send(new GetParameterCommand(sdkOptions)); return result.Parameter?.Value; } - protected async _getMultiple(path: string, sdkOptions?: Partial): Promise> { - const options: GetParametersByPathCommandInput = { + protected async _getMultiple(path: string, options?: SSMGetMultipleOptionsInterface): Promise> { + const sdkOptions: GetParametersByPathCommandInput = { Path: path, }; const paginationOptions: PaginationConfiguration = { client: this.client }; - if (sdkOptions) { - Object.assign(options, sdkOptions); - if (sdkOptions.MaxResults) { - paginationOptions.pageSize = sdkOptions.MaxResults; + if (options) { + if (options.hasOwnProperty('decrypt')) sdkOptions.WithDecryption = options.decrypt; + if (options.hasOwnProperty('recursive')) sdkOptions.Recursive = options.recursive; + if (options.hasOwnProperty('sdkOptions')) { + Object.assign(sdkOptions, options.sdkOptions); + if (sdkOptions.MaxResults) { + paginationOptions.pageSize = sdkOptions.MaxResults; + } } } - + const parameters: Record = {}; - for await (const page of paginateGetParametersByPath(paginationOptions, options)) { + for await (const page of paginateGetParametersByPath(paginationOptions, sdkOptions)) { for (const parameter of page.Parameters || []) { /** * Standardize the parameter name diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index be976e3c8a..489f29afcd 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -17,8 +17,6 @@ interface SSMGetOptionsInterface { transform?: TransformOptions } -const isSSMGetOptionsInterface = (options: unknown): options is SSMGetOptionsInterface => (options as SSMGetOptionsInterface).decrypt !== undefined; - interface SSMGetMultipleOptionsInterface { maxAge?: number forceFetch?: boolean @@ -29,14 +27,7 @@ interface SSMGetMultipleOptionsInterface { throwOnTransformError?: boolean } -const isSSMGetMultipleOptionsInterface = - (options: unknown): options is SSMGetMultipleOptionsInterface => - (options as SSMGetMultipleOptionsInterface).decrypt !== undefined || - (options as SSMGetMultipleOptionsInterface).recursive !== undefined; - export { SSMGetOptionsInterface, - isSSMGetOptionsInterface, SSMGetMultipleOptionsInterface, - isSSMGetMultipleOptionsInterface, }; \ No newline at end of file From 4b7361b1c244dd31068b138e6d9792e9345e8c0e Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 21 Dec 2022 17:46:24 +0100 Subject: [PATCH 11/20] wip: other ssmprovider features --- packages/parameters/src/BaseProvider.ts | 28 +- packages/parameters/src/SSMProvider.ts | 290 ++++++++++++++++++- packages/parameters/src/types/SSMProvider.ts | 27 ++ 3 files changed, 327 insertions(+), 18 deletions(-) diff --git a/packages/parameters/src/BaseProvider.ts b/packages/parameters/src/BaseProvider.ts index d677f06c21..034f8fccaf 100644 --- a/packages/parameters/src/BaseProvider.ts +++ b/packages/parameters/src/BaseProvider.ts @@ -98,6 +98,20 @@ abstract class BaseProvider implements BaseProviderInterface { return values; } + /** + * Check whether a key has expired in the cache or not + * + * It returns true if the key is expired or not present in the cache. + * + * @param {string} key - Stringified representation of the key to retrieve + */ + public hasKeyExpiredInCache(key: string): boolean { + const value = this.store.get(key); + if (value) return value.isExpired(); + + return true; + } + /** * Retrieve parameter value from the underlying parameter store * @@ -114,20 +128,6 @@ abstract class BaseProvider implements BaseProviderInterface { */ protected abstract _getMultiple(path: string, options?: unknown): Promise>; - /** - * Check whether a key has expired in the cache or not - * - * It returns true if the key is expired or not present in the cache. - * - * @param {string} key - Stringified representation of the key to retrieve - */ - private hasKeyExpiredInCache(key: string): boolean { - const value = this.store.get(key); - if (value) return value.isExpired(); - - return true; - } - } const transformValue = (value: string | Uint8Array | undefined, transform: TransformOptions, throwOnTransformError: boolean, key: string): string | Record | undefined => { diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index e695571bcc..7d976171c0 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -1,17 +1,100 @@ -import { BaseProvider, DEFAULT_PROVIDERS } from './BaseProvider'; -import { SSMClient, GetParameterCommand, paginateGetParametersByPath } from '@aws-sdk/client-ssm'; -import type { SSMClientConfig, GetParameterCommandInput, GetParametersByPathCommandInput } from '@aws-sdk/client-ssm'; -import type { SSMGetMultipleOptionsInterface, SSMGetOptionsInterface } from 'types/SSMProvider'; +import { BaseProvider, DEFAULT_PROVIDERS, transformValue } from './BaseProvider'; +import { GetParameterError } from 'Exceptions'; +import { DEFAULT_MAX_AGE_SECS } from './constants'; +import { SSMClient, GetParameterCommand, paginateGetParametersByPath, GetParametersCommand } from '@aws-sdk/client-ssm'; +import type { + SSMClientConfig, + GetParameterCommandInput, + GetParametersByPathCommandInput, + GetParametersCommandInput, + GetParametersCommandOutput, +} from '@aws-sdk/client-ssm'; +import type { + SSMGetMultipleOptionsInterface, + SSMGetOptionsInterface, + SSMGetParametersByNameOutputInterface, + SSMGetParametersByNameOptionsInterface, + SSMSplitBatchAndDecryptParametersOutputType, + SSMGetParametersByNameFromCacheOutputType, +} from 'types/SSMProvider'; import type { PaginationConfiguration } from '@aws-sdk/types'; class SSMProvider extends BaseProvider { public client: SSMClient; + protected errorsKey = '_errors'; + protected maxGetParametersItems = 10; public constructor(config: SSMClientConfig = {}) { super(); this.client = new SSMClient(config); } + /** + * Retrieve multiple parameter values by name from SSM or cache. + * + * `ThrowOnError` decides whether to throw an error if a parameter is not found: + * - A) Default fail-fast behavior: Throws a `GetParameterError` error upon any failure. + * - B) Gracefully aggregate all parameters that failed under "_errors" key. + * + * It transparently uses GetParameter and/or GetParameters depending on decryption requirements. + * + * ```sh + * ┌────────────────────────┐ + * ┌───▶ Decrypt entire batch │─────┐ + * │ └────────────────────────┘ │ ┌────────────────────┐ + * │ ├─────▶ GetParameters API │ + * ┌──────────────────┐ │ ┌────────────────────────┐ │ └────────────────────┘ + * │ Split batch │─── ┼──▶│ No decryption required │─────┘ + * └──────────────────┘ │ └────────────────────────┘ + * │ ┌────────────────────┐ + * │ ┌────────────────────────┐ │ GetParameter API │ + * └──▶│Decrypt some but not all│───────────▶────────────────────┤ + * └────────────────────────┘ │ GetParameters API │ + * └────────────────────┘ + * ``` + * + * @param {Record[]} parameters - List of parameter names, and any optional overrides + * + */ + public async getParametersByName(parameters: Record, options: SSMGetParametersByNameOptionsInterface): Promise> { + const configs = { ...{ + decrypt: false, + maxAge: DEFAULT_MAX_AGE_SECS, + throwOnError: true, + }, ...options }; + + let response: Record = {}; + + // NOTE: We fail early to avoid unintended graceful errors being replaced with their '_errors' param values + SSMProvider.throwIfErrorsKeyIsPresent(parameters, this.errorsKey, configs.throwOnError); + + const { batch, decrypt } = SSMProvider.splitBatchAndDecryptParameters(parameters, configs); + // NOTE: We need to find out whether all parameters must be decrypted or not to know which API to use + // Logic: + // GetParameters API -> When decrypt is used for all parameters in the the batch + // GetParameter API -> When decrypt is used for one or more in the batch + if (Object.keys(decrypt).length !== Object.keys(parameters).length) { + const { response: decryptResponse, errors: decryptErrors } = await this.getParametersByNameWithDecryptOption(decrypt, configs.throwOnError); + const { response: batchResponse, errors: batchErrors } = await this.getParametersBatchByName(batch, configs.throwOnError, false); + + response = { ...decryptResponse, ...batchResponse }; + // Fail-fast disabled, let's aggregate errors under "_errors" key so they can handle gracefully + if (!configs.throwOnError) { + response[this.errorsKey] = [ ...decryptErrors, ...batchErrors ]; + } + } else { + const { response: batchResponse, errors: batchErrors } = await this.getParametersBatchByName(decrypt, configs.throwOnError, true); + + response = batchResponse; + // Fail-fast disabled, let's aggregate errors under "_errors" key so they can handle gracefully + if (!configs.throwOnError) { + response[this.errorsKey] = [...batchErrors]; + } + } + + return response; + } + protected async _get(name: string, options?: SSMGetOptionsInterface): Promise { const sdkOptions: GetParameterCommandInput = { Name: name, @@ -68,6 +151,205 @@ class SSMProvider extends BaseProvider { return parameters; } + + protected async _getParametersByName(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { + const results: SSMGetParametersByNameOutputInterface = { + response: {}, + errors: [], + }; + + const sdkOptions: GetParametersCommandInput = { + Names: Object.keys(parameters), + }; + if (decrypt) { + sdkOptions.WithDecryption = true; + } + + const result = await this.client.send(new GetParametersCommand(sdkOptions)); + results.errors = SSMProvider.handleAnyInvalidGetParameterErrors(result, throwOnError); + results.response = this.transformAndCacheGetParametersResponse(result, parameters, throwOnError); + + return results; + } + + /** + * Slice batch and fetch parameters using GetPrameters API by max permissible batch size + */ + protected async getParametersBatchByName(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { + const results: SSMGetParametersByNameOutputInterface = { + response: {}, + errors: [], + }; + + // Fetch each possible batch param from cache and return if entire batch is cached + const { cached, toFetch } = await this.getParametersByNameFromCache(parameters); + if (Object.keys(cached).length > Object.keys(parameters).length) { + results.response = cached; + + return results; + } + + // Slice batch by max permitted GetParameters call and retrieve the ones that are not cached + const { response: batchResponse, errors: batchErrors } = await this.getParametersByNameInChunks(toFetch, throwOnError, decrypt); + results.response = { ...cached, ...batchResponse }; + results.errors = batchErrors; + + return results; + } + + /** + * Fetch each parameter from batch that hasn't expired from cache + */ + protected async getParametersByNameFromCache(parameters: Record): Promise { + const results: SSMGetParametersByNameFromCacheOutputType = { + cached: {}, + toFetch: {}, + }; + + for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { + const cacheKey = [ parameterName, parameterOptions.transform ].toString(); + if (!super.hasKeyExpiredInCache(cacheKey)) { + results.cached[parameterName] = super.store.get(cacheKey); + } else { + results.toFetch[parameterName] = parameterOptions; + } + } + + return results; + } + + protected async getParametersByNameInChunks(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { + const results: SSMGetParametersByNameOutputInterface = { + response: {}, + errors: [], + }; + + // Slice object into chunks of max permissible batch size + const chunks = Object.entries(parameters).reduce((acc, [ parameterName, parameterOptions ], index) => { + const chunkIndex = Math.floor(index / this.maxGetParametersItems); + if (!acc[chunkIndex]) { + acc[chunkIndex] = {}; + } + acc[chunkIndex][parameterName] = parameterOptions; + + return acc; + }, [] as Record[]); + + // Fetch each chunk and merge results + for (const chunk of chunks) { + const { response: chunkResponse, errors: chunkErrors } = await this._getParametersByName(chunk, throwOnError, decrypt); + results.response = { ...results.response, ...chunkResponse }; + results.errors = [ ...results.errors, ...chunkErrors ]; + } + + return results; + } + + protected async getParametersByNameWithDecryptOption(parameters: Record, throwOnError: boolean): Promise { + const results: SSMGetParametersByNameOutputInterface = { + response: {}, + errors: [], + }; + + for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { + try { + results.response[parameterName] = await this._get(parameterName, parameterOptions); + } catch (error) { + if (throwOnError) { + throw error; + } + results.errors.push(parameterName); + } + } + + return results; + } + + /** + * Handle any invalid parameters returned by GetParameters API + * GetParameters is non-atomic. Failures don't always reflect in exceptions so we need to collect. + */ + protected static handleAnyInvalidGetParameterErrors(result: GetParametersCommandOutput, throwOnError: boolean): string[] { + const errors: string[] = []; + if (result.InvalidParameters && result.InvalidParameters.length > 0) { + if (throwOnError) { + throw new GetParameterError(`Failed to fetch parameters: ${result.InvalidParameters.join(', ')}`); + } + errors.push(...result.InvalidParameters); + } + + return errors; + } + + /** + * Split parameters that can be fetched by GetParameters vs GetParameter. + */ + protected static splitBatchAndDecryptParameters(parameters: Record, configs: SSMGetParametersByNameOptionsInterface): SSMSplitBatchAndDecryptParametersOutputType { + const splitParameters: SSMSplitBatchAndDecryptParametersOutputType = { + batch: {}, + decrypt: {}, + }; + + for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { + const overrides = parameterOptions || {}; + overrides.transform = overrides.transform || configs.transform; + + if (!overrides.hasOwnProperty('decrypt')) { + overrides.decrypt = configs.decrypt; + } + if (!overrides.hasOwnProperty('maxAge')) { + overrides.maxAge = configs.maxAge; + } + + if (overrides.decrypt) { + splitParameters.decrypt[parameterName] = overrides; + } else { + splitParameters.batch[parameterName] = overrides; + } + } + + return splitParameters; + } + + /** + * Throw a GetParameterError if fail-fast is disabled and `_errors` key is in parameters list. + * + * @param {Record} parameters + * @param {string} reservedParameter + * @param {boolean} throwOnError + */ + protected static throwIfErrorsKeyIsPresent(parameters: Record, reservedParameter: string, throwOnError: boolean): void { + if (!throwOnError && parameters.hasOwnProperty(reservedParameter)) { + throw new GetParameterError(`You cannot fetch a parameter named ${reservedParameter} in graceful error mode.`); + } + } + + protected transformAndCacheGetParametersResponse(response: GetParametersCommandOutput, parameters: Record, throwOnError: boolean): Record { + const results: Record = {}; + + for (const parameter of response.Parameters || []) { + // If the parameter is present in the response, then it has a Name + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const parameterName = parameter.Name!; + const parameterValue = parameter.Value; + const parameterOptions = parameters[parameterName]; + + let value; + // NOTE: if transform is set, we do it before caching to reduce number of operations + if (parameterValue && parameterOptions.transform) { + value = transformValue(parameterValue, parameterOptions.transform, throwOnError); + } + + if (value) { + const cacheKey = [ parameterName, parameterOptions.transform ].toString(); + super.addToCache(cacheKey, value, parameterOptions.maxAge || DEFAULT_MAX_AGE_SECS); + } + + results[parameterName] = value; + } + + return results; + } } const getParameter = (name: string, options?: SSMGetOptionsInterface): Promise> => { diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index 489f29afcd..312a9b14e5 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -1,4 +1,5 @@ import type { GetParameterCommandInput, GetParametersByPathCommandInput } from '@aws-sdk/client-ssm'; +import { ExpirableValue } from 'BaseProvider'; import type { TransformOptions } from 'types/BaseProvider'; /** @@ -27,7 +28,33 @@ interface SSMGetMultipleOptionsInterface { throwOnTransformError?: boolean } +interface SSMGetParametersByNameOptionsInterface { + maxAge?: number + throwOnError?: boolean + decrypt?: boolean + transform?: TransformOptions +} + +type SSMSplitBatchAndDecryptParametersOutputType = { + batch: Record + decrypt: Record +} & { [key: string]: SSMGetParametersByNameOptionsInterface }; + +interface SSMGetParametersByNameOutputInterface { + response: Record + errors: string[] +} + +type SSMGetParametersByNameFromCacheOutputType = { + cached: Record + toFetch: Record +} & { [key: string]: SSMGetParametersByNameOptionsInterface }; + export { SSMGetOptionsInterface, SSMGetMultipleOptionsInterface, + SSMGetParametersByNameOptionsInterface, + SSMSplitBatchAndDecryptParametersOutputType, + SSMGetParametersByNameOutputInterface, + SSMGetParametersByNameFromCacheOutputType, }; \ No newline at end of file From 33f447852805aa5bf422e67575b14256ac5cc828 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Wed, 21 Dec 2022 17:56:20 +0100 Subject: [PATCH 12/20] wip: other ssmprovider features --- packages/parameters/package.json | 2 +- packages/parameters/src/SSMProvider.ts | 2 +- packages/parameters/src/types/SSMProvider.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 245f43d4b2..780c801029 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -58,4 +58,4 @@ "aws-sdk-client-mock": "^2.0.1", "aws-sdk-client-mock-jest": "^2.0.1" } -} \ No newline at end of file +} diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index 7d976171c0..05142ebb62 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -1,5 +1,5 @@ import { BaseProvider, DEFAULT_PROVIDERS, transformValue } from './BaseProvider'; -import { GetParameterError } from 'Exceptions'; +import { GetParameterError } from './Exceptions'; import { DEFAULT_MAX_AGE_SECS } from './constants'; import { SSMClient, GetParameterCommand, paginateGetParametersByPath, GetParametersCommand } from '@aws-sdk/client-ssm'; import type { diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index 312a9b14e5..69266d0fbe 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -47,7 +47,7 @@ interface SSMGetParametersByNameOutputInterface { type SSMGetParametersByNameFromCacheOutputType = { cached: Record - toFetch: Record + toFetch: Record } & { [key: string]: SSMGetParametersByNameOptionsInterface }; export { From 362e7bd61f5db0d88a6230cfda7444e39422b0fd Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 27 Dec 2022 14:34:06 +0100 Subject: [PATCH 13/20] wip: other ssmprovider features --- packages/parameters/src/SSMProvider.ts | 14 +- packages/parameters/src/types/SSMProvider.ts | 5 +- .../parameters/tests/unit/SSMProvider.test.ts | 958 +++++++++++++++++- 3 files changed, 967 insertions(+), 10 deletions(-) diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index 05142ebb62..bc38a7265f 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -183,7 +183,7 @@ class SSMProvider extends BaseProvider { // Fetch each possible batch param from cache and return if entire batch is cached const { cached, toFetch } = await this.getParametersByNameFromCache(parameters); - if (Object.keys(cached).length > Object.keys(parameters).length) { + if (Object.keys(cached).length >= Object.keys(parameters).length) { results.response = cached; return results; @@ -208,8 +208,10 @@ class SSMProvider extends BaseProvider { for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { const cacheKey = [ parameterName, parameterOptions.transform ].toString(); - if (!super.hasKeyExpiredInCache(cacheKey)) { - results.cached[parameterName] = super.store.get(cacheKey); + if (!this.hasKeyExpiredInCache(cacheKey)) { + // Since we know the key exists in the cache, we can safely use the non-null assertion operator + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + results.cached[parameterName] = this.store.get(cacheKey)!.value; } else { results.toFetch[parameterName] = parameterOptions; } @@ -291,7 +293,7 @@ class SSMProvider extends BaseProvider { }; for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { - const overrides = parameterOptions || {}; + const overrides = parameterOptions; overrides.transform = overrides.transform || configs.transform; if (!overrides.hasOwnProperty('decrypt')) { @@ -338,11 +340,13 @@ class SSMProvider extends BaseProvider { // NOTE: if transform is set, we do it before caching to reduce number of operations if (parameterValue && parameterOptions.transform) { value = transformValue(parameterValue, parameterOptions.transform, throwOnError); + } else if (parameterValue) { + value = parameterValue; } if (value) { const cacheKey = [ parameterName, parameterOptions.transform ].toString(); - super.addToCache(cacheKey, value, parameterOptions.maxAge || DEFAULT_MAX_AGE_SECS); + this.addToCache(cacheKey, value, parameterOptions.maxAge || DEFAULT_MAX_AGE_SECS); } results[parameterName] = value; diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index 69266d0fbe..46f33ca5c6 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -1,5 +1,4 @@ import type { GetParameterCommandInput, GetParametersByPathCommandInput } from '@aws-sdk/client-ssm'; -import { ExpirableValue } from 'BaseProvider'; import type { TransformOptions } from 'types/BaseProvider'; /** @@ -24,7 +23,7 @@ interface SSMGetMultipleOptionsInterface { sdkOptions?: Partial decrypt?: boolean recursive?: boolean - transform?: string + transform?: TransformOptions throwOnTransformError?: boolean } @@ -46,7 +45,7 @@ interface SSMGetParametersByNameOutputInterface { } type SSMGetParametersByNameFromCacheOutputType = { - cached: Record + cached: Record> toFetch: Record } & { [key: string]: SSMGetParametersByNameOptionsInterface }; diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index 234df846e6..ae5b803b37 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -4,16 +4,231 @@ * @group unit/parameters/SSMProvider/class */ import { SSMProvider } from '../../src/SSMProvider'; -import { SSMClient, GetParameterCommand, GetParametersByPathCommand } from '@aws-sdk/client-ssm'; +import { + SSMClient, + GetParameterCommand, + GetParametersCommand, + GetParametersByPathCommand +} from '@aws-sdk/client-ssm'; +import type { GetParametersCommandOutput } from '@aws-sdk/client-ssm'; import { mockClient } from 'aws-sdk-client-mock'; import 'aws-sdk-client-mock-jest'; - +import type { + SSMGetParametersByNameFromCacheOutputType, + SSMGetParametersByNameOptionsInterface, + SSMSplitBatchAndDecryptParametersOutputType, + SSMGetParametersByNameOutputInterface +} from '../../src/types/SSMProvider'; +import { ExpirableValue } from '../../src/BaseProvider'; +import { toBase64 } from '@aws-sdk/util-base64'; + +const encoder = new TextEncoder(); + describe('Class: SSMProvider', () => { beforeEach(() => { jest.clearAllMocks(); }); + describe('Method: getParametersByName', () => { + + class SSMProviderMock extends SSMProvider { + public getParametersBatchByName = jest.fn(); + public getParametersByNameWithDecryptOption = jest.fn(); + + public constructor() { + super(); + } + } + + test('when called with no parameters to decrypt, it calls both getParametersByNameWithDecryptOption and getParametersBatchByName, then returns', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters: Record = { + '/foo/bar': { + maxAge: 1000, + }, + '/foo/baz': { + transform: 'json', + }, + }; + provider.getParametersByNameWithDecryptOption.mockResolvedValue({ + response: {}, + errors: [], + }); + provider.getParametersBatchByName.mockResolvedValue({ + response: { + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }, + errors: [], + }); + + // Act + await provider.getParametersByName(parameters, { decrypt: false }); + + // Assess + // throwOnTransformError is true by default + expect(provider.getParametersByNameWithDecryptOption).toHaveBeenCalledWith({}, true); + expect(provider.getParametersBatchByName).toHaveBeenCalledWith(parameters, true, false); + expect(provider.getParametersBatchByName).toHaveBeenCalledTimes(1); + + }); + + test('when called with all parameters to decrypt, it calls only getParametersBatchByName', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters: Record = { + '/foo/bar': { + maxAge: 1000, + }, + '/foo/baz': { + transform: 'json', + }, + }; + provider.getParametersBatchByName.mockResolvedValue({ + response: { + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }, + errors: [], + }); + + // Act + await provider.getParametersByName(parameters, { decrypt: true }); + + // Assess + expect(provider.getParametersBatchByName).toHaveBeenCalledWith(parameters, true, true); + expect(provider.getParametersBatchByName).toHaveBeenCalledTimes(1); + expect(provider.getParametersByNameWithDecryptOption).not.toHaveBeenCalled(); + + }); + + test('when called with some parameters to decrypt, it calls both getParametersByNameWithDecryptOption and getParametersBatchByName, then returns', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters: Record = { + '/foo/bar': { + maxAge: 1000, + }, + '/foo/baz': { + transform: 'json', + decrypt: true, + }, + }; + provider.getParametersByNameWithDecryptOption.mockResolvedValue({ + response: { + '/foo/baz': 'baz', + }, + errors: [], + }); + provider.getParametersBatchByName.mockResolvedValue({ + response: { + '/foo/bar': 'bar', + }, + errors: [], + }); + + // Act + await provider.getParametersByName(parameters, {}); + + // Assess + // throwOnError is true by default + expect(provider.getParametersByNameWithDecryptOption).toHaveBeenCalledWith({ + '/foo/baz': { + transform: 'json', + decrypt: true, + maxAge: 5, + }, + }, true); + expect(provider.getParametersBatchByName).toHaveBeenCalledWith({ + '/foo/bar': { + maxAge: 1000, + decrypt: false, + transform: undefined, + }, + }, true, false); + expect(provider.getParametersByNameWithDecryptOption).toHaveBeenCalledTimes(1); + expect(provider.getParametersBatchByName).toHaveBeenCalledTimes(1); + + }); + + test('when called and getParametersBatchByName returns an error and throwOnError is false, it returns the errors', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters: Record = { + '/foo/bar': { + maxAge: 1000, + }, + '/foo/baz': { + transform: 'json', + }, + }; + provider.getParametersByNameWithDecryptOption.mockResolvedValue({ + response: {}, + errors: [], + }); + provider.getParametersBatchByName.mockResolvedValue({ + response: { + '/foo/baz': 'baz', + }, + errors: [ + '/foo/bar', + ], + }); + + // Act + const result = await provider.getParametersByName(parameters, { decrypt: false, throwOnError: false }); + + // Assess + expect(result).toEqual({ + '/foo/baz': 'baz', + _errors: [ + '/foo/bar', + ], + }); + + }); + + test('when called and getParametersBatchByName returns an error and throwOnError is false, it returns the errors', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters: Record = { + '/foo/bar': { + maxAge: 1000, + }, + '/foo/baz': { + transform: 'json', + }, + }; + provider.getParametersBatchByName.mockResolvedValue({ + response: {}, + errors: [ + '/foo/bar', + '/foo/baz', + ], + }); + + // Act + const result = await provider.getParametersByName(parameters, { decrypt: true, throwOnError: false }); + + // Assess + expect(result).toEqual({ + _errors: [ + '/foo/bar', + '/foo/baz', + ], + }); + + }); + + }); + describe('Method: _get', () => { test('when called without sdkOptions, it gets the parameter using the name and with no decryption', async () => { @@ -220,4 +435,743 @@ describe('Class: SSMProvider', () => { }); + describe('Method: _getParametersByName', () => { + + class SSMProviderMock extends SSMProvider { + public transformAndCacheGetParametersResponse = jest.fn(); + + public constructor() { + super(); + } + + public _getParametersByName(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { + return super._getParametersByName(parameters, throwOnError, decrypt); + } + } + + test('when called with a list of parameters, it passes them to the sdk', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const client = mockClient(SSMClient).on(GetParametersCommand).resolves({ + Parameters: [ + { + Name: '/foo/bar', + Value: 'bar', + }, + { + Name: '/foo/baz', + Value: 'baz', + } + ], + InvalidParameters: [], + }); + const parameters = { + '/foo/bar': { + throwOnError: true, + decrypt: true, + }, + '/foo/baz': { + throwOnError: false, + decrypt: false, + }, + }; + provider.transformAndCacheGetParametersResponse.mockReturnValue({ + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }); + + // Act + const results = await provider._getParametersByName(parameters, true, true); + + // Assess + expect(results).toEqual({ + response: { + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }, + errors: [], + }); + expect(client).toReceiveCommandWith(GetParametersCommand, { + Names: [ + '/foo/bar', + '/foo/baz', + ], + WithDecryption: true, + }); + expect(provider.transformAndCacheGetParametersResponse).toHaveBeenCalledWith({ + Parameters: [ + { + Name: '/foo/bar', + Value: 'bar', + }, + { + Name: '/foo/baz', + Value: 'baz', + } + ], + InvalidParameters: [], + }, parameters, true); + + }); + + }); + + describe('Method: getParametersBatchByName', () => { + + class SSMProviderMock extends SSMProvider { + public getParametersByNameFromCache = jest.fn(); + public getParametersByNameInChunks = jest.fn(); + + public constructor() { + super(); + } + + public getParametersBatchByName(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { + return super.getParametersBatchByName(parameters, throwOnError, decrypt); + } + } + + test('when called with a list of parameters, if they are all cached, it returns them immediately', async () => { + + // Prepare + const provider = new SSMProviderMock(); + provider.getParametersByNameFromCache.mockResolvedValueOnce({ + cached: { + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }, + toFetch: {}, + }); + + // Act + const parameters = await provider.getParametersBatchByName({ + '/foo/bar': {}, + '/foo/baz': {}, + }, true, true); + + // Assess + expect(parameters).toEqual({ + response: { + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }, + errors: [], + }); + expect(provider.getParametersByNameFromCache).toHaveBeenCalledTimes(1); + expect(provider.getParametersByNameInChunks).toHaveBeenCalledTimes(0); + + }); + + test('when called with a list of parameters, if none of them are cached, it retrieves them and then returns', async () => { + + // Prepare + const provider = new SSMProviderMock(); + provider.getParametersByNameFromCache.mockResolvedValueOnce({ + cached: {}, + toFetch: { + '/foo/bar': {}, + '/foo/baz': {}, + }, + }); + provider.getParametersByNameInChunks.mockResolvedValueOnce({ + response: { + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }, + errors: [], + }); + + // Act + const parameters = await provider.getParametersBatchByName({ + '/foo/bar': {}, + '/foo/baz': {}, + }, true, true); + + // Assess + expect(parameters).toEqual({ + response: { + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }, + errors: [], + }); + expect(provider.getParametersByNameFromCache).toHaveBeenCalledTimes(1); + expect(provider.getParametersByNameInChunks).toHaveBeenCalledTimes(1); + expect(provider.getParametersByNameInChunks).toHaveBeenCalledWith({ + '/foo/bar': {}, + '/foo/baz': {}, + }, true, true); + + }); + + test('when called with a list of parameters, if some of them are cached, it retrieves the missing ones, and then returns them all', async () => { + + // Prepare + const provider = new SSMProviderMock(); + provider.getParametersByNameFromCache.mockResolvedValueOnce({ + cached: { + '/foo/bar': 'bar', + }, + toFetch: { + '/foo/baz': {}, + }, + }); + + provider.getParametersByNameInChunks.mockResolvedValueOnce({ + response: { + '/foo/baz': 'baz', + }, + errors: [], + }); + + // Act + const parameters = await provider.getParametersBatchByName({ + '/foo/bar': {}, + '/foo/baz': {}, + }, true, true); + + // Assess + expect(parameters).toEqual({ + response: { + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }, + errors: [], + }); + expect(provider.getParametersByNameFromCache).toHaveBeenCalledTimes(1); + expect(provider.getParametersByNameInChunks).toHaveBeenCalledTimes(1); + expect(provider.getParametersByNameInChunks).toHaveBeenCalledWith({ + '/foo/baz': {}, + }, true, true); + + }); + + }); + + describe('Method: getParametersByNameFromCache', () => { + class SSMProviderMock extends SSMProvider { + + public constructor() { + super(); + } + + public _add(key: string, value: ExpirableValue): void { + this.store.set(key, value); + } + + public async getParametersByNameFromCache(parameters: Record): Promise { + return super.getParametersByNameFromCache(parameters); + } + } + + test('when called with a batch of parameters, it returns an object with parameters split by cached and to fetch', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': {}, + '/foo/baz': {}, + }; + provider._add([ '/foo/bar', undefined ].toString(), new ExpirableValue('my-value', 60000)); + + // Act + const { cached, toFetch } = await provider.getParametersByNameFromCache(parameters); + + // Assess + expect(cached).toEqual({ + '/foo/bar': 'my-value', + }); + expect(toFetch).toEqual({ + '/foo/baz': {}, + }); + + }); + + }); + + describe('Method: getParametersByNameInChunks', () => { + + class SSMProviderMock extends SSMProvider { + public _getParametersByName = jest.fn(); + public maxGetParametersItems = 1; + + public constructor() { + super(); + } + + public async getParametersByNameInChunks(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { + return super.getParametersByNameInChunks(parameters, throwOnError, decrypt); + } + } + + test('when called with a batch of parameters to retrieve, it splits them in chunks and retrieves them', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': {}, + '/foo/baz': {}, + }; + + provider._getParametersByName + .mockResolvedValueOnce({ + response: { '/foo/bar': 'bar' }, + errors: [], + }) + .mockResolvedValueOnce({ + response: { '/foo/baz': 'baz' }, + errors: [], + }); + + // Act + const { response, errors } = await provider.getParametersByNameInChunks(parameters, false, false); + + // Assess + expect(response).toEqual({ + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }); + expect(errors).toEqual([]); + expect(provider._getParametersByName).toHaveBeenCalledTimes(2); + + }); + + test('when retrieving parameters, if throwOnError is true, it throws an error if any parameter is not found', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': {}, + '/foo/baz': {}, + }; + + provider._getParametersByName + .mockResolvedValueOnce({ + response: { '/foo/bar': 'bar' }, + errors: [], + }) + .mockRejectedValueOnce(new Error('Parameter not found')); + + // Act + await expect(provider.getParametersByNameInChunks(parameters, true, false)).rejects.toThrowError('Parameter not found'); + + }); + + test('when retrieving parameters, if throwOnError is false, it returns an object with the parameters values and the errors', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': {}, + '/foo/baz': {}, + }; + + provider._getParametersByName + .mockResolvedValueOnce({ + response: { '/foo/bar': 'bar' }, + errors: [], + }) + .mockResolvedValueOnce({ + response: {}, + errors: ['/foo/baz'], + }); + + // Act + const { response, errors } = await provider.getParametersByNameInChunks(parameters, false, false); + + // Assess + expect(response).toEqual({ + '/foo/bar': 'bar', + }); + expect(errors).toEqual(['/foo/baz']); + + }); + + }); + + describe('Method: getParametersByNameWithDecryptOption', () => { + + class SSMProviderMock extends SSMProvider { + public _get = jest.fn(); + + public constructor() { + super(); + } + + public async getParametersByNameWithDecryptOption(parameters: Record, throwOnError: boolean): Promise { + return super.getParametersByNameWithDecryptOption(parameters, throwOnError); + } + } + + test('when called with a batch of parameters to retrieve, it returns an object with the parameters values', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': {}, + '/foo/baz': {}, + }; + provider._get + .mockResolvedValueOnce('bar') + .mockResolvedValueOnce('baz'); + + // Act + const { response, errors } = await provider.getParametersByNameWithDecryptOption(parameters, false); + + // Assess + expect(response).toEqual({ + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }); + expect(errors).toEqual([]); + + }); + + test('when called with a batch of parameters to retrieve, and throwOnError is set to false, it returns an object with the parameters values and the errors', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': {}, + '/foo/baz': {}, + }; + provider._get + .mockResolvedValueOnce('bar') + .mockRejectedValueOnce(new Error('baz')); + + // Act + const { response, errors } = await provider.getParametersByNameWithDecryptOption(parameters, false); + + // Assess + expect(response).toEqual({ + '/foo/bar': 'bar', + }); + expect(errors).toEqual(['/foo/baz']); + + }); + + test('when called with a batch of parameters to retrieve, and throwOnError is set to true, it throws an error if any parameter retrieval throws', async () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': {}, + '/foo/baz': {}, + }; + provider._get + .mockResolvedValueOnce('bar') + .mockRejectedValueOnce(new Error('baz')); + + // Act & Assess + await expect(provider.getParametersByNameWithDecryptOption(parameters, true)) + .rejects.toThrow(); + + }); + + }); + + describe('Method: handleAnyInvalidGetparameterErrors', () => { + + class SSMProviderMock extends SSMProvider { + + public constructor() { + super(); + } + + public handleAnyInvalidGetParameterErrors(result: Partial, throwOnError: boolean): string[] { + return SSMProvider.handleAnyInvalidGetParameterErrors(result as GetParametersCommandOutput, throwOnError); + } + } + + test('when called without any errors, it doesn\'t throw and returns an empty errors array', () => { + + // Prepare + const provider = new SSMProviderMock(); + const result = { + InvalidParameters: [], + }; + + // Act + const errors = provider.handleAnyInvalidGetParameterErrors(result, false); + + // Assess + expect(errors).toEqual([]); + + }); + + test('when called with errors, and throwOnError is set to false, it returns the errors array', () => { + + // Prepare + const provider = new SSMProviderMock(); + const result = { + InvalidParameters: [ '/foo/bar', '/foo/baz' ], + }; + + // Act + const errors = provider.handleAnyInvalidGetParameterErrors(result, false); + + // Assess + expect(errors).toEqual([ '/foo/bar', '/foo/baz' ]); + + }); + + test('when called with errors, and throwOnError is set to true, it throws an error', () => { + + // Prepare + const provider = new SSMProviderMock(); + const result = { + InvalidParameters: [ '/foo/bar', '/foo/baz' ], + }; + + // Act & Assess + expect(() => provider.handleAnyInvalidGetParameterErrors(result, true)).toThrowError('Failed to fetch parameters: /foo/bar, /foo/baz'); + + }); + + }); + + describe('Method: splitBatchAndDecryptParameters', () => { + + class SSMProviderMock extends SSMProvider { + + public constructor() { + super(); + } + + public splitBatchAndDecryptParameters(parameters: Record, configs: SSMGetParametersByNameOptionsInterface): SSMSplitBatchAndDecryptParametersOutputType { + return SSMProvider.splitBatchAndDecryptParameters(parameters, configs); + } + } + + test('when called with a batch of parameters, and none has decrypt set to TRUE, it returns an object with all the parameters in batch', () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': {}, + '/foo/baz': { + maxAge: 1000, + }, + }; + + // Act + const { batch: notToDecrypt, decrypt } = provider.splitBatchAndDecryptParameters(parameters, {}); + + // Assess + expect(decrypt).toEqual({}); + expect(notToDecrypt).toEqual({ + '/foo/bar': {}, + '/foo/baz': { + maxAge: 1000, + }, + }); + + }); + + test('when called with a batch of parameters, it returns an object with parameters split by decrypt and not to decrypt', () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': { + decrypt: true, + }, + '/foo/baz': { + decrypt: false, + }, + }; + + // Act + const { batch: notToDecrypt, decrypt } = provider.splitBatchAndDecryptParameters(parameters, {}); + + // Assess + expect(decrypt).toEqual({ + '/foo/bar': { + decrypt: true, + transform: undefined + }, + }); + expect(notToDecrypt).toEqual({ + '/foo/baz': { + decrypt: false, + transform: undefined + } + }); + + }); + + test('when called with a batch of parameters, it respects any local overrides by giving them precedence over global config', () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + '/foo/bar': { + decrypt: true, + }, + '/foo/baz': { + maxAge: 1000, + }, + }; + + // Act + const { batch: notToDecrypt, decrypt } = provider.splitBatchAndDecryptParameters(parameters, { + decrypt: false, + maxAge: 2000, + }); + + // Assess + expect(decrypt).toEqual({ + '/foo/bar': { + decrypt: true, + maxAge: 2000, + transform: undefined + }, + }); + expect(notToDecrypt).toEqual({ + '/foo/baz': { + decrypt: false, + maxAge: 1000, + transform: undefined + } + }); + + }); + + }); + + describe('Method: throwIfErrorsKeyIsPresent', () => { + + class SSMProviderMock extends SSMProvider { + + public constructor() { + super(); + } + + public throwIfErrorsKeyIsPresent(parameters: Record, reservedParameter: string, throwOnError: boolean): void { + return SSMProvider.throwIfErrorsKeyIsPresent(parameters, reservedParameter, throwOnError); + } + } + + test('when called and no parameter is named _errors, it doesn\'t throw', () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + 'foo': 'bar', + 'baz': 'qux', + }; + + // Act & Assess + expect(() => provider.throwIfErrorsKeyIsPresent(parameters, '_errors', false)).not.toThrow(); + + }); + + test('when called and a parameter is named _errors, and throwOnError is set to false (graceful error mode), it doesn\'t throw', () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + 'foo': 'bar', + 'baz': 'qux', + '_errors': 'baz', + }; + + // Act & Assess + expect(() => provider.throwIfErrorsKeyIsPresent(parameters, '_errors', false)).toThrow('You cannot fetch a parameter named _errors in graceful error mode.'); + + }); + + test('when called and a parameter is named _errors, and throwOnError is set to true (fail fast mode), it throws an error', () => { + + // Prepare + const provider = new SSMProviderMock(); + const parameters = { + 'foo': 'bar', + 'baz': 'qux', + '_errors': 'baz', + }; + + // Act & Assess + expect(() => provider.throwIfErrorsKeyIsPresent(parameters, '_errors', true)).not.toThrow(); + + }); + + }); + + describe('Method: transformAndCacheGetParametersResponse', () => { + + class SSMProviderMock extends SSMProvider { + + public constructor() { + super(); + } + + public transformAndCacheGetParametersResponse(response: Partial, parameters: Record, throwOnError: boolean): Record { + return super.transformAndCacheGetParametersResponse(response as GetParametersCommandOutput, parameters, throwOnError); + } + } + + test('when called with a response that has no Parameters list, it returns an empty object', () => { + + // Prepare + const provider = new SSMProviderMock(); + const response = {}; + + // Act + const parameters = provider.transformAndCacheGetParametersResponse(response, {}, false); + + // Assess + expect(parameters).toEqual({}); + + }); + + test('when called with an empty response, it returns an empty object', () => { + + // Prepare + const provider = new SSMProviderMock(); + const response = { + Parameters: [], + }; + + // Act + const parameters = provider.transformAndCacheGetParametersResponse(response, {}, false); + + // Assess + expect(parameters).toEqual({}); + + }); + + test('when called with a response, it returns an object with the parameters', () => { + + // Prepare + const provider = new SSMProviderMock(); + const response = { + Parameters: [ { + Name: '/foo/bar', + Value: toBase64(encoder.encode('bar')).toString(), + }, { + Name: '/foo/baz', + Value: 'baz', + } ], + }; + + // Act + const parameters = provider.transformAndCacheGetParametersResponse(response, { + '/foo/bar': { + transform: 'binary' + }, + '/foo/baz': {}, + }, false); + + // Assess + expect(parameters).toEqual({ + '/foo/bar': 'bar', + '/foo/baz': 'baz', + }); + + }); + + }); + }); \ No newline at end of file From c844f4922e1659331be303922d19211700e09ff9 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 27 Dec 2022 14:47:44 +0100 Subject: [PATCH 14/20] feat: completed SSMProvider implementation --- packages/parameters/src/SSMProvider.ts | 11 +++- .../tests/unit/getParametersByName.test.ts | 60 +++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 packages/parameters/tests/unit/getParametersByName.test.ts diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/SSMProvider.ts index bc38a7265f..b469896e0c 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/SSMProvider.ts @@ -56,7 +56,7 @@ class SSMProvider extends BaseProvider { * @param {Record[]} parameters - List of parameter names, and any optional overrides * */ - public async getParametersByName(parameters: Record, options: SSMGetParametersByNameOptionsInterface): Promise> { + public async getParametersByName(parameters: Record, options?: SSMGetParametersByNameOptionsInterface): Promise> { const configs = { ...{ decrypt: false, maxAge: DEFAULT_MAX_AGE_SECS, @@ -372,8 +372,17 @@ const getParameters = (path: string, options?: SSMGetMultipleOptionsInterface): return DEFAULT_PROVIDERS.ssm.getMultiple(path, options); }; +const getParametersByName = (parameters: Record, options?: SSMGetParametersByNameOptionsInterface): Promise> => { + if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { + DEFAULT_PROVIDERS.ssm = new SSMProvider(); + } + + return (DEFAULT_PROVIDERS.ssm as SSMProvider).getParametersByName(parameters, options); +}; + export { SSMProvider, getParameter, getParameters, + getParametersByName, }; \ No newline at end of file diff --git a/packages/parameters/tests/unit/getParametersByName.test.ts b/packages/parameters/tests/unit/getParametersByName.test.ts new file mode 100644 index 0000000000..420d8fd6a1 --- /dev/null +++ b/packages/parameters/tests/unit/getParametersByName.test.ts @@ -0,0 +1,60 @@ +/** + * Test getParametersByName function + * + * @group unit/parameters/SSMProvider/getParametersByName/function + */ +import { DEFAULT_PROVIDERS } from '../../src/BaseProvider'; +import { SSMProvider, getParametersByName } from '../../src/SSMProvider'; + +describe('Function: getParametersByName', () => { + + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('when called and a default provider doesn\'t exist, it instantiates one and returns the value', async () => { + + // Prepare + const parameters = { + '/foo/bar': { + maxAge: 1000, + }, + '/foo/baz': { + maxAge: 2000, + } + }; + const getParametersByNameSpy = jest.spyOn(SSMProvider.prototype, 'getParametersByName').mockImplementation(); + + // Act + await getParametersByName(parameters); + + // Assess + expect(getParametersByNameSpy).toHaveBeenCalledWith(parameters, undefined); + + }); + + test('when called and a default provider exists, it uses it and returns the value', async () => { + + // Prepare + const provider = new SSMProvider(); + DEFAULT_PROVIDERS.ssm = provider; + const parameters = { + '/foo/bar': { + maxAge: 1000, + }, + '/foo/baz': { + maxAge: 2000, + } + }; + const getParametersByNameSpy = jest.spyOn(provider, 'getParametersByName').mockImplementation(); + + // Act + await getParametersByName(parameters); + + // Assess + expect(getParametersByNameSpy).toHaveBeenCalledWith(parameters, undefined); + expect(DEFAULT_PROVIDERS.ssm).toBe(provider); + + }); + +}); \ No newline at end of file From 316a5c31794adf6e1d8ab4233dd9c8f103a1091e Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 29 Dec 2022 18:14:13 +0100 Subject: [PATCH 15/20] refactor: folder structure --- .../parameters/src/{ => ssm}/SSMProvider.ts | 36 +++---------------- packages/parameters/src/ssm/getParameter.ts | 17 +++++++++ packages/parameters/src/ssm/getParameters.ts | 17 +++++++++ .../parameters/src/ssm/getParametersByName.ts | 17 +++++++++ packages/parameters/src/ssm/index.ts | 4 +++ packages/parameters/src/types/SSMProvider.ts | 14 +++----- .../parameters/tests/unit/SSMProvider.test.ts | 6 ++-- .../tests/unit/getParameter.test.ts | 6 ++-- .../tests/unit/getParameters.test.ts | 6 ++-- .../tests/unit/getParametersByName.test.ts | 6 ++-- 10 files changed, 76 insertions(+), 53 deletions(-) rename packages/parameters/src/{ => ssm}/SSMProvider.ts (93%) create mode 100644 packages/parameters/src/ssm/getParameter.ts create mode 100644 packages/parameters/src/ssm/getParameters.ts create mode 100644 packages/parameters/src/ssm/getParametersByName.ts create mode 100644 packages/parameters/src/ssm/index.ts diff --git a/packages/parameters/src/SSMProvider.ts b/packages/parameters/src/ssm/SSMProvider.ts similarity index 93% rename from packages/parameters/src/SSMProvider.ts rename to packages/parameters/src/ssm/SSMProvider.ts index b469896e0c..6855c64363 100644 --- a/packages/parameters/src/SSMProvider.ts +++ b/packages/parameters/src/ssm/SSMProvider.ts @@ -1,6 +1,6 @@ -import { BaseProvider, DEFAULT_PROVIDERS, transformValue } from './BaseProvider'; -import { GetParameterError } from './Exceptions'; -import { DEFAULT_MAX_AGE_SECS } from './constants'; +import { BaseProvider, DEFAULT_PROVIDERS, transformValue } from '../BaseProvider'; +import { GetParameterError } from '../Exceptions'; +import { DEFAULT_MAX_AGE_SECS } from '../constants'; import { SSMClient, GetParameterCommand, paginateGetParametersByPath, GetParametersCommand } from '@aws-sdk/client-ssm'; import type { SSMClientConfig, @@ -339,7 +339,7 @@ class SSMProvider extends BaseProvider { let value; // NOTE: if transform is set, we do it before caching to reduce number of operations if (parameterValue && parameterOptions.transform) { - value = transformValue(parameterValue, parameterOptions.transform, throwOnError); + value = transformValue(parameterValue, parameterOptions.transform, throwOnError, parameterName); } else if (parameterValue) { value = parameterValue; } @@ -356,33 +356,7 @@ class SSMProvider extends BaseProvider { } } -const getParameter = (name: string, options?: SSMGetOptionsInterface): Promise> => { - if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { - DEFAULT_PROVIDERS.ssm = new SSMProvider(); - } - - return DEFAULT_PROVIDERS.ssm.get(name, options); -}; - -const getParameters = (path: string, options?: SSMGetMultipleOptionsInterface): Promise> => { - if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { - DEFAULT_PROVIDERS.ssm = new SSMProvider(); - } - - return DEFAULT_PROVIDERS.ssm.getMultiple(path, options); -}; - -const getParametersByName = (parameters: Record, options?: SSMGetParametersByNameOptionsInterface): Promise> => { - if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { - DEFAULT_PROVIDERS.ssm = new SSMProvider(); - } - - return (DEFAULT_PROVIDERS.ssm as SSMProvider).getParametersByName(parameters, options); -}; - export { SSMProvider, - getParameter, - getParameters, - getParametersByName, + DEFAULT_PROVIDERS, }; \ No newline at end of file diff --git a/packages/parameters/src/ssm/getParameter.ts b/packages/parameters/src/ssm/getParameter.ts new file mode 100644 index 0000000000..9c1757e730 --- /dev/null +++ b/packages/parameters/src/ssm/getParameter.ts @@ -0,0 +1,17 @@ +import { SSMProvider, DEFAULT_PROVIDERS } from './SSMProvider'; +import type { SSMGetOptionsInterface } from 'types/SSMProvider'; + +const getParameter = ( + name: string, + options?: SSMGetOptionsInterface +): Promise> => { + if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { + DEFAULT_PROVIDERS.ssm = new SSMProvider(); + } + + return DEFAULT_PROVIDERS.ssm.get(name, options); +}; + +export { + getParameter, +}; \ No newline at end of file diff --git a/packages/parameters/src/ssm/getParameters.ts b/packages/parameters/src/ssm/getParameters.ts new file mode 100644 index 0000000000..5a390bc0be --- /dev/null +++ b/packages/parameters/src/ssm/getParameters.ts @@ -0,0 +1,17 @@ +import { SSMProvider, DEFAULT_PROVIDERS } from './SSMProvider'; +import type { SSMGetMultipleOptionsInterface } from 'types/SSMProvider'; + +const getParameters = ( + path: string, + options?: SSMGetMultipleOptionsInterface +): Promise> => { + if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { + DEFAULT_PROVIDERS.ssm = new SSMProvider(); + } + + return DEFAULT_PROVIDERS.ssm.getMultiple(path, options); +}; + +export { + getParameters, +}; \ No newline at end of file diff --git a/packages/parameters/src/ssm/getParametersByName.ts b/packages/parameters/src/ssm/getParametersByName.ts new file mode 100644 index 0000000000..41037913d0 --- /dev/null +++ b/packages/parameters/src/ssm/getParametersByName.ts @@ -0,0 +1,17 @@ +import { SSMProvider, DEFAULT_PROVIDERS } from './SSMProvider'; +import type { SSMGetParametersByNameOptionsInterface } from 'types/SSMProvider'; + +const getParametersByName = ( + parameters: Record, + options?: SSMGetParametersByNameOptionsInterface +): Promise> => { + if (!DEFAULT_PROVIDERS.hasOwnProperty('ssm')) { + DEFAULT_PROVIDERS.ssm = new SSMProvider(); + } + + return (DEFAULT_PROVIDERS.ssm as SSMProvider).getParametersByName(parameters, options); +}; + +export { + getParametersByName, +}; \ No newline at end of file diff --git a/packages/parameters/src/ssm/index.ts b/packages/parameters/src/ssm/index.ts new file mode 100644 index 0000000000..e275be6d78 --- /dev/null +++ b/packages/parameters/src/ssm/index.ts @@ -0,0 +1,4 @@ +export * from './SSMProvider'; +export * from './getParameter'; +export * from './getParameters'; +export * from './getParametersByName'; \ No newline at end of file diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index 46f33ca5c6..debd966c1a 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -1,5 +1,5 @@ import type { GetParameterCommandInput, GetParametersByPathCommandInput } from '@aws-sdk/client-ssm'; -import type { TransformOptions } from 'types/BaseProvider'; +import type { GetOptionsInterface, GetMultipleOptionsInterface, TransformOptions } from './BaseProvider'; /** * Options for the SSMProvider get method. @@ -9,21 +9,15 @@ import type { TransformOptions } from 'types/BaseProvider'; * @property {boolean} decrypt - If true, the parameter will be decrypted. * @property {Partial} sdkOptions - Options for the AWS SDK. */ -interface SSMGetOptionsInterface { - maxAge?: number - sdkOptions?: Partial - forceFetch?: boolean +interface SSMGetOptionsInterface extends GetOptionsInterface { decrypt?: boolean - transform?: TransformOptions + sdkOptions?: Partial } -interface SSMGetMultipleOptionsInterface { - maxAge?: number - forceFetch?: boolean +interface SSMGetMultipleOptionsInterface extends GetMultipleOptionsInterface { sdkOptions?: Partial decrypt?: boolean recursive?: boolean - transform?: TransformOptions throwOnTransformError?: boolean } diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index ae5b803b37..d7b896955a 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -1,9 +1,9 @@ /** - * Test SSMProvider class + * Test SSMProvider class * - * @group unit/parameters/SSMProvider/class + * @group unit/parameters/ssm/class */ -import { SSMProvider } from '../../src/SSMProvider'; +import { SSMProvider } from '../../src/ssm'; import { SSMClient, GetParameterCommand, diff --git a/packages/parameters/tests/unit/getParameter.test.ts b/packages/parameters/tests/unit/getParameter.test.ts index b64609e46d..f13f993cbf 100644 --- a/packages/parameters/tests/unit/getParameter.test.ts +++ b/packages/parameters/tests/unit/getParameter.test.ts @@ -1,10 +1,10 @@ /** - * Test getParameter function + * Test getParameter function * - * @group unit/parameters/SSMProvider/getParameter/function + * @group unit/parameters/ssm/getParameter/function */ import { DEFAULT_PROVIDERS } from '../../src/BaseProvider'; -import { SSMProvider, getParameter } from '../../src/SSMProvider'; +import { SSMProvider, getParameter } from '../../src/ssm'; import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm'; import { mockClient } from 'aws-sdk-client-mock'; import 'aws-sdk-client-mock-jest'; diff --git a/packages/parameters/tests/unit/getParameters.test.ts b/packages/parameters/tests/unit/getParameters.test.ts index 3c964941ec..8f9b68f6bd 100644 --- a/packages/parameters/tests/unit/getParameters.test.ts +++ b/packages/parameters/tests/unit/getParameters.test.ts @@ -1,10 +1,10 @@ /** - * Test getParameters function + * Test getParameters function * - * @group unit/parameters/SSMProvider/getParameters/function + * @group unit/parameters/ssm/getParameters/function */ import { DEFAULT_PROVIDERS } from '../../src/BaseProvider'; -import { SSMProvider, getParameters } from '../../src/SSMProvider'; +import { SSMProvider, getParameters } from '../../src/ssm'; import { SSMClient, GetParametersByPathCommand } from '@aws-sdk/client-ssm'; import { mockClient } from 'aws-sdk-client-mock'; import 'aws-sdk-client-mock-jest'; diff --git a/packages/parameters/tests/unit/getParametersByName.test.ts b/packages/parameters/tests/unit/getParametersByName.test.ts index 420d8fd6a1..d1ad31815e 100644 --- a/packages/parameters/tests/unit/getParametersByName.test.ts +++ b/packages/parameters/tests/unit/getParametersByName.test.ts @@ -1,10 +1,10 @@ /** - * Test getParametersByName function + * Test getParametersByName function * - * @group unit/parameters/SSMProvider/getParametersByName/function + * @group unit/parameters/ssm/getParametersByName/function */ import { DEFAULT_PROVIDERS } from '../../src/BaseProvider'; -import { SSMProvider, getParametersByName } from '../../src/SSMProvider'; +import { SSMProvider, getParametersByName } from '../../src/ssm'; describe('Function: getParametersByName', () => { From 444bbc9ae81d1af37b78ab2f9db5c33df46ba1aa Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 29 Dec 2022 18:30:19 +0100 Subject: [PATCH 16/20] refactor: aliases --- packages/parameters/src/ssm/SSMProvider.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/parameters/src/ssm/SSMProvider.ts b/packages/parameters/src/ssm/SSMProvider.ts index 6855c64363..75d3a65fc1 100644 --- a/packages/parameters/src/ssm/SSMProvider.ts +++ b/packages/parameters/src/ssm/SSMProvider.ts @@ -29,6 +29,14 @@ class SSMProvider extends BaseProvider { this.client = new SSMClient(config); } + public async get(name: string, options?: SSMGetOptionsInterface | undefined): Promise | undefined> { + return super.get(name, options); + } + + public async getMultiple(path: string, options?: SSMGetMultipleOptionsInterface | undefined): Promise> { + return super.getMultiple(path, options); + } + /** * Retrieve multiple parameter values by name from SSM or cache. * @@ -211,7 +219,7 @@ class SSMProvider extends BaseProvider { if (!this.hasKeyExpiredInCache(cacheKey)) { // Since we know the key exists in the cache, we can safely use the non-null assertion operator // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - results.cached[parameterName] = this.store.get(cacheKey)!.value; + results.cached[parameterName] = this.store.get(cacheKey)!.value as Record>; } else { results.toFetch[parameterName] = parameterOptions; } From bf4a9a5cfad47c4f4edb04ab7f4630a0d50dc285 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 30 Dec 2022 18:17:50 +0100 Subject: [PATCH 17/20] refactor: changed variable names in splitBatchAndDecryptParameters --- packages/parameters/src/ssm/SSMProvider.ts | 18 +++++------ packages/parameters/src/types/SSMProvider.ts | 4 +-- .../parameters/tests/unit/SSMProvider.test.ts | 32 +++++++++++++------ 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/packages/parameters/src/ssm/SSMProvider.ts b/packages/parameters/src/ssm/SSMProvider.ts index 75d3a65fc1..c43a6f9d2c 100644 --- a/packages/parameters/src/ssm/SSMProvider.ts +++ b/packages/parameters/src/ssm/SSMProvider.ts @@ -76,14 +76,14 @@ class SSMProvider extends BaseProvider { // NOTE: We fail early to avoid unintended graceful errors being replaced with their '_errors' param values SSMProvider.throwIfErrorsKeyIsPresent(parameters, this.errorsKey, configs.throwOnError); - const { batch, decrypt } = SSMProvider.splitBatchAndDecryptParameters(parameters, configs); + const { parametersToFetchInBatch, parametersToDecrypt } = SSMProvider.splitBatchAndDecryptParameters(parameters, configs); // NOTE: We need to find out whether all parameters must be decrypted or not to know which API to use // Logic: // GetParameters API -> When decrypt is used for all parameters in the the batch // GetParameter API -> When decrypt is used for one or more in the batch - if (Object.keys(decrypt).length !== Object.keys(parameters).length) { - const { response: decryptResponse, errors: decryptErrors } = await this.getParametersByNameWithDecryptOption(decrypt, configs.throwOnError); - const { response: batchResponse, errors: batchErrors } = await this.getParametersBatchByName(batch, configs.throwOnError, false); + if (Object.keys(parametersToDecrypt).length !== Object.keys(parameters).length) { + const { response: decryptResponse, errors: decryptErrors } = await this.getParametersByNameWithDecryptOption(parametersToDecrypt, configs.throwOnError); + const { response: batchResponse, errors: batchErrors } = await this.getParametersBatchByName(parametersToFetchInBatch, configs.throwOnError, false); response = { ...decryptResponse, ...batchResponse }; // Fail-fast disabled, let's aggregate errors under "_errors" key so they can handle gracefully @@ -91,7 +91,7 @@ class SSMProvider extends BaseProvider { response[this.errorsKey] = [ ...decryptErrors, ...batchErrors ]; } } else { - const { response: batchResponse, errors: batchErrors } = await this.getParametersBatchByName(decrypt, configs.throwOnError, true); + const { response: batchResponse, errors: batchErrors } = await this.getParametersBatchByName(parametersToDecrypt, configs.throwOnError, true); response = batchResponse; // Fail-fast disabled, let's aggregate errors under "_errors" key so they can handle gracefully @@ -296,8 +296,8 @@ class SSMProvider extends BaseProvider { */ protected static splitBatchAndDecryptParameters(parameters: Record, configs: SSMGetParametersByNameOptionsInterface): SSMSplitBatchAndDecryptParametersOutputType { const splitParameters: SSMSplitBatchAndDecryptParametersOutputType = { - batch: {}, - decrypt: {}, + parametersToFetchInBatch: {}, + parametersToDecrypt: {}, }; for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { @@ -312,9 +312,9 @@ class SSMProvider extends BaseProvider { } if (overrides.decrypt) { - splitParameters.decrypt[parameterName] = overrides; + splitParameters.parametersToDecrypt[parameterName] = overrides; } else { - splitParameters.batch[parameterName] = overrides; + splitParameters.parametersToFetchInBatch[parameterName] = overrides; } } diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index debd966c1a..486e3dac31 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -29,8 +29,8 @@ interface SSMGetParametersByNameOptionsInterface { } type SSMSplitBatchAndDecryptParametersOutputType = { - batch: Record - decrypt: Record + parametersToFetchInBatch: Record + parametersToDecrypt: Record } & { [key: string]: SSMGetParametersByNameOptionsInterface }; interface SSMGetParametersByNameOutputInterface { diff --git a/packages/parameters/tests/unit/SSMProvider.test.ts b/packages/parameters/tests/unit/SSMProvider.test.ts index d7b896955a..a48e6a4004 100644 --- a/packages/parameters/tests/unit/SSMProvider.test.ts +++ b/packages/parameters/tests/unit/SSMProvider.test.ts @@ -939,7 +939,10 @@ describe('Class: SSMProvider', () => { super(); } - public splitBatchAndDecryptParameters(parameters: Record, configs: SSMGetParametersByNameOptionsInterface): SSMSplitBatchAndDecryptParametersOutputType { + public splitBatchAndDecryptParameters( + parameters: Record, + configs: SSMGetParametersByNameOptionsInterface + ): SSMSplitBatchAndDecryptParametersOutputType { return SSMProvider.splitBatchAndDecryptParameters(parameters, configs); } } @@ -956,11 +959,14 @@ describe('Class: SSMProvider', () => { }; // Act - const { batch: notToDecrypt, decrypt } = provider.splitBatchAndDecryptParameters(parameters, {}); + const { + parametersToFetchInBatch, + parametersToDecrypt + } = provider.splitBatchAndDecryptParameters(parameters, {}); // Assess - expect(decrypt).toEqual({}); - expect(notToDecrypt).toEqual({ + expect(parametersToDecrypt).toEqual({}); + expect(parametersToFetchInBatch).toEqual({ '/foo/bar': {}, '/foo/baz': { maxAge: 1000, @@ -983,16 +989,19 @@ describe('Class: SSMProvider', () => { }; // Act - const { batch: notToDecrypt, decrypt } = provider.splitBatchAndDecryptParameters(parameters, {}); + const { + parametersToFetchInBatch, + parametersToDecrypt + } = provider.splitBatchAndDecryptParameters(parameters, {}); // Assess - expect(decrypt).toEqual({ + expect(parametersToDecrypt).toEqual({ '/foo/bar': { decrypt: true, transform: undefined }, }); - expect(notToDecrypt).toEqual({ + expect(parametersToFetchInBatch).toEqual({ '/foo/baz': { decrypt: false, transform: undefined @@ -1015,20 +1024,23 @@ describe('Class: SSMProvider', () => { }; // Act - const { batch: notToDecrypt, decrypt } = provider.splitBatchAndDecryptParameters(parameters, { + const { + parametersToFetchInBatch, + parametersToDecrypt + } = provider.splitBatchAndDecryptParameters(parameters, { decrypt: false, maxAge: 2000, }); // Assess - expect(decrypt).toEqual({ + expect(parametersToDecrypt).toEqual({ '/foo/bar': { decrypt: true, maxAge: 2000, transform: undefined }, }); - expect(notToDecrypt).toEqual({ + expect(parametersToFetchInBatch).toEqual({ '/foo/baz': { decrypt: false, maxAge: 1000, From aa96b6803dde99bb0e2a4e92cfbb6fec212e0987 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 30 Dec 2022 18:31:53 +0100 Subject: [PATCH 18/20] refactor: readability & naming --- packages/parameters/src/ssm/SSMProvider.ts | 242 ++++++++++++++------- 1 file changed, 167 insertions(+), 75 deletions(-) diff --git a/packages/parameters/src/ssm/SSMProvider.ts b/packages/parameters/src/ssm/SSMProvider.ts index c43a6f9d2c..690c2f0cc5 100644 --- a/packages/parameters/src/ssm/SSMProvider.ts +++ b/packages/parameters/src/ssm/SSMProvider.ts @@ -29,11 +29,17 @@ class SSMProvider extends BaseProvider { this.client = new SSMClient(config); } - public async get(name: string, options?: SSMGetOptionsInterface | undefined): Promise | undefined> { + public async get( + name: string, + options?: SSMGetOptionsInterface | undefined + ): Promise | undefined> { return super.get(name, options); } - public async getMultiple(path: string, options?: SSMGetMultipleOptionsInterface | undefined): Promise> { + public async getMultiple( + path: string, + options?: SSMGetMultipleOptionsInterface | undefined + ): Promise> { return super.getMultiple(path, options); } @@ -64,7 +70,10 @@ class SSMProvider extends BaseProvider { * @param {Record[]} parameters - List of parameter names, and any optional overrides * */ - public async getParametersByName(parameters: Record, options?: SSMGetParametersByNameOptionsInterface): Promise> { + public async getParametersByName( + parameters: Record, + options?: SSMGetParametersByNameOptionsInterface + ): Promise> { const configs = { ...{ decrypt: false, maxAge: DEFAULT_MAX_AGE_SECS, @@ -76,14 +85,23 @@ class SSMProvider extends BaseProvider { // NOTE: We fail early to avoid unintended graceful errors being replaced with their '_errors' param values SSMProvider.throwIfErrorsKeyIsPresent(parameters, this.errorsKey, configs.throwOnError); - const { parametersToFetchInBatch, parametersToDecrypt } = SSMProvider.splitBatchAndDecryptParameters(parameters, configs); + const { + parametersToFetchInBatch, + parametersToDecrypt + } = SSMProvider.splitBatchAndDecryptParameters(parameters, configs); // NOTE: We need to find out whether all parameters must be decrypted or not to know which API to use // Logic: // GetParameters API -> When decrypt is used for all parameters in the the batch // GetParameter API -> When decrypt is used for one or more in the batch if (Object.keys(parametersToDecrypt).length !== Object.keys(parameters).length) { - const { response: decryptResponse, errors: decryptErrors } = await this.getParametersByNameWithDecryptOption(parametersToDecrypt, configs.throwOnError); - const { response: batchResponse, errors: batchErrors } = await this.getParametersBatchByName(parametersToFetchInBatch, configs.throwOnError, false); + const { + response: decryptResponse, + errors: decryptErrors + } = await this.getParametersByNameWithDecryptOption(parametersToDecrypt, configs.throwOnError); + const { + response: batchResponse, + errors: batchErrors + } = await this.getParametersBatchByName(parametersToFetchInBatch, configs.throwOnError, false); response = { ...decryptResponse, ...batchResponse }; // Fail-fast disabled, let's aggregate errors under "_errors" key so they can handle gracefully @@ -91,7 +109,10 @@ class SSMProvider extends BaseProvider { response[this.errorsKey] = [ ...decryptErrors, ...batchErrors ]; } } else { - const { response: batchResponse, errors: batchErrors } = await this.getParametersBatchByName(parametersToDecrypt, configs.throwOnError, true); + const { + response: batchResponse, + errors: batchErrors + } = await this.getParametersBatchByName(parametersToDecrypt, configs.throwOnError, true); response = batchResponse; // Fail-fast disabled, let's aggregate errors under "_errors" key so they can handle gracefully @@ -103,7 +124,10 @@ class SSMProvider extends BaseProvider { return response; } - protected async _get(name: string, options?: SSMGetOptionsInterface): Promise { + protected async _get( + name: string, + options?: SSMGetOptionsInterface + ): Promise { const sdkOptions: GetParameterCommandInput = { Name: name, }; @@ -118,7 +142,10 @@ class SSMProvider extends BaseProvider { return result.Parameter?.Value; } - protected async _getMultiple(path: string, options?: SSMGetMultipleOptionsInterface): Promise> { + protected async _getMultiple( + path: string, + options?: SSMGetMultipleOptionsInterface + ): Promise> { const sdkOptions: GetParametersByPathCommandInput = { Path: path, }; @@ -160,12 +187,11 @@ class SSMProvider extends BaseProvider { return parameters; } - protected async _getParametersByName(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { - const results: SSMGetParametersByNameOutputInterface = { - response: {}, - errors: [], - }; - + protected async _getParametersByName( + parameters: Record, + throwOnError: boolean, + decrypt: boolean + ): Promise { const sdkOptions: GetParametersCommandInput = { Names: Object.keys(parameters), }; @@ -174,68 +200,95 @@ class SSMProvider extends BaseProvider { } const result = await this.client.send(new GetParametersCommand(sdkOptions)); - results.errors = SSMProvider.handleAnyInvalidGetParameterErrors(result, throwOnError); - results.response = this.transformAndCacheGetParametersResponse(result, parameters, throwOnError); - - return results; + const errors = SSMProvider.handleAnyInvalidGetParameterErrors(result, throwOnError); + const response = this.transformAndCacheGetParametersResponse( + result, + parameters, + throwOnError + ); + + return { + response, + errors, + }; } /** * Slice batch and fetch parameters using GetPrameters API by max permissible batch size */ - protected async getParametersBatchByName(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { - const results: SSMGetParametersByNameOutputInterface = { - response: {}, - errors: [], - }; + protected async getParametersBatchByName( + parameters: Record, + throwOnError: boolean, + decrypt: boolean + ): Promise { + let response: Record = {}; + let errors: string[] = []; // Fetch each possible batch param from cache and return if entire batch is cached const { cached, toFetch } = await this.getParametersByNameFromCache(parameters); if (Object.keys(cached).length >= Object.keys(parameters).length) { - results.response = cached; + response = cached; - return results; + return { + response, + errors, + }; } // Slice batch by max permitted GetParameters call and retrieve the ones that are not cached - const { response: batchResponse, errors: batchErrors } = await this.getParametersByNameInChunks(toFetch, throwOnError, decrypt); - results.response = { ...cached, ...batchResponse }; - results.errors = batchErrors; - - return results; + const { + response: batchResponse, + errors: batchErrors + } = await this.getParametersByNameInChunks(toFetch, throwOnError, decrypt); + response = { ...cached, ...batchResponse }; + errors = batchErrors; + + return { + response, + errors, + }; } /** * Fetch each parameter from batch that hasn't expired from cache */ - protected async getParametersByNameFromCache(parameters: Record): Promise { - const results: SSMGetParametersByNameFromCacheOutputType = { - cached: {}, - toFetch: {}, - }; + protected async getParametersByNameFromCache( + parameters: Record + ): Promise { + const cached: Record> = {}; + const toFetch: Record = {}; for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { const cacheKey = [ parameterName, parameterOptions.transform ].toString(); if (!this.hasKeyExpiredInCache(cacheKey)) { // Since we know the key exists in the cache, we can safely use the non-null assertion operator // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - results.cached[parameterName] = this.store.get(cacheKey)!.value as Record>; + cached[parameterName] = this.store.get(cacheKey)!.value as Record>; } else { - results.toFetch[parameterName] = parameterOptions; + toFetch[parameterName] = parameterOptions; } } - return results; + return { + cached, + toFetch, + }; } - protected async getParametersByNameInChunks(parameters: Record, throwOnError: boolean, decrypt: boolean): Promise { - const results: SSMGetParametersByNameOutputInterface = { - response: {}, - errors: [], - }; + protected async getParametersByNameInChunks( + parameters: Record, + throwOnError: boolean, + decrypt: boolean + ): Promise { + let response: Record = {}; + let errors: string[] = []; // Slice object into chunks of max permissible batch size - const chunks = Object.entries(parameters).reduce((acc, [ parameterName, parameterOptions ], index) => { + const chunks = Object.entries(parameters).reduce(( + acc, + [ parameterName, parameterOptions ], + index + ) => { const chunkIndex = Math.floor(index / this.maxGetParametersItems); if (!acc[chunkIndex]) { acc[chunkIndex] = {}; @@ -247,43 +300,59 @@ class SSMProvider extends BaseProvider { // Fetch each chunk and merge results for (const chunk of chunks) { - const { response: chunkResponse, errors: chunkErrors } = await this._getParametersByName(chunk, throwOnError, decrypt); - results.response = { ...results.response, ...chunkResponse }; - results.errors = [ ...results.errors, ...chunkErrors ]; + const { + response: chunkResponse, + errors: chunkErrors + } = await this._getParametersByName(chunk, throwOnError, decrypt); + + response = { ...response, ...chunkResponse }; + errors = [ ...errors, ...chunkErrors ]; } - return results; + return { + response, + errors, + }; } - protected async getParametersByNameWithDecryptOption(parameters: Record, throwOnError: boolean): Promise { - const results: SSMGetParametersByNameOutputInterface = { - response: {}, - errors: [], - }; + protected async getParametersByNameWithDecryptOption( + parameters: Record, + throwOnError: boolean + ): Promise { + const response: Record = {}; + const errors: string[] = []; for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { try { - results.response[parameterName] = await this._get(parameterName, parameterOptions); + response[parameterName] = await this._get(parameterName, parameterOptions); } catch (error) { if (throwOnError) { throw error; } - results.errors.push(parameterName); + errors.push(parameterName); } } - return results; + return { + response, + errors, + }; } /** * Handle any invalid parameters returned by GetParameters API * GetParameters is non-atomic. Failures don't always reflect in exceptions so we need to collect. */ - protected static handleAnyInvalidGetParameterErrors(result: GetParametersCommandOutput, throwOnError: boolean): string[] { + protected static handleAnyInvalidGetParameterErrors( + result: GetParametersCommandOutput, + throwOnError: boolean + ): string[] { const errors: string[] = []; if (result.InvalidParameters && result.InvalidParameters.length > 0) { if (throwOnError) { - throw new GetParameterError(`Failed to fetch parameters: ${result.InvalidParameters.join(', ')}`); + throw new GetParameterError( + `Failed to fetch parameters: ${result.InvalidParameters.join(', ')}` + ); } errors.push(...result.InvalidParameters); } @@ -294,11 +363,12 @@ class SSMProvider extends BaseProvider { /** * Split parameters that can be fetched by GetParameters vs GetParameter. */ - protected static splitBatchAndDecryptParameters(parameters: Record, configs: SSMGetParametersByNameOptionsInterface): SSMSplitBatchAndDecryptParametersOutputType { - const splitParameters: SSMSplitBatchAndDecryptParametersOutputType = { - parametersToFetchInBatch: {}, - parametersToDecrypt: {}, - }; + protected static splitBatchAndDecryptParameters( + parameters: Record, + configs: SSMGetParametersByNameOptionsInterface + ): SSMSplitBatchAndDecryptParametersOutputType { + const parametersToFetchInBatch: Record = {}; + const parametersToDecrypt: Record = {}; for (const [ parameterName, parameterOptions ] of Object.entries(parameters)) { const overrides = parameterOptions; @@ -312,13 +382,16 @@ class SSMProvider extends BaseProvider { } if (overrides.decrypt) { - splitParameters.parametersToDecrypt[parameterName] = overrides; + parametersToDecrypt[parameterName] = overrides; } else { - splitParameters.parametersToFetchInBatch[parameterName] = overrides; + parametersToFetchInBatch[parameterName] = overrides; } } - return splitParameters; + return { + parametersToFetchInBatch, + parametersToDecrypt, + }; } /** @@ -328,14 +401,24 @@ class SSMProvider extends BaseProvider { * @param {string} reservedParameter * @param {boolean} throwOnError */ - protected static throwIfErrorsKeyIsPresent(parameters: Record, reservedParameter: string, throwOnError: boolean): void { + protected static throwIfErrorsKeyIsPresent( + parameters: Record, + reservedParameter: string, + throwOnError: boolean + ): void { if (!throwOnError && parameters.hasOwnProperty(reservedParameter)) { - throw new GetParameterError(`You cannot fetch a parameter named ${reservedParameter} in graceful error mode.`); + throw new GetParameterError( + `You cannot fetch a parameter named ${reservedParameter} in graceful error mode.` + ); } } - protected transformAndCacheGetParametersResponse(response: GetParametersCommandOutput, parameters: Record, throwOnError: boolean): Record { - const results: Record = {}; + protected transformAndCacheGetParametersResponse( + response: GetParametersCommandOutput, + parameters: Record, + throwOnError: boolean + ): Record { + const processedParameters: Record = {}; for (const parameter of response.Parameters || []) { // If the parameter is present in the response, then it has a Name @@ -347,20 +430,29 @@ class SSMProvider extends BaseProvider { let value; // NOTE: if transform is set, we do it before caching to reduce number of operations if (parameterValue && parameterOptions.transform) { - value = transformValue(parameterValue, parameterOptions.transform, throwOnError, parameterName); + value = transformValue( + parameterValue, + parameterOptions.transform, + throwOnError, + parameterName + ); } else if (parameterValue) { value = parameterValue; } if (value) { const cacheKey = [ parameterName, parameterOptions.transform ].toString(); - this.addToCache(cacheKey, value, parameterOptions.maxAge || DEFAULT_MAX_AGE_SECS); + this.addToCache( + cacheKey, + value, + parameterOptions.maxAge || DEFAULT_MAX_AGE_SECS + ); } - results[parameterName] = value; + processedParameters[parameterName] = value; } - return results; + return processedParameters; } } From cdb7dbd741e7e32fac37ec280cb57864819a4f06 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 30 Dec 2022 18:36:21 +0100 Subject: [PATCH 19/20] refactor: updated constructor type + interface intersections --- packages/parameters/src/ssm/SSMProvider.ts | 13 +++++++++---- packages/parameters/src/types/SSMProvider.ts | 15 ++++++++++++--- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/parameters/src/ssm/SSMProvider.ts b/packages/parameters/src/ssm/SSMProvider.ts index 690c2f0cc5..5dfc2ca872 100644 --- a/packages/parameters/src/ssm/SSMProvider.ts +++ b/packages/parameters/src/ssm/SSMProvider.ts @@ -1,15 +1,20 @@ import { BaseProvider, DEFAULT_PROVIDERS, transformValue } from '../BaseProvider'; import { GetParameterError } from '../Exceptions'; import { DEFAULT_MAX_AGE_SECS } from '../constants'; -import { SSMClient, GetParameterCommand, paginateGetParametersByPath, GetParametersCommand } from '@aws-sdk/client-ssm'; +import { + SSMClient, + GetParameterCommand, + paginateGetParametersByPath, + GetParametersCommand +} from '@aws-sdk/client-ssm'; import type { - SSMClientConfig, GetParameterCommandInput, GetParametersByPathCommandInput, GetParametersCommandInput, GetParametersCommandOutput, } from '@aws-sdk/client-ssm'; import type { + SSMProviderOptionsInterface, SSMGetMultipleOptionsInterface, SSMGetOptionsInterface, SSMGetParametersByNameOutputInterface, @@ -24,9 +29,9 @@ class SSMProvider extends BaseProvider { protected errorsKey = '_errors'; protected maxGetParametersItems = 10; - public constructor(config: SSMClientConfig = {}) { + public constructor(config?: SSMProviderOptionsInterface) { super(); - this.client = new SSMClient(config); + this.client = new SSMClient(config?.clientConfig || {}); } public async get( diff --git a/packages/parameters/src/types/SSMProvider.ts b/packages/parameters/src/types/SSMProvider.ts index 486e3dac31..e7649c14df 100644 --- a/packages/parameters/src/types/SSMProvider.ts +++ b/packages/parameters/src/types/SSMProvider.ts @@ -1,6 +1,14 @@ -import type { GetParameterCommandInput, GetParametersByPathCommandInput } from '@aws-sdk/client-ssm'; +import type { + SSMClientConfig, + GetParameterCommandInput, + GetParametersByPathCommandInput +} from '@aws-sdk/client-ssm'; import type { GetOptionsInterface, GetMultipleOptionsInterface, TransformOptions } from './BaseProvider'; +interface SSMProviderOptionsInterface { + clientConfig: SSMClientConfig +} + /** * Options for the SSMProvider get method. * @@ -31,7 +39,7 @@ interface SSMGetParametersByNameOptionsInterface { type SSMSplitBatchAndDecryptParametersOutputType = { parametersToFetchInBatch: Record parametersToDecrypt: Record -} & { [key: string]: SSMGetParametersByNameOptionsInterface }; +}; interface SSMGetParametersByNameOutputInterface { response: Record @@ -41,9 +49,10 @@ interface SSMGetParametersByNameOutputInterface { type SSMGetParametersByNameFromCacheOutputType = { cached: Record> toFetch: Record -} & { [key: string]: SSMGetParametersByNameOptionsInterface }; +}; export { + SSMProviderOptionsInterface, SSMGetOptionsInterface, SSMGetMultipleOptionsInterface, SSMGetParametersByNameOptionsInterface, From ba5c4cf91bfe2eef9266be42f0295501097cb6ec Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 5 Jan 2023 21:00:45 +0100 Subject: [PATCH 20/20] chore: types --- package-lock.json | 1148 +++++++++++++++-- packages/parameters/package.json | 1 + packages/parameters/src/ssm/SSMProvider.ts | 2 +- packages/parameters/src/ssm/getParameter.ts | 4 +- packages/parameters/src/ssm/getParameters.ts | 4 +- .../parameters/src/ssm/getParametersByName.ts | 2 +- 6 files changed, 1017 insertions(+), 144 deletions(-) diff --git a/package-lock.json b/package-lock.json index f73c13e702..b5249c15fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -750,6 +750,287 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@aws-sdk/client-ssm": { + "version": "3.244.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.244.0.tgz", + "integrity": "sha512-Y/WPOhcbacOglNGXYrZTeZqZwGVs8DFmM9kWpVSIwcvHIdo/5CxB2FC9Cqt9gcvsBccC2CY1S56klbUP1WP/Ng==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.241.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-node": "3.241.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.235.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", + "@aws-sdk/util-endpoints": "3.241.0", + "@aws-sdk/util-retry": "3.229.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.226.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.241.0.tgz", + "integrity": "sha512-Jm4HR+RYAqKMEYZvvWaq0NYUKKonyInOeubObXH4BLXZpmUBSdYCSjjLdNJY3jkQoxbDVPVMIurVNh5zT5SMRw==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.235.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", + "@aws-sdk/util-endpoints": "3.241.0", + "@aws-sdk/util-retry": "3.229.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.241.0.tgz", + "integrity": "sha512-/Ml2QBGpGfUEeBrPzBZhSTBkHuXFD2EAZEIHGCBH4tKaURDI6/FoGI8P1Rl4BzoFt+II/Cr91Eox6YT9EwChsQ==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.235.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", + "@aws-sdk/util-endpoints": "3.241.0", + "@aws-sdk/util-retry": "3.229.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sts": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.241.0.tgz", + "integrity": "sha512-vmlG8cJzRf8skCtTJbA2wBvD2c3NQ5gZryzJvTKDS06KzBzcEpnjlLseuTekcnOiRNekbFUX5hRu5Zj3N2ReLg==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-node": "3.241.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.235.0", + "@aws-sdk/middleware-sdk-sts": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", + "@aws-sdk/util-endpoints": "3.241.0", + "@aws-sdk/util-retry": "3.229.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.241.0.tgz", + "integrity": "sha512-CI+mu6h74Kzmscw35TvNkc/wYHsHPGAwP7humSHoWw53H9mVw21Ggft/dT1iFQQZWQ8BNXkzuXlNo1IlqwMgOA==", + "dev": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.241.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.241.0.tgz", + "integrity": "sha512-08zPQcD5o9brQmzEipWHeHgU85aQcEF8MWLfpeyjO6e1/l7ysQ35NsS+PYtv77nLpGCx/X+ZuW/KXWoRrbw77w==", + "dev": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-ini": "3.241.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.241.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.241.0.tgz", + "integrity": "sha512-6Bjd6eEIrVomRTrPrM4dlxusQm+KMJ9hLYKECCpFkwDKIK+pTgZNLRtQdalHyzwneHJPdimrm8cOv1kUQ8hPoA==", + "dev": true, + "dependencies": { + "@aws-sdk/client-sso": "3.241.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/token-providers": "3.241.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.241.0.tgz", + "integrity": "sha512-79okvuOS7V559OIL/RalIPG98wzmWxeFOChFnbEjn2pKOyGQ6FJRwLPYZaVRtNdAtnkBNgRpmFq9dX843QxhtQ==", + "dev": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.241.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/client-sso": { "version": "3.235.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.235.0.tgz", @@ -840,7 +1121,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.215.0.tgz", "integrity": "sha512-HTvL542nawhVqe0oC1AJchdcomEOmPivJEzYUT1LqiG3e8ikxMNa2KWSqqLPeKi2t0A/cfQy7wDUyg9+BZhDSQ==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -853,7 +1133,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.215.0.tgz", "integrity": "sha512-DxX4R+YYLQOtg0qfceKBrjVD4t1mQBG1eb7IVr2QSlckFCX8ztUNymFMuaSEo3938Jyy/NpgfUDpFqPDaSKnng==", - "dev": true, "dependencies": { "@aws-sdk/signature-v4": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -869,7 +1148,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.215.0.tgz", "integrity": "sha512-/4FUUR6u9gkNfxB6mEwBr0kk0myIkrDcXbAocWN3fPd/t7otzxpx/JqPZXgM6kcVP7M4T/QT75l1E1RRHLWCCQ==", - "dev": true, "dependencies": { "@aws-sdk/node-config-provider": "3.215.0", "@aws-sdk/property-provider": "3.215.0", @@ -885,7 +1163,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.215.0.tgz", "integrity": "sha512-JfZyrJOE+0ik1PumsIUZd0NfgEx4sZ43VSdPCD9GRhssRWudNsSF1B5fz3xA5v+1y5oQPjXZyaWCzKtnYruiWw==", - "dev": true, "dependencies": { "@aws-sdk/protocol-http": "3.215.0", "@aws-sdk/querystring-builder": "3.215.0", @@ -898,7 +1175,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.215.0.tgz", "integrity": "sha512-MkSRuZvo1RCRmI0VNEmRYCGGD/DkMd9lqnLtOyglMPnSX1mhyD4/DyXmcc3rYa7PsjDRAfykGWJRiMqpoMLjiQ==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "@aws-sdk/util-buffer-from": "3.208.0", @@ -912,7 +1188,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.215.0.tgz", "integrity": "sha512-++bK4BUQe8/CL/YcLZcQB8qPOhiXxhbuhYzfFS7PNVvW1QOLqKRZL/lKs24gzjcOmw7IhAbCybDZwvu2TM4DAg==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -922,7 +1197,6 @@ "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", - "dev": true, "dependencies": { "tslib": "^2.3.1" }, @@ -934,7 +1208,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.215.0.tgz", "integrity": "sha512-zKJRb6jDLFl9nl/muSFbiQHA4uK3skinuDRcyLbpMvvzhuK/PVodv9QI1+wIUsFdXkaSxAlva1oG4bL8ZFi+sQ==", - "dev": true, "dependencies": { "@aws-sdk/protocol-http": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -948,7 +1221,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.215.0.tgz", "integrity": "sha512-GOqI7VwoENZwn+6tIMrrJ4SipIqL2JCh+BNvORVcy7CQxn1ViKkna7iaCx+QMjpg/kn9cR6kfY0n1FmgZR1w9A==", - "dev": true, "dependencies": { "@aws-sdk/protocol-http": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -962,7 +1234,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.215.0.tgz", "integrity": "sha512-0h4GGF0rV3jnY3jxmcAWsOdqHCYf25s0biSjmgTei+l/5S+geOGrovRPCNep0LLg0i9D8bkZsXISojilETbf+g==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -975,7 +1246,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.215.0.tgz", "integrity": "sha512-KQ+kiEsaluM4i6opjusUukxY78+UhfR7vzXHDkzZK/GplQ1hY0B+rwVO1eaULmlnmf3FK+Wd6lwrPV7xS2W+EA==", - "dev": true, "dependencies": { "@aws-sdk/protocol-http": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -989,7 +1259,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.215.0.tgz", "integrity": "sha512-I/dnUPVg2Kp3lW+MywBoPp06EOng8IfuaS9ph4bcJpQKrhNU5ekRgCHH2C4k1A6GcP8uyHxQ5TVV6j+l0QPIsA==", - "dev": true, "dependencies": { "@aws-sdk/protocol-http": "3.215.0", "@aws-sdk/service-error-classification": "3.215.0", @@ -1006,7 +1275,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.215.0.tgz", "integrity": "sha512-+uhLXdKvvQZcRRFc3UmemSr/YUHA4Jc+1YMjHxc3v8vvfztFJBb0wgBx999myOi8PmkYThlRBQDzXy9UCIhIJw==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -1019,7 +1287,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.215.0.tgz", "integrity": "sha512-rdSVL7LxRgjlvoluqwODD4ypBy2k/YVl6FrDplyCMSi8m2WHZG99FzdmR9bpnWK+0DGzYZSMRYx6ynJ9N9PsSw==", - "dev": true, "dependencies": { "tslib": "^2.3.1" }, @@ -1031,7 +1298,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz", "integrity": "sha512-X6GfoMNoEITTw7rGL/gWs8UZ0cmmmezvKcl+KtHsA642R05OR4mY5G7LdbWAw0bcrwKsuKOGmwUrC9lzGqbWUw==", - "dev": true, "dependencies": { "@aws-sdk/protocol-http": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -1045,7 +1311,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.215.0.tgz", "integrity": "sha512-notckD94QwwxC0GsfpTxB7VH8SREIIlMsUSddqGtpModa0cq/wRb9rqnydZSoznbYpK1ND6h0C9hr/2PNz89zw==", - "dev": true, "dependencies": { "@aws-sdk/property-provider": "3.215.0", "@aws-sdk/shared-ini-file-loader": "3.215.0", @@ -1060,7 +1325,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.215.0.tgz", "integrity": "sha512-btKWSR7m0UuWIN3p5MfSIvhqeYik7xri7U6nWuVI5GVzIYjzxEZOMvPAinDLDxL5wipodi0ZvTUNdDJdm7BcGQ==", - "dev": true, "dependencies": { "@aws-sdk/abort-controller": "3.215.0", "@aws-sdk/protocol-http": "3.215.0", @@ -1076,7 +1340,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz", "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -1089,7 +1352,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.215.0.tgz", "integrity": "sha512-qp6Y6v4S534LAjadiVl9p7ErK7ImphOKq6yhFyQwxko6iITLcz8ib3yU27fs4QJcnNj5ZooqW/YlL/0EikDxCQ==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -1102,7 +1364,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz", "integrity": "sha512-eilk8CqG37BVhQklLif00K2dOJgDzacUi8h3KVQ72ry1V3h345i4HsmaFIxvnz8XtNyDvV8qFAzeYg9n2P9RQA==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "@aws-sdk/util-uri-escape": "3.201.0", @@ -1116,7 +1377,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.215.0.tgz", "integrity": "sha512-8h/9H8dWM4fZO27UGzo8W5JXln4yJMugPyUl4qFA437gzPgNFN95+oLJWXtHMlfCHC5T/PDKetY9TarMDgBD0Q==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -1129,7 +1389,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.215.0.tgz", "integrity": "sha512-SKBvClGFGzMPsjBBKjneaUazLCNr6bSxe9eFvOr3gCwuwE2jPQwW3VE1mb62howuvm6cLthEDwLQp/FsT1gMsw==", - "dev": true, "engines": { "node": ">=14.0.0" } @@ -1138,7 +1397,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz", "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -1151,7 +1409,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.215.0.tgz", "integrity": "sha512-Rc73uUCi3eJneO25DydLTfJYamXeuKS9YIhNMTKlpvcN1UQAmAnUbAmCuEmqvkYOiGD1i4/kd8kBga708iIikQ==", - "dev": true, "dependencies": { "@aws-sdk/is-array-buffer": "3.201.0", "@aws-sdk/types": "3.215.0", @@ -1168,7 +1425,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz", "integrity": "sha512-PiZfCdZkPohzMPrRmJ46TPOf2Tr/dhKYdwQArRnOOIsJABUGXjlzCUE8vysDN35XZYRx5f9hd+/U7kayhniq2w==", - "dev": true, "dependencies": { "@aws-sdk/middleware-stack": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -1182,7 +1438,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==", - "dev": true, "engines": { "node": ">=14.0.0" } @@ -1191,7 +1446,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz", "integrity": "sha512-r/qIk3TUlV36JvoRjTErFm0LzzgNKLB1YUG8zVZCGAc2TEATi8OVEmsZvi+KfTmsbszulITJVcjZKbHLbGoUzg==", - "dev": true, "dependencies": { "@aws-sdk/querystring-parser": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -1202,7 +1456,6 @@ "version": "3.188.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", - "dev": true, "dependencies": { "tslib": "^2.3.1" } @@ -1211,7 +1464,6 @@ "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", - "dev": true, "dependencies": { "tslib": "^2.3.1" }, @@ -1219,24 +1471,10 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", - "dev": true, - "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-config-provider": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", - "dev": true, "dependencies": { "tslib": "^2.3.1" }, @@ -1248,7 +1486,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.215.0.tgz", "integrity": "sha512-MiNfZgB0I4dR8CBxH163W7c9KvE38sgCHNPWopMqSX5ezz7cuCPohCU0XsWd4I7K31PvzuqmKgOiKBAZraQJMA==", - "dev": true, "dependencies": { "@aws-sdk/property-provider": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -1263,7 +1500,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.215.0.tgz", "integrity": "sha512-mSp3R8GljQ+4UT3QMOksQk9L0cWbFLvR7bBmAlt4+GobgTjpRfzFjBP3uwrCqFa3BKDUR3FeJq3qwo+xeY1Krg==", - "dev": true, "dependencies": { "@aws-sdk/config-resolver": "3.215.0", "@aws-sdk/credential-provider-imds": "3.215.0", @@ -1280,7 +1516,6 @@ "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", - "dev": true, "dependencies": { "tslib": "^2.3.1" }, @@ -1292,7 +1527,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.215.0.tgz", "integrity": "sha512-DfHGlFlQCr+T/xhjS36HH8JEThDVB5lg5NZ6x4Cibhyeps9YX/4ovLAIx3B19H34sdWhZi7q6LfslCHLRu2+7Q==", - "dev": true, "dependencies": { "tslib": "^2.3.1" }, @@ -1304,7 +1538,6 @@ "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", - "dev": true, "dependencies": { "tslib": "^2.3.1" }, @@ -1316,7 +1549,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.215.0.tgz", "integrity": "sha512-uZz6BJWr8sJcA+onveS1lFqnbIXBHwvkyHLgCuuGhAxd5yY6YNLhpJBnhy9Fb8/aSbk6yao3qxlokqw9gthmAw==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "bowser": "^2.11.0", @@ -1327,7 +1559,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz", "integrity": "sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw==", - "dev": true, "dependencies": { "@aws-sdk/node-config-provider": "3.215.0", "@aws-sdk/types": "3.215.0", @@ -1349,7 +1580,6 @@ "version": "3.188.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", - "dev": true, "dependencies": { "tslib": "^2.3.1" } @@ -1358,7 +1588,6 @@ "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", - "dev": true, "dependencies": { "@aws-sdk/util-buffer-from": "3.208.0", "tslib": "^2.3.1" @@ -1936,7 +2165,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz", "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -1949,7 +2177,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz", "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ==", - "dev": true, "dependencies": { "@aws-sdk/types": "3.215.0", "tslib": "^2.3.1" @@ -1962,7 +2189,6 @@ "version": "3.215.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==", - "dev": true, "engines": { "node": ">=14.0.0" } @@ -2019,6 +2245,18 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/util-config-provider": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", @@ -16798,7 +17036,6 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -17369,6 +17606,7 @@ }, "devDependencies": { "@aws-sdk/client-secrets-manager": "^3.238.0", + "@aws-sdk/client-ssm": "^3.244.0", "aws-sdk-client-mock": "^2.0.1", "aws-sdk-client-mock-jest": "^2.0.1" } @@ -17641,6 +17879,7 @@ "version": "file:packages/parameters", "requires": { "@aws-sdk/client-secrets-manager": "^3.238.0", + "@aws-sdk/client-ssm": "^3.244.0", "@aws-sdk/util-base64": "^3.208.0", "aws-sdk-client-mock": "^2.0.1", "aws-sdk-client-mock-jest": "^2.0.1" @@ -17856,7 +18095,315 @@ "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", "@aws-sdk/config-resolver": "3.234.0", - "@aws-sdk/credential-provider-node": "3.238.0", + "@aws-sdk/credential-provider-node": "3.238.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.235.0", + "@aws-sdk/middleware-sdk-sts": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-retry": "3.229.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz", + "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==", + "dev": true, + "requires": { + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.238.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.238.0.tgz", + "integrity": "sha512-WmPNtIYyUasjV7VQxvPNq7ihmx0vFsiKAtjNjjakdrt5TPoma4nUYb9tIG9SuG+kcp4DJIgRLJAgZtXbCcVimg==", + "dev": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.238.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.238.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.238.0.tgz", + "integrity": "sha512-/RN5EyGfgdIIJdFzv+O0nSaHX1/F3anQjTIBeVg8GJ+82m+bDxMdALsG+NzkYnLilN9Uhc1lSNjLBCoPa5DSEg==", + "dev": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-ini": "3.238.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.238.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.238.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.238.0.tgz", + "integrity": "sha512-i70V4bFlCVYey3QARJ6XxKEg/4YuoFRnePV2oK37UHOGpEn49uXKwVZqLjzJgFHln7BPlC06cWDqrHUQIMvYrQ==", + "dev": true, + "requires": { + "@aws-sdk/client-sso": "3.238.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/token-providers": "3.238.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.235.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz", + "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==", + "dev": true, + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/service-error-classification": "3.229.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "@aws-sdk/util-retry": "3.229.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz", + "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==", + "dev": true, + "requires": { + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/token-providers": { + "version": "3.238.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.238.0.tgz", + "integrity": "sha512-vYUwmy0kTzA99mJCVvad+/5RDlWve/xxnppT8DJK3JIdAgskp+rULY+joVnq2NSl489UAioUnFGs57vUxi8Pog==", + "dev": true, + "requires": { + "@aws-sdk/client-sso-oidc": "3.238.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz", + "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==", + "dev": true, + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.234.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz", + "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==", + "dev": true, + "requires": { + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "@aws-sdk/client-ssm": { + "version": "3.244.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.244.0.tgz", + "integrity": "sha512-Y/WPOhcbacOglNGXYrZTeZqZwGVs8DFmM9kWpVSIwcvHIdo/5CxB2FC9Cqt9gcvsBccC2CY1S56klbUP1WP/Ng==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.241.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-node": "3.241.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.235.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", + "@aws-sdk/util-endpoints": "3.241.0", + "@aws-sdk/util-retry": "3.229.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "@aws-sdk/util-waiter": "3.226.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "dependencies": { + "@aws-sdk/client-sso": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.241.0.tgz", + "integrity": "sha512-Jm4HR+RYAqKMEYZvvWaq0NYUKKonyInOeubObXH4BLXZpmUBSdYCSjjLdNJY3jkQoxbDVPVMIurVNh5zT5SMRw==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.235.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", + "@aws-sdk/util-endpoints": "3.241.0", + "@aws-sdk/util-retry": "3.229.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.241.0.tgz", + "integrity": "sha512-/Ml2QBGpGfUEeBrPzBZhSTBkHuXFD2EAZEIHGCBH4tKaURDI6/FoGI8P1Rl4BzoFt+II/Cr91Eox6YT9EwChsQ==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.235.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.234.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.234.0", + "@aws-sdk/util-defaults-mode-node": "3.234.0", + "@aws-sdk/util-endpoints": "3.241.0", + "@aws-sdk/util-retry": "3.229.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sts": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.241.0.tgz", + "integrity": "sha512-vmlG8cJzRf8skCtTJbA2wBvD2c3NQ5gZryzJvTKDS06KzBzcEpnjlLseuTekcnOiRNekbFUX5hRu5Zj3N2ReLg==", + "dev": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.234.0", + "@aws-sdk/credential-provider-node": "3.241.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -17882,7 +18429,7 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", @@ -17892,29 +18439,16 @@ "tslib": "^2.3.1" } }, - "@aws-sdk/config-resolver": { - "version": "3.234.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz", - "integrity": "sha512-uZxy4wzllfvgCQxVc+Iqhde0NGAnfmV2hWR6ejadJaAFTuYNvQiRg9IqJy3pkyDPqXySiJ8Bom5PoJfgn55J/A==", - "dev": true, - "requires": { - "@aws-sdk/signature-v4": "3.226.0", - "@aws-sdk/types": "3.226.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.226.0", - "tslib": "^2.3.1" - } - }, "@aws-sdk/credential-provider-ini": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.238.0.tgz", - "integrity": "sha512-WmPNtIYyUasjV7VQxvPNq7ihmx0vFsiKAtjNjjakdrt5TPoma4nUYb9tIG9SuG+kcp4DJIgRLJAgZtXbCcVimg==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.241.0.tgz", + "integrity": "sha512-CI+mu6h74Kzmscw35TvNkc/wYHsHPGAwP7humSHoWw53H9mVw21Ggft/dT1iFQQZWQ8BNXkzuXlNo1IlqwMgOA==", "dev": true, "requires": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", "@aws-sdk/credential-provider-process": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.238.0", + "@aws-sdk/credential-provider-sso": "3.241.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -17923,16 +18457,16 @@ } }, "@aws-sdk/credential-provider-node": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.238.0.tgz", - "integrity": "sha512-/RN5EyGfgdIIJdFzv+O0nSaHX1/F3anQjTIBeVg8GJ+82m+bDxMdALsG+NzkYnLilN9Uhc1lSNjLBCoPa5DSEg==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.241.0.tgz", + "integrity": "sha512-08zPQcD5o9brQmzEipWHeHgU85aQcEF8MWLfpeyjO6e1/l7ysQ35NsS+PYtv77nLpGCx/X+ZuW/KXWoRrbw77w==", "dev": true, "requires": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/credential-provider-ini": "3.238.0", + "@aws-sdk/credential-provider-ini": "3.241.0", "@aws-sdk/credential-provider-process": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.238.0", + "@aws-sdk/credential-provider-sso": "3.241.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -17941,80 +18475,38 @@ } }, "@aws-sdk/credential-provider-sso": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.238.0.tgz", - "integrity": "sha512-i70V4bFlCVYey3QARJ6XxKEg/4YuoFRnePV2oK37UHOGpEn49uXKwVZqLjzJgFHln7BPlC06cWDqrHUQIMvYrQ==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.241.0.tgz", + "integrity": "sha512-6Bjd6eEIrVomRTrPrM4dlxusQm+KMJ9hLYKECCpFkwDKIK+pTgZNLRtQdalHyzwneHJPdimrm8cOv1kUQ8hPoA==", "dev": true, "requires": { - "@aws-sdk/client-sso": "3.238.0", + "@aws-sdk/client-sso": "3.241.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", - "@aws-sdk/token-providers": "3.238.0", - "@aws-sdk/types": "3.226.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/middleware-retry": { - "version": "3.235.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz", - "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==", - "dev": true, - "requires": { - "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/service-error-classification": "3.229.0", - "@aws-sdk/types": "3.226.0", - "@aws-sdk/util-middleware": "3.226.0", - "@aws-sdk/util-retry": "3.229.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" - } - }, - "@aws-sdk/smithy-client": { - "version": "3.234.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz", - "integrity": "sha512-8AtR/k4vsFvjXeQbIzq/Wy7Nbk48Ou0wUEeVYPHWHPSU8QamFWORkOwmKtKMfHAyZvmqiAPeQqHFkq+UJhWyyQ==", - "dev": true, - "requires": { - "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/token-providers": "3.241.0", "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" } }, "@aws-sdk/token-providers": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.238.0.tgz", - "integrity": "sha512-vYUwmy0kTzA99mJCVvad+/5RDlWve/xxnppT8DJK3JIdAgskp+rULY+joVnq2NSl489UAioUnFGs57vUxi8Pog==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.241.0.tgz", + "integrity": "sha512-79okvuOS7V559OIL/RalIPG98wzmWxeFOChFnbEjn2pKOyGQ6FJRwLPYZaVRtNdAtnkBNgRpmFq9dX843QxhtQ==", "dev": true, "requires": { - "@aws-sdk/client-sso-oidc": "3.238.0", + "@aws-sdk/client-sso-oidc": "3.241.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" } }, - "@aws-sdk/util-defaults-mode-browser": { - "version": "3.234.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz", - "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==", - "dev": true, - "requires": { - "@aws-sdk/property-provider": "3.226.0", - "@aws-sdk/types": "3.226.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-defaults-mode-node": { - "version": "3.234.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz", - "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==", + "@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", "dev": true, "requires": { - "@aws-sdk/config-resolver": "3.234.0", - "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/node-config-provider": "3.226.0", - "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" } @@ -18105,6 +18597,364 @@ "@aws-sdk/util-utf8-browser": "3.188.0", "@aws-sdk/util-utf8-node": "3.208.0", "tslib": "^2.3.1" + }, + "dependencies": { + "@aws-sdk/abort-controller": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.215.0.tgz", + "integrity": "sha512-HTvL542nawhVqe0oC1AJchdcomEOmPivJEzYUT1LqiG3e8ikxMNa2KWSqqLPeKi2t0A/cfQy7wDUyg9+BZhDSQ==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.215.0.tgz", + "integrity": "sha512-DxX4R+YYLQOtg0qfceKBrjVD4t1mQBG1eb7IVr2QSlckFCX8ztUNymFMuaSEo3938Jyy/NpgfUDpFqPDaSKnng==", + "requires": { + "@aws-sdk/signature-v4": "3.215.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.215.0.tgz", + "integrity": "sha512-/4FUUR6u9gkNfxB6mEwBr0kk0myIkrDcXbAocWN3fPd/t7otzxpx/JqPZXgM6kcVP7M4T/QT75l1E1RRHLWCCQ==", + "requires": { + "@aws-sdk/node-config-provider": "3.215.0", + "@aws-sdk/property-provider": "3.215.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/url-parser": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.215.0.tgz", + "integrity": "sha512-JfZyrJOE+0ik1PumsIUZd0NfgEx4sZ43VSdPCD9GRhssRWudNsSF1B5fz3xA5v+1y5oQPjXZyaWCzKtnYruiWw==", + "requires": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/querystring-builder": "3.215.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/hash-node": { + "version": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.215.0.tgz", + "integrity": "sha512-MkSRuZvo1RCRmI0VNEmRYCGGD/DkMd9lqnLtOyglMPnSX1mhyD4/DyXmcc3rYa7PsjDRAfykGWJRiMqpoMLjiQ==", + "requires": { + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.215.0.tgz", + "integrity": "sha512-++bK4BUQe8/CL/YcLZcQB8qPOhiXxhbuhYzfFS7PNVvW1QOLqKRZL/lKs24gzjcOmw7IhAbCybDZwvu2TM4DAg==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.215.0.tgz", + "integrity": "sha512-zKJRb6jDLFl9nl/muSFbiQHA4uK3skinuDRcyLbpMvvzhuK/PVodv9QI1+wIUsFdXkaSxAlva1oG4bL8ZFi+sQ==", + "requires": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.215.0.tgz", + "integrity": "sha512-GOqI7VwoENZwn+6tIMrrJ4SipIqL2JCh+BNvORVcy7CQxn1ViKkna7iaCx+QMjpg/kn9cR6kfY0n1FmgZR1w9A==", + "requires": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-logger": { + "version": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.215.0.tgz", + "integrity": "sha512-0h4GGF0rV3jnY3jxmcAWsOdqHCYf25s0biSjmgTei+l/5S+geOGrovRPCNep0LLg0i9D8bkZsXISojilETbf+g==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.215.0.tgz", + "integrity": "sha512-KQ+kiEsaluM4i6opjusUukxY78+UhfR7vzXHDkzZK/GplQ1hY0B+rwVO1eaULmlnmf3FK+Wd6lwrPV7xS2W+EA==", + "requires": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-retry": { + "version": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.215.0.tgz", + "integrity": "sha512-I/dnUPVg2Kp3lW+MywBoPp06EOng8IfuaS9ph4bcJpQKrhNU5ekRgCHH2C4k1A6GcP8uyHxQ5TVV6j+l0QPIsA==", + "requires": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/service-error-classification": "3.215.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-middleware": "3.215.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-serde": { + "version": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.215.0.tgz", + "integrity": "sha512-+uhLXdKvvQZcRRFc3UmemSr/YUHA4Jc+1YMjHxc3v8vvfztFJBb0wgBx999myOi8PmkYThlRBQDzXy9UCIhIJw==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.215.0.tgz", + "integrity": "sha512-rdSVL7LxRgjlvoluqwODD4ypBy2k/YVl6FrDplyCMSi8m2WHZG99FzdmR9bpnWK+0DGzYZSMRYx6ynJ9N9PsSw==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.215.0.tgz", + "integrity": "sha512-X6GfoMNoEITTw7rGL/gWs8UZ0cmmmezvKcl+KtHsA642R05OR4mY5G7LdbWAw0bcrwKsuKOGmwUrC9lzGqbWUw==", + "requires": { + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.215.0.tgz", + "integrity": "sha512-notckD94QwwxC0GsfpTxB7VH8SREIIlMsUSddqGtpModa0cq/wRb9rqnydZSoznbYpK1ND6h0C9hr/2PNz89zw==", + "requires": { + "@aws-sdk/property-provider": "3.215.0", + "@aws-sdk/shared-ini-file-loader": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-http-handler": { + "version": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.215.0.tgz", + "integrity": "sha512-btKWSR7m0UuWIN3p5MfSIvhqeYik7xri7U6nWuVI5GVzIYjzxEZOMvPAinDLDxL5wipodi0ZvTUNdDJdm7BcGQ==", + "requires": { + "@aws-sdk/abort-controller": "3.215.0", + "@aws-sdk/protocol-http": "3.215.0", + "@aws-sdk/querystring-builder": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/property-provider": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz", + "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.215.0.tgz", + "integrity": "sha512-qp6Y6v4S534LAjadiVl9p7ErK7ImphOKq6yhFyQwxko6iITLcz8ib3yU27fs4QJcnNj5ZooqW/YlL/0EikDxCQ==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.215.0.tgz", + "integrity": "sha512-eilk8CqG37BVhQklLif00K2dOJgDzacUi8h3KVQ72ry1V3h345i4HsmaFIxvnz8XtNyDvV8qFAzeYg9n2P9RQA==", + "requires": { + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.215.0.tgz", + "integrity": "sha512-8h/9H8dWM4fZO27UGzo8W5JXln4yJMugPyUl4qFA437gzPgNFN95+oLJWXtHMlfCHC5T/PDKetY9TarMDgBD0Q==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.215.0.tgz", + "integrity": "sha512-SKBvClGFGzMPsjBBKjneaUazLCNr6bSxe9eFvOr3gCwuwE2jPQwW3VE1mb62howuvm6cLthEDwLQp/FsT1gMsw==" + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz", + "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.215.0.tgz", + "integrity": "sha512-Rc73uUCi3eJneO25DydLTfJYamXeuKS9YIhNMTKlpvcN1UQAmAnUbAmCuEmqvkYOiGD1i4/kd8kBga708iIikQ==", + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.215.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.215.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/smithy-client": { + "version": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.215.0.tgz", + "integrity": "sha512-PiZfCdZkPohzMPrRmJ46TPOf2Tr/dhKYdwQArRnOOIsJABUGXjlzCUE8vysDN35XZYRx5f9hd+/U7kayhniq2w==", + "requires": { + "@aws-sdk/middleware-stack": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/types": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", + "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==" + }, + "@aws-sdk/url-parser": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.215.0.tgz", + "integrity": "sha512-r/qIk3TUlV36JvoRjTErFm0LzzgNKLB1YUG8zVZCGAc2TEATi8OVEmsZvi+KfTmsbszulITJVcjZKbHLbGoUzg==", + "requires": { + "@aws-sdk/querystring-parser": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.215.0.tgz", + "integrity": "sha512-MiNfZgB0I4dR8CBxH163W7c9KvE38sgCHNPWopMqSX5ezz7cuCPohCU0XsWd4I7K31PvzuqmKgOiKBAZraQJMA==", + "requires": { + "@aws-sdk/property-provider": "3.215.0", + "@aws-sdk/types": "3.215.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.215.0.tgz", + "integrity": "sha512-mSp3R8GljQ+4UT3QMOksQk9L0cWbFLvR7bBmAlt4+GobgTjpRfzFjBP3uwrCqFa3BKDUR3FeJq3qwo+xeY1Krg==", + "requires": { + "@aws-sdk/config-resolver": "3.215.0", + "@aws-sdk/credential-provider-imds": "3.215.0", + "@aws-sdk/node-config-provider": "3.215.0", + "@aws-sdk/property-provider": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-middleware": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.215.0.tgz", + "integrity": "sha512-DfHGlFlQCr+T/xhjS36HH8JEThDVB5lg5NZ6x4Cibhyeps9YX/4ovLAIx3B19H34sdWhZi7q6LfslCHLRu2+7Q==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.215.0.tgz", + "integrity": "sha512-uZz6BJWr8sJcA+onveS1lFqnbIXBHwvkyHLgCuuGhAxd5yY6YNLhpJBnhy9Fb8/aSbk6yao3qxlokqw9gthmAw==", + "requires": { + "@aws-sdk/types": "3.215.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.215.0.tgz", + "integrity": "sha512-4lrdd1oGRwJEwfvgvg1jcJ2O0bwElsvtiqZfTRHN6MNTFUqsKl0xHlgFChQsz3Hfrc1niWtZCmbqQKGdO5ARpw==", + "requires": { + "@aws-sdk/node-config-provider": "3.215.0", + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", + "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + } } }, "@aws-sdk/client-sts": { @@ -18556,6 +19406,29 @@ "@aws-sdk/shared-ini-file-loader": "3.226.0", "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" + }, + "dependencies": { + "@aws-sdk/property-provider": { + "version": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.215.0.tgz", + "integrity": "sha512-dDPjMCCopkRURAmOJCMSlpIQ5BGWCpYj0+FIfZ5qWQs24fn1PAkQHecOiBhJO0ZSVuQy3xcIyWsAp1NE5e+7ug==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.215.0.tgz", + "integrity": "sha512-unzQeLOyUiYHr8WxxandHo0OaCj31gx0wpt8dn2cZcHm/MdCqHcHcsQqOVnQsWQrrxY/XZ27cPyMVQeicNKYwQ==", + "requires": { + "@aws-sdk/types": "3.215.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/types": { + "version": "3.215.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.215.0.tgz", + "integrity": "sha512-eRbCVjwzTYd9C5e2mceScJ6D2kYDDEC3PLkYfJa+1wH9iiF2JlbiYozAokyeYBHQ+AjmD93MK58RBoM8iZfH0Q==" + } } }, "@aws-sdk/types": { @@ -30228,8 +31101,7 @@ "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, "v8-compile-cache-lib": { "version": "3.0.1", @@ -30641,4 +31513,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 780c801029..4adc8938d8 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -55,6 +55,7 @@ ], "devDependencies": { "@aws-sdk/client-secrets-manager": "^3.238.0", + "@aws-sdk/client-ssm": "^3.244.0", "aws-sdk-client-mock": "^2.0.1", "aws-sdk-client-mock-jest": "^2.0.1" } diff --git a/packages/parameters/src/ssm/SSMProvider.ts b/packages/parameters/src/ssm/SSMProvider.ts index 5dfc2ca872..4dd9a471b0 100644 --- a/packages/parameters/src/ssm/SSMProvider.ts +++ b/packages/parameters/src/ssm/SSMProvider.ts @@ -38,7 +38,7 @@ class SSMProvider extends BaseProvider { name: string, options?: SSMGetOptionsInterface | undefined ): Promise | undefined> { - return super.get(name, options); + return super.get(name, options) as Promise | undefined>; } public async getMultiple( diff --git a/packages/parameters/src/ssm/getParameter.ts b/packages/parameters/src/ssm/getParameter.ts index 9c1757e730..fd4d8e8e0e 100644 --- a/packages/parameters/src/ssm/getParameter.ts +++ b/packages/parameters/src/ssm/getParameter.ts @@ -1,5 +1,5 @@ import { SSMProvider, DEFAULT_PROVIDERS } from './SSMProvider'; -import type { SSMGetOptionsInterface } from 'types/SSMProvider'; +import type { SSMGetOptionsInterface } from '../types/SSMProvider'; const getParameter = ( name: string, @@ -9,7 +9,7 @@ const getParameter = ( DEFAULT_PROVIDERS.ssm = new SSMProvider(); } - return DEFAULT_PROVIDERS.ssm.get(name, options); + return (DEFAULT_PROVIDERS.ssm as SSMProvider).get(name, options); }; export { diff --git a/packages/parameters/src/ssm/getParameters.ts b/packages/parameters/src/ssm/getParameters.ts index 5a390bc0be..0283bc0b5e 100644 --- a/packages/parameters/src/ssm/getParameters.ts +++ b/packages/parameters/src/ssm/getParameters.ts @@ -1,5 +1,5 @@ import { SSMProvider, DEFAULT_PROVIDERS } from './SSMProvider'; -import type { SSMGetMultipleOptionsInterface } from 'types/SSMProvider'; +import type { SSMGetMultipleOptionsInterface } from '../types/SSMProvider'; const getParameters = ( path: string, @@ -9,7 +9,7 @@ const getParameters = ( DEFAULT_PROVIDERS.ssm = new SSMProvider(); } - return DEFAULT_PROVIDERS.ssm.getMultiple(path, options); + return (DEFAULT_PROVIDERS.ssm as SSMProvider).getMultiple(path, options); }; export { diff --git a/packages/parameters/src/ssm/getParametersByName.ts b/packages/parameters/src/ssm/getParametersByName.ts index 41037913d0..c2b8f625f0 100644 --- a/packages/parameters/src/ssm/getParametersByName.ts +++ b/packages/parameters/src/ssm/getParametersByName.ts @@ -1,5 +1,5 @@ import { SSMProvider, DEFAULT_PROVIDERS } from './SSMProvider'; -import type { SSMGetParametersByNameOptionsInterface } from 'types/SSMProvider'; +import type { SSMGetParametersByNameOptionsInterface } from '../types/SSMProvider'; const getParametersByName = ( parameters: Record,