From 829f545483f51a1cc116cf4816f908c6f2817f70 Mon Sep 17 00:00:00 2001 From: mju-spyrosoft Date: Mon, 13 Mar 2023 01:31:38 +0100 Subject: [PATCH] fix(appconfig): #1009 rewrite to not use deprecated appconfig getConfiguration command --- packages/appconfig/__tests__/index.js | 361 ++++++++---- packages/appconfig/index.js | 75 ++- packages/appconfig/package-lock.json | 809 ++++++++++++++++++++++++++ packages/appconfig/package.json | 1 + 4 files changed, 1102 insertions(+), 144 deletions(-) diff --git a/packages/appconfig/__tests__/index.js b/packages/appconfig/__tests__/index.js index 2812250c0..fd9793dd8 100644 --- a/packages/appconfig/__tests__/index.js +++ b/packages/appconfig/__tests__/index.js @@ -3,6 +3,11 @@ import sinon from 'sinon' import { mockClient } from 'aws-sdk-client-mock' import middy from '../../core/index.js' import { getInternal, clearCache } from '../../util/index.js' +import { + StartConfigurationSessionCommand, + GetLatestConfigurationCommand, + AppConfigDataClient +} from '@aws-sdk/client-appconfigdata' import { AppConfigClient, GetConfigurationCommand @@ -28,13 +33,21 @@ const strToUintArray = (str) => Uint8Array.from(str.split('').map((x) => x.charCodeAt())) test.serial( - 'It should set AppConfig param value to internal storage', + 'It should set AppConfigData param value to internal storage', async (t) => { - mockClient(AppConfigClient) - .on(GetConfigurationCommand) + mockClient(AppConfigDataClient) + .on(StartConfigurationSessionCommand) + .resolvesOnce({ + ContentType: 'application/json', + InitialConfigurationToken: 'InitialToken...' + }) + .on(GetLatestConfigurationCommand, { + ConfigurationToken: 'InitialToken...' + }) .resolvesOnce({ ContentType: 'application/json', - Content: strToUintArray('{"option":"value"}') + Configuration: strToUintArray('{"option":"value"}'), + NextPollConfigurationToken: 'nextConfigToken' }) const middleware = async (request) => { @@ -45,14 +58,13 @@ test.serial( const handler = middy(() => {}) .use( appConfig({ - AwsClient: AppConfigClient, + AwsClient: AppConfigDataClient, cacheExpiry: 0, fetchData: { key: { - Application: '...', - ClientId: '...', - Configuration: '...', - Environment: '...' + ApplicationIdentifier: 'xb0nby2', + ConfigurationProfileIdentifier: 'ofexqm2', + EnvironmentIdentifier: '7tp0goq' } } }) @@ -64,43 +76,117 @@ test.serial( ) test.serial( - 'It should set AppConfig param value to internal storage without prefetch', + 'It should use previous configuration token on subsequent app config fetch', async (t) => { - mockClient(AppConfigClient) - .on(GetConfigurationCommand) + mockClient(AppConfigDataClient) + .on(StartConfigurationSessionCommand) .resolvesOnce({ ContentType: 'application/json', - Content: strToUintArray('{"option":"value"}') + InitialConfigurationToken: 'InitialToken...' + }) + .on(GetLatestConfigurationCommand, { + ConfigurationToken: 'InitialToken...' + }) + .resolvesOnce({ + ContentType: 'application/json', + Configuration: strToUintArray('{"option":"value"}'), + NextPollConfigurationToken: 'NextConfigToken' + }) + .on(GetLatestConfigurationCommand, { + ConfigurationToken: 'NextConfigToken' + }) + .resolvesOnce({ + ContentType: 'application/json', + Configuration: strToUintArray('{"option":"newValue"}'), + NextPollConfigurationToken: 'NextConfigToken' }) const middleware = async (request) => { const values = await getInternal(true, request) - t.is(values.key?.option, 'value') + return values.key?.option } const handler = middy(() => {}) .use( appConfig({ - AwsClient: AppConfigClient, + AwsClient: AppConfigDataClient, cacheExpiry: 0, fetchData: { key: { - Application: '...', - ClientId: '...', - Configuration: '...', - Environment: '...' + ApplicationIdentifier: 'xb0nby2', + ConfigurationProfileIdentifier: 'ofexqm2', + EnvironmentIdentifier: '7tp0goq' } - }, - disablePrefetch: true + } }) ) .before(middleware) - await handler(event, context) + const configOne = await handler(event, context) + const configTwo = await handler(event, context) + + t.is(configOne, 'value') + t.is(configTwo, 'newValue') } ) -test.serial('It should set AppConfig param value to context', async (t) => { +// TODO fails as GetLatestConfigurationCommand returns null configuration if it has not changed since last pull +test.serial( + 'It should keep previous configuration value if getLatestConfiguration returns null configuration', + async (t) => { + mockClient(AppConfigDataClient) + .on(StartConfigurationSessionCommand) + .resolvesOnce({ + ContentType: 'application/json', + InitialConfigurationToken: 'InitialToken...' + }) + .on(GetLatestConfigurationCommand, { + ConfigurationToken: 'InitialToken...' + }) + .resolvesOnce({ + ContentType: 'application/json', + Configuration: strToUintArray('{"option":"value"}'), + NextPollConfigurationToken: 'NextConfigToken' + }) + .on(GetLatestConfigurationCommand, { + ConfigurationToken: 'NextConfigToken' + }) + .resolvesOnce({ + ContentType: 'application/json', + Configuration: null, + NextPollConfigurationToken: 'NextConfigToken' + }) + + const middleware = async (request) => { + const values = await getInternal(true, request) + return values.key?.option + } + + const handler = middy(() => {}) + .use( + appConfig({ + AwsClient: AppConfigDataClient, + cacheExpiry: 0, + fetchData: { + key: { + ApplicationIdentifier: '...', + ConfigurationProfileIdentifier: '...', + EnvironmentIdentifier: '...' + } + } + }) + ) + .before(middleware) + + const configOne = await handler(event, context) + const configTwo = await handler(event, context) + + t.is(configOne, 'value') + t.is(configTwo, 'value') + } +) + +test.skip('It should set AppConfig param value to internal storage without prefetch', async (t) => { mockClient(AppConfigClient) .on(GetConfigurationCommand) .resolvesOnce({ @@ -109,7 +195,8 @@ test.serial('It should set AppConfig param value to context', async (t) => { }) const middleware = async (request) => { - t.is(request.context.key?.option, 'value') + const values = await getInternal(true, request) + t.is(values.key?.option, 'value') } const handler = middy(() => {}) @@ -125,7 +212,7 @@ test.serial('It should set AppConfig param value to context', async (t) => { Environment: '...' } }, - setToContext: true + disablePrefetch: true }) ) .before(middleware) @@ -133,126 +220,150 @@ test.serial('It should set AppConfig param value to context', async (t) => { await handler(event, context) }) -test.serial( - 'It should not call aws-sdk again if parameter is cached forever', - async (t) => { - const mockService = mockClient(AppConfigClient) - .on(GetConfigurationCommand) - .resolvesOnce({ - ContentType: 'application/json', - Content: strToUintArray('{"option":"value"}') - }) - const sendStub = mockService.send - const middleware = async (request) => { - const values = await getInternal(true, request) - t.is(values.key?.option, 'value') - } +test.skip('It should set AppConfig param value to context', async (t) => { + mockClient(AppConfigClient) + .on(GetConfigurationCommand) + .resolvesOnce({ + ContentType: 'application/json', + Content: strToUintArray('{"option":"value"}') + }) - const handler = middy(() => {}) - .use( - appConfig({ - AwsClient: AppConfigClient, - cacheExpiry: -1, - fetchData: { - key: { - Application: '...', - ClientId: '...', - Configuration: '...', - Environment: '...' - } + const middleware = async (request) => { + t.is(request.context.key?.option, 'value') + } + + const handler = middy(() => {}) + .use( + appConfig({ + AwsClient: AppConfigClient, + cacheExpiry: 0, + fetchData: { + key: { + Application: '...', + ClientId: '...', + Configuration: '...', + Environment: '...' } - }) - ) - .before(middleware) + }, + setToContext: true + }) + ) + .before(middleware) - await handler(event, context) - await handler(event, context) + await handler(event, context) +}) - t.is(sendStub.callCount, 1) +test.skip('It should not call aws-sdk again if parameter is cached forever', async (t) => { + const mockService = mockClient(AppConfigClient) + .on(GetConfigurationCommand) + .resolvesOnce({ + ContentType: 'application/json', + Content: strToUintArray('{"option":"value"}') + }) + const sendStub = mockService.send + const middleware = async (request) => { + const values = await getInternal(true, request) + t.is(values.key?.option, 'value') } -) -test.serial( - 'It should not call aws-sdk again if parameter is cached', - async (t) => { - const mockService = mockClient(AppConfigClient) - .on(GetConfigurationCommand) - .resolvesOnce({ - ContentType: 'application/json', - Content: strToUintArray('{"option":"value"}') + const handler = middy(() => {}) + .use( + appConfig({ + AwsClient: AppConfigClient, + cacheExpiry: -1, + fetchData: { + key: { + Application: '...', + ClientId: '...', + Configuration: '...', + Environment: '...' + } + } }) - const sendStub = mockService.send + ) + .before(middleware) - const middleware = async (request) => { - const values = await getInternal(true, request) - t.is(values.key?.option, 'value') - } + await handler(event, context) + await handler(event, context) - const handler = middy(() => {}) - .use( - appConfig({ - AwsClient: AppConfigClient, - cacheExpiry: 1000, - fetchData: { - key: { - Application: '...', - ClientId: '...', - Configuration: '...', - Environment: '...' - } - } - }) - ) - .before(middleware) + t.is(sendStub.callCount, 1) +}) - await handler(event, context) - await handler(event, context) +test.skip('It should not call aws-sdk again if parameter is cached', async (t) => { + const mockService = mockClient(AppConfigClient) + .on(GetConfigurationCommand) + .resolvesOnce({ + ContentType: 'application/json', + Content: strToUintArray('{"option":"value"}') + }) + const sendStub = mockService.send - t.is(sendStub.callCount, 1) + const middleware = async (request) => { + const values = await getInternal(true, request) + t.is(values.key?.option, 'value') } -) -test.serial( - 'It should call aws-sdk if cache enabled but cached param has expired', - async (t) => { - const mockService = mockClient(AppConfigClient) - .on(GetConfigurationCommand) - .resolves({ - ContentType: 'application/json', - Content: strToUintArray('{"option":"value"}') + const handler = middy(() => {}) + .use( + appConfig({ + AwsClient: AppConfigClient, + cacheExpiry: 1000, + fetchData: { + key: { + Application: '...', + ClientId: '...', + Configuration: '...', + Environment: '...' + } + } }) - const sendStub = mockService.send + ) + .before(middleware) - const middleware = async (request) => { - const values = await getInternal(true, request) - t.is(values.key?.option, 'value') - } + await handler(event, context) + await handler(event, context) - const handler = middy(() => {}) - .use( - appConfig({ - AwsClient: AppConfigClient, - cacheExpiry: 0, - fetchData: { - key: { - Application: '...', - ClientId: '...', - Configuration: '...', - Environment: '...' - } - } - }) - ) - .before(middleware) + t.is(sendStub.callCount, 1) +}) - await handler(event, context) - await handler(event, context) +test.skip('It should call aws-sdk if cache enabled but cached param has expired', async (t) => { + const mockService = mockClient(AppConfigClient) + .on(GetConfigurationCommand) + .resolves({ + ContentType: 'application/json', + Content: strToUintArray('{"option":"value"}') + }) + const sendStub = mockService.send - t.is(sendStub.callCount, 2) + const middleware = async (request) => { + const values = await getInternal(true, request) + t.is(values.key?.option, 'value') } -) -test.serial('It should catch if an error is returned from fetch', async (t) => { + const handler = middy(() => {}) + .use( + appConfig({ + AwsClient: AppConfigClient, + cacheExpiry: 0, + fetchData: { + key: { + Application: '...', + ClientId: '...', + Configuration: '...', + Environment: '...' + } + } + }) + ) + .before(middleware) + + await handler(event, context) + await handler(event, context) + + t.is(sendStub.callCount, 2) +}) + +test.skip('It should catch if an error is returned from fetch', async (t) => { const mockService = mockClient(AppConfigClient) .on(GetConfigurationCommand) .rejects('timeout') diff --git a/packages/appconfig/index.js b/packages/appconfig/index.js index f7bbdf9d7..68d9aa19c 100644 --- a/packages/appconfig/index.js +++ b/packages/appconfig/index.js @@ -9,11 +9,13 @@ import { jsonSafeParse } from '@middy/util' import { - AppConfigClient, - GetConfigurationCommand -} from '@aws-sdk/client-appconfig' + StartConfigurationSessionCommand, + GetLatestConfigurationCommand, + AppConfigDataClient +} from '@aws-sdk/client-appconfigdata' + const defaults = { - AwsClient: AppConfigClient, + AwsClient: AppConfigDataClient, awsClientOptions: {}, awsClientAssumeRole: undefined, awsClientCapture: undefined, @@ -29,25 +31,60 @@ const appConfigMiddleware = (opts = {}) => { ...defaults, ...opts } + const configurationTokenCache = {} + + function fetchLatestConfiguration (configToken, internalKey) { + return client + .send( + new GetLatestConfigurationCommand({ + ConfigurationToken: configToken + }) + ) + .then((configResp) => { + configurationTokenCache[internalKey] = + configResp.NextPollConfigurationToken + let value = String.fromCharCode.apply(null, configResp.Configuration) + + if (contentTypePattern.test(configResp.ContentType)) { + value = jsonSafeParse(value) + } + return value + }) + .catch((e) => { + const value = getCache(options.cacheKey).value ?? {} + value[internalKey] = undefined + modifyCache(options.cacheKey, value) + throw e + }) + } + const fetch = (request, cachedValues = {}) => { const values = {} for (const internalKey of Object.keys(options.fetchData)) { if (cachedValues[internalKey]) continue - values[internalKey] = client - .send(new GetConfigurationCommand(options.fetchData[internalKey])) - .then((resp) => { - let value = String.fromCharCode.apply(null, resp.Content) - if (contentTypePattern.test(resp.ContentType)) { - value = jsonSafeParse(value) - } - return value - }) - .catch((e) => { - const value = getCache(options.cacheKey).value ?? {} - value[internalKey] = undefined - modifyCache(options.cacheKey, value) - throw e - }) + if (configurationTokenCache[internalKey] == null) { + values[internalKey] = client + .send( + new StartConfigurationSessionCommand(options.fetchData[internalKey]) + ) + .then((configSessionResp) => + fetchLatestConfiguration( + configSessionResp.InitialConfigurationToken, + internalKey + ) + ) + .catch((e) => { + const value = getCache(options.cacheKey).value ?? {} + value[internalKey] = undefined + modifyCache(options.cacheKey, value) + throw e + }) + continue + } + values[internalKey] = fetchLatestConfiguration( + configurationTokenCache[internalKey], + internalKey + ) } return values } diff --git a/packages/appconfig/package-lock.json b/packages/appconfig/package-lock.json index 4afae23d2..37ac238eb 100644 --- a/packages/appconfig/package-lock.json +++ b/packages/appconfig/package-lock.json @@ -13,6 +13,7 @@ }, "devDependencies": { "@aws-sdk/client-appconfig": "^3.0.0", + "@aws-sdk/client-appconfigdata": "^3.289.0", "@middy/core": "4.2.6", "@types/aws-lambda": "^8.10.101", "aws-xray-sdk": "^3.3.3" @@ -170,6 +171,814 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-appconfigdata": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.289.0.tgz", + "integrity": "sha512-k/qD3LexEAYIuMysaEuKGnCke0LuToe7BL5wDGRUvfuN3RtKsO4OU7+pWqYDyTCebB02uSCTho/HKBq0UjtKYg==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.289.0", + "@aws-sdk/config-resolver": "3.289.0", + "@aws-sdk/credential-provider-node": "3.289.0", + "@aws-sdk/fetch-http-handler": "3.289.0", + "@aws-sdk/hash-node": "3.289.0", + "@aws-sdk/invalid-dependency": "3.289.0", + "@aws-sdk/middleware-content-length": "3.289.0", + "@aws-sdk/middleware-endpoint": "3.289.0", + "@aws-sdk/middleware-host-header": "3.289.0", + "@aws-sdk/middleware-logger": "3.289.0", + "@aws-sdk/middleware-recursion-detection": "3.289.0", + "@aws-sdk/middleware-retry": "3.289.0", + "@aws-sdk/middleware-serde": "3.289.0", + "@aws-sdk/middleware-signing": "3.289.0", + "@aws-sdk/middleware-stack": "3.289.0", + "@aws-sdk/middleware-user-agent": "3.289.0", + "@aws-sdk/node-config-provider": "3.289.0", + "@aws-sdk/node-http-handler": "3.289.0", + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/smithy-client": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/url-parser": "3.289.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.289.0", + "@aws-sdk/util-defaults-mode-node": "3.289.0", + "@aws-sdk/util-endpoints": "3.289.0", + "@aws-sdk/util-retry": "3.289.0", + "@aws-sdk/util-user-agent-browser": "3.289.0", + "@aws-sdk/util-user-agent-node": "3.289.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/abort-controller": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.289.0.tgz", + "integrity": "sha512-Xakz8EeTl0Q3KaWRdCaRQrrYxBAkQGj6eeT+DVmMLMz4gzTcSHwvfR5tVBIPHk4+IjboJJKM5l1xAZ90AGFPAQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/client-sso": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.289.0.tgz", + "integrity": "sha512-GIpxPaEwqXC+P8wH+G4mIDnxYFJ+2SyYTrnoxb4OUH+gAkU6tybgvsv0fy+jsVD6GAWPdfU1AYk2ZjofdFiHeA==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.289.0", + "@aws-sdk/fetch-http-handler": "3.289.0", + "@aws-sdk/hash-node": "3.289.0", + "@aws-sdk/invalid-dependency": "3.289.0", + "@aws-sdk/middleware-content-length": "3.289.0", + "@aws-sdk/middleware-endpoint": "3.289.0", + "@aws-sdk/middleware-host-header": "3.289.0", + "@aws-sdk/middleware-logger": "3.289.0", + "@aws-sdk/middleware-recursion-detection": "3.289.0", + "@aws-sdk/middleware-retry": "3.289.0", + "@aws-sdk/middleware-serde": "3.289.0", + "@aws-sdk/middleware-stack": "3.289.0", + "@aws-sdk/middleware-user-agent": "3.289.0", + "@aws-sdk/node-config-provider": "3.289.0", + "@aws-sdk/node-http-handler": "3.289.0", + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/smithy-client": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/url-parser": "3.289.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.289.0", + "@aws-sdk/util-defaults-mode-node": "3.289.0", + "@aws-sdk/util-endpoints": "3.289.0", + "@aws-sdk/util-retry": "3.289.0", + "@aws-sdk/util-user-agent-browser": "3.289.0", + "@aws-sdk/util-user-agent-node": "3.289.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.289.0.tgz", + "integrity": "sha512-+09EK4aWdNjF+5+nK6Dmlwx3es8NTkyABTOj9H4eKB90rXQVX8PjoaFhK/b+NcNKDxgb1E6k6evZEpAb8dYQHg==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.289.0", + "@aws-sdk/fetch-http-handler": "3.289.0", + "@aws-sdk/hash-node": "3.289.0", + "@aws-sdk/invalid-dependency": "3.289.0", + "@aws-sdk/middleware-content-length": "3.289.0", + "@aws-sdk/middleware-endpoint": "3.289.0", + "@aws-sdk/middleware-host-header": "3.289.0", + "@aws-sdk/middleware-logger": "3.289.0", + "@aws-sdk/middleware-recursion-detection": "3.289.0", + "@aws-sdk/middleware-retry": "3.289.0", + "@aws-sdk/middleware-serde": "3.289.0", + "@aws-sdk/middleware-stack": "3.289.0", + "@aws-sdk/middleware-user-agent": "3.289.0", + "@aws-sdk/node-config-provider": "3.289.0", + "@aws-sdk/node-http-handler": "3.289.0", + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/smithy-client": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/url-parser": "3.289.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.289.0", + "@aws-sdk/util-defaults-mode-node": "3.289.0", + "@aws-sdk/util-endpoints": "3.289.0", + "@aws-sdk/util-retry": "3.289.0", + "@aws-sdk/util-user-agent-browser": "3.289.0", + "@aws-sdk/util-user-agent-node": "3.289.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/client-sts": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.289.0.tgz", + "integrity": "sha512-n+8zDCzk0NvCIXX3MGS8RV/+/MkJso0jkqkPOgPcS8Kf7Zbjlx8FyeGQ5LS7HjhCDk+jExH/s9h1kd3sL1pHQA==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.289.0", + "@aws-sdk/credential-provider-node": "3.289.0", + "@aws-sdk/fetch-http-handler": "3.289.0", + "@aws-sdk/hash-node": "3.289.0", + "@aws-sdk/invalid-dependency": "3.289.0", + "@aws-sdk/middleware-content-length": "3.289.0", + "@aws-sdk/middleware-endpoint": "3.289.0", + "@aws-sdk/middleware-host-header": "3.289.0", + "@aws-sdk/middleware-logger": "3.289.0", + "@aws-sdk/middleware-recursion-detection": "3.289.0", + "@aws-sdk/middleware-retry": "3.289.0", + "@aws-sdk/middleware-sdk-sts": "3.289.0", + "@aws-sdk/middleware-serde": "3.289.0", + "@aws-sdk/middleware-signing": "3.289.0", + "@aws-sdk/middleware-stack": "3.289.0", + "@aws-sdk/middleware-user-agent": "3.289.0", + "@aws-sdk/node-config-provider": "3.289.0", + "@aws-sdk/node-http-handler": "3.289.0", + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/smithy-client": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/url-parser": "3.289.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.289.0", + "@aws-sdk/util-defaults-mode-node": "3.289.0", + "@aws-sdk/util-endpoints": "3.289.0", + "@aws-sdk/util-retry": "3.289.0", + "@aws-sdk/util-user-agent-browser": "3.289.0", + "@aws-sdk/util-user-agent-node": "3.289.0", + "@aws-sdk/util-utf8": "3.254.0", + "fast-xml-parser": "4.1.2", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/config-resolver": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.289.0.tgz", + "integrity": "sha512-QYrBJeFJwx9wL73xMJgSTS6zY5SQh0tbZXpVlSZcNDuOufsu5zdcZZCOp0I20yGf8zxKX59u7O73OUlppkk+Wg==", + "dev": true, + "dependencies": { + "@aws-sdk/signature-v4": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.289.0.tgz", + "integrity": "sha512-h4yNEW2ZJATKVxL0Bvz/WWXUmBr+AhsTyjUNge734306lXNG5/FM7zYp2v6dSQWt02WwBXyfkP3lr+A0n4rHyA==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.289.0.tgz", + "integrity": "sha512-SIl+iLQpDR6HA9CKTebui7NLop5GxnCkufbM3tbSqrQcPcEfYLOwXpu5gpKO2unQzRykCoyRVia1lr7Pc9Hgdg==", + "dev": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.289.0", + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/url-parser": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.289.0.tgz", + "integrity": "sha512-kvNUn3v4FTRRiqCOXl46v51VTGOM76j5Szcrhkk9qeFW6zt4iFodp6tQ4ynDtDxYxOvjuEfm3ii1YN5nkI1uKA==", + "dev": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.289.0", + "@aws-sdk/credential-provider-imds": "3.289.0", + "@aws-sdk/credential-provider-process": "3.289.0", + "@aws-sdk/credential-provider-sso": "3.289.0", + "@aws-sdk/credential-provider-web-identity": "3.289.0", + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/shared-ini-file-loader": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.289.0.tgz", + "integrity": "sha512-05CYPGnk5cDiOQDIaXNVibNOwQdI34MDiL17YkSfPv779A+uq4vqg/aBfL41BDJjr1gSGgyvVhlcUdBKnlp93Q==", + "dev": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.289.0", + "@aws-sdk/credential-provider-imds": "3.289.0", + "@aws-sdk/credential-provider-ini": "3.289.0", + "@aws-sdk/credential-provider-process": "3.289.0", + "@aws-sdk/credential-provider-sso": "3.289.0", + "@aws-sdk/credential-provider-web-identity": "3.289.0", + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/shared-ini-file-loader": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.289.0.tgz", + "integrity": "sha512-t39CJHj1/f2DcRbEUSJ1ixwDsgaElDpJPynn59MOdNnrSh5bYuYmkrum/GYXYSsk+HoSK21JvwgvjnrkA9WZKQ==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/shared-ini-file-loader": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.289.0.tgz", + "integrity": "sha512-8+DjOqj5JCpVdT4EJtdfis6OioAdiDKM1mvgDTG8R43MSThc+RGfzqaDJQdM+8+hzkYhxYfyI9XB0H+X3rDNsA==", + "dev": true, + "dependencies": { + "@aws-sdk/client-sso": "3.289.0", + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/shared-ini-file-loader": "3.289.0", + "@aws-sdk/token-providers": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.289.0.tgz", + "integrity": "sha512-jZ9hQvr0I7Z2DekDtZytViYn7zNNJG06N0CinAJzzvreAQ1I61rU7mhaWc05jhBSdeA3f82XoDAgxqY4xIh9pQ==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.289.0.tgz", + "integrity": "sha512-tksh2GnDV1JaI+NO9x+pgyB3VNwjnUdtoMcFGmTDm1TrcPNj0FLX2hLiunlVG7fFMfGLXC2aco0sUra5/5US9Q==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/querystring-builder": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/hash-node": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.289.0.tgz", + "integrity": "sha512-fL7Pt4LU+tluHn0+BSIFVD2ZVJ5fuXvd1hQt4aTYrgkna1RR5v55Hdy2rNrp/syrkyE+Wv92S3hgZ7ZTBeXFZA==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/invalid-dependency": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.289.0.tgz", + "integrity": "sha512-VpXadvpqXFUA8gBH6TAAJzsKfEQ4IvsiD7d9b2B+jw1YtaPFTqEEuDjN6ngpad8PCPCNWl8CI6oBCdMOK+L48A==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-content-length": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.289.0.tgz", + "integrity": "sha512-D7vGeuaAzKiq0aFPwme1Xy4x69Jn4v0YJ3Xa4J+keNep0yZ9LfU5KSngqsxeTefCqS+2tdaArkBN2VdexmPagw==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.289.0.tgz", + "integrity": "sha512-nxaQFOG1IurwCHWP22RxgTFZdILsdBg6wbg4GeFpNBtE3bi0zIUYKrUhpdRr/pZyGAboD1oD9iQtxuGb/M6f+w==", + "dev": true, + "dependencies": { + "@aws-sdk/middleware-serde": "3.289.0", + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/signature-v4": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/url-parser": "3.289.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.289.0.tgz", + "integrity": "sha512-yFBOKvKBnITO08JCx+65vXPe9Uo4gZuth/ka9v5swa4wtV8AP+kkOwFrNxSi2iAFLJ4Mg21vGQceeL0bErF6KQ==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-logger": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.289.0.tgz", + "integrity": "sha512-c5W7AlOdoyTXRoNl2yOVkhbTjp8tX0z65GDb3+/1yYcv+GRtz67WMZscWMQJwEfdCLdDE2GtBe+t2xyFGnmJvA==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.289.0.tgz", + "integrity": "sha512-r2NrfnTG0UZRXeFjoyapAake7b1rUo6SC52/UV4Pdm8cHoYMmljnaGLjiAfzt6vWv6cSVCJq1r28Ne4slAoMAg==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-retry": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.289.0.tgz", + "integrity": "sha512-Su+iGv5mrFjVCXJmjohX00o3HzkwnhY0TDhIltgolB6ZfOqy3Dfopjj21OWtqY9VYCUiLGC4KRfeb2feyrz5BA==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/service-error-classification": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/util-middleware": "3.289.0", + "@aws-sdk/util-retry": "3.289.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.289.0.tgz", + "integrity": "sha512-9WzUVPEqJcvggGCk9JHXnwhj7fjuMXE/JM3gx7eMSStJCcK+3BARZ1RZnggUN4vN9iTSzdA+r0OpC1XnUGKB2g==", + "dev": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.289.0", + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/signature-v4": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-serde": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.289.0.tgz", + "integrity": "sha512-pygC+LsEBVAxOzfoxA9jgvqfO1PLivh8s2Yr/aNQOwx49fmTHMvPwRYUGDV38Du6bRYcKI6nxYqkbJFkQkRESQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-signing": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.289.0.tgz", + "integrity": "sha512-9SLATNvibxg4hpr4ldU18LwB6AVzovONWeJLt49FKISz7ZwGF6WVJYUMWeScj4+Z51Gozi7+pUIaFn7i6N3UbA==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/signature-v4": "3.289.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/util-middleware": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-stack": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.289.0.tgz", + "integrity": "sha512-3rWx+UkV//dv/cLIrXmzIa+FZcn6n76JevGHYCTReiRpcvv+xECxgXH2crMYtzbu05WdxGYD6P0IP5tMwH0yXA==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.289.0.tgz", + "integrity": "sha512-XPhB9mgko66BouyxA+7z7SjUaNHyr58Xe/OB8GII5R/JiR3A/lpc8+jm9gEEpjEI/HpF8jLFDnTMbgabVAHOeA==", + "dev": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/node-config-provider": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.289.0.tgz", + "integrity": "sha512-rR41c3Y7MYEP8TG9X1whHyrXEXOZzi4blSDqeJflwtNt3r3HvErGZiNBdVv368ycPPuu1YRSqTkgOYNCv02vlw==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/shared-ini-file-loader": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/node-http-handler": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.289.0.tgz", + "integrity": "sha512-zKknSaOY2GNmqH/eoZndmQWoEKhYPV0qRZtAMxuS3DVI5fipBipNzbVBaXrHRjxARx7/VLWnvNArchRoHfOlmw==", + "dev": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.289.0", + "@aws-sdk/protocol-http": "3.289.0", + "@aws-sdk/querystring-builder": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/property-provider": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.289.0.tgz", + "integrity": "sha512-Raf4lTWPTmEGFV7Lkbfet2n/4Ybz5vQiiU45l56kgIQA88mLUuE4dshgNsM0Zb2rflsTaiN1JR2+RS/8lNtI8A==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/protocol-http": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.289.0.tgz", + "integrity": "sha512-/2jOQ3MJZx1xk6BHEOW47ItGo1tgA9cP9a2saYneon05VIV6OuYefO5pG2G0nPnImTbff++N7aioXe5XKrnorw==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/querystring-builder": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.289.0.tgz", + "integrity": "sha512-llJCS8mAJfBYBjkKeriRmBuDr2jIozrMWhJOkz95SQGFsx1sKBPQMMOV6zunwhQux8bjtjf5wYiR1TM2jNUKqQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/querystring-parser": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.289.0.tgz", + "integrity": "sha512-84zXKXIYtnTCrez/gGZIGuqfUJezzaOMm7BQwnOnq/sN21ou63jF3Q+tIMhLO/EvDcvmxEOlUXN1kfMQcjEjSw==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/service-error-classification": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.289.0.tgz", + "integrity": "sha512-+d1Vlb45Bs2gbTmXpRCGQrX4AQDETjA5sx1zLvq1NZGSnTX6LdroYPtXu3dRWJwDHHQpCMN/XfFN8jTw0IzBOg==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.289.0.tgz", + "integrity": "sha512-XG9Pfn3itf3Z0p6nY6UuMVMhzZb+oX7L28oyby8REl8BAwfPkcziLxXlZsBHf6KcgYDG1R6z945hvIwZhJbjvA==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/signature-v4": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.289.0.tgz", + "integrity": "sha512-IQyYHx3zp7PHxFA17YDb6WVx8ejXDxrsnKspFXgZQyoZOPfReqWQs32dcJYXff/IdSzxjwOpwBFbmIt2vbdKnQ==", + "dev": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.289.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.289.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/smithy-client": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.289.0.tgz", + "integrity": "sha512-miPMdnv4Ivv8RN65LJ9dxzkQNHn9Tp9wzZJXwBcPqGdXyRlkWSuIOIIhhAqQoV9R9ByeshnCWBpwqlITIjNPVw==", + "dev": true, + "dependencies": { + "@aws-sdk/middleware-stack": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/token-providers": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.289.0.tgz", + "integrity": "sha512-fzvGIfJNoLR5g24ok8cRwc9AMLXoEOyfi+eHocAF6eyfe0NWlQtpsmLe7XXx5I9yZ51lclzV49rEz9ynp243RA==", + "dev": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.289.0", + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/shared-ini-file-loader": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/types": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.289.0.tgz", + "integrity": "sha512-wwUC+VwoNlEkgDzK/aJG3+zeMcYRcYFQV4mbZaicYdp3v8hmkUkJUhyxuZYl/FmY46WG+DYv+/Y3NilgfsE+Wg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/url-parser": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.289.0.tgz", + "integrity": "sha512-rbtW3O6UBX+eWR/+UiCDNFUVwN8hp82JPy+NGv3NeOvRjBsxkKmcH4UJTHDIeT+suqTDNEdV5nz438u3dHdHrQ==", + "dev": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.289.0.tgz", + "integrity": "sha512-sYrDwjX3s54cvGq69PJpP2vDpJ5BJXhg2KEHbK92Qr2AUqMUgidwZCw4oBaIqKDXcPIrjmhod31s3tTfYmtTMQ==", + "dev": true, + "dependencies": { + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/types": "3.289.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.289.0.tgz", + "integrity": "sha512-PsP40+9peN7kpEmQ2GhEAGwUwD9F/R/BI/1kzjW0nbBsMrTnkUnlZlaitwpBX/OWNV/YZTdVAOvD50j/ACyXlg==", + "dev": true, + "dependencies": { + "@aws-sdk/config-resolver": "3.289.0", + "@aws-sdk/credential-provider-imds": "3.289.0", + "@aws-sdk/node-config-provider": "3.289.0", + "@aws-sdk/property-provider": "3.289.0", + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/util-endpoints": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.289.0.tgz", + "integrity": "sha512-PmsgqL9jdNTz3p0eW83nZZGcngAdoIWidXCc32G5tIIYvJutdgkiObAaydtXaMgk5CRvjenngFf6Zg9JyVHOLQ==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/util-middleware": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.289.0.tgz", + "integrity": "sha512-hw3WHQU9Wk7a1H3x+JhwMA4ECCleeuNlob3fXSYJmXgvZyuWfpMYZi4iSkqoWGFAXYpAtZZLIu45iIcd7F296g==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/util-retry": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.289.0.tgz", + "integrity": "sha512-noFn++ZKH11ExTBqUU/b9wsOjqxYlDnN/8xq+9oCsyBnEZztVgM/AM3WP5qBPRskk1WzDprID5fb5V87113Uug==", + "dev": true, + "dependencies": { + "@aws-sdk/service-error-classification": "3.289.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.289.0.tgz", + "integrity": "sha512-BDXYgNzzz2iNPTkl9MQf7pT4G80V6O6ICwJyH93a5EEdljl7oPrt8i4MS5S0BDAWx58LqjWtVw98GOZfy5BYhw==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "3.289.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/client-appconfigdata/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.289.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.289.0.tgz", + "integrity": "sha512-f32g9KS7pwO6FQ9N1CtqQPIS6jhvwv/y0+NHNoo9zLTBH0jol3+C2ELIE3N1wB6xvwhsdPqR3WuOiNiCiv8YAQ==", + "dev": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.289.0", + "@aws-sdk/types": "3.289.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": { "version": "3.282.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.282.0.tgz", diff --git a/packages/appconfig/package.json b/packages/appconfig/package.json index 9aab415e4..fd896c801 100644 --- a/packages/appconfig/package.json +++ b/packages/appconfig/package.json @@ -68,6 +68,7 @@ }, "devDependencies": { "@aws-sdk/client-appconfig": "^3.0.0", + "@aws-sdk/client-appconfigdata": "^3.289.0", "@middy/core": "4.2.6", "@types/aws-lambda": "^8.10.101", "aws-xray-sdk": "^3.3.3"