From 2d2b1354a1c0655abb51474ee600a02ebdd891c2 Mon Sep 17 00:00:00 2001 From: "Jason R. Stevens, CFA" Date: Tue, 26 Dec 2023 21:32:37 -0600 Subject: [PATCH 1/6] :white_check_mark: add crypto mock --- __mocks__/crypto.js | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 __mocks__/crypto.js diff --git a/__mocks__/crypto.js b/__mocks__/crypto.js new file mode 100644 index 0000000..c6c6bdf --- /dev/null +++ b/__mocks__/crypto.js @@ -0,0 +1,6 @@ +// __mocks__/crypto.js +const crypto = jest.createMockFromModule('crypto'); + +crypto.randomUUID = () => '123e4567-e89b-12d3-a456-426614174000'; + +module.exports = crypto; From 6684b3be4ff4d51e76f915d969e44b11d18151d9 Mon Sep 17 00:00:00 2001 From: "Jason R. Stevens, CFA" Date: Tue, 26 Dec 2023 21:32:41 -0600 Subject: [PATCH 2/6] :white_check_mark: add test for generateFilePath --- __tests__/utils.test.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 __tests__/utils.test.ts diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts new file mode 100644 index 0000000..93ac2b2 --- /dev/null +++ b/__tests__/utils.test.ts @@ -0,0 +1,18 @@ +import { generateFilePath } from '../src/utils'; // Adjust the import according to your file structure + +describe('generateFilePath', () => { + // Mocking the crypto module + jest.mock('crypto'); + it('should generate a correct file path based on the given file and promo ID', () => { + // Mocking a File object + const mockFile = new File([''], 'testfile.png', { type: 'image/png' }); + + const promoId = 'promo123'; + const expectedFileExtension = `.png`; + + const result = generateFilePath(mockFile, promoId); + + expect(result).toContain(expectedFileExtension); + expect(result).toContain(promoId); + }); +}); From 4fa8f7f79de6292fc9f9a434567d5a8460ff2b42 Mon Sep 17 00:00:00 2001 From: "Jason R. Stevens, CFA" Date: Tue, 26 Dec 2023 21:33:04 -0600 Subject: [PATCH 3/6] :sparkles: add generateFilePath func per #5 --- src/utils.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index 0d39a9f..7b37609 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -9,6 +9,7 @@ import { IMAGE_EXTENSIONS, VIDEO_EXTENSIONS } from './constants'; import defaultOptions from './defaultOptions'; +import crypto from 'crypto'; /** * A fetcher for useSwr * @@ -54,5 +55,22 @@ function detectMediaType(url: string) { function getOptions(options?: object | undefined) { return Object.assign(options || {}, defaultOptions); } + +/** + * generateFilePath + * + * @description Given a file and Promo ID, generate a proper file path. + * + * @param file A File object + * @param pid A string Promo ID + * + * @returns string File path + */ +function generateFilePath(file: File, pid: string) { + const mimeType = file.type; + let ext: string = mimeType.slice(6); + const uuid = crypto.randomUUID(); + return `${pid}/${uuid}.${ext}`; +} // Fall back to default handling -export { fetcher, detectMediaType, getOptions }; +export { fetcher, detectMediaType, getOptions, generateFilePath }; From c549dcfe881749b85ac7299b7a0932967401b81e Mon Sep 17 00:00:00 2001 From: "Jason R. Stevens, CFA" Date: Wed, 27 Dec 2023 11:05:03 -0600 Subject: [PATCH 4/6] :heavy_plus_sign: add aws sdk dependencies --- package.json | 2 + yarn.lock | 1088 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1088 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3215d51..c7e7443 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,8 @@ } ], "devDependencies": { + "@aws-sdk/client-s3": "^3.481.0", + "@aws-sdk/s3-request-presigner": "^3.481.0", "@size-limit/preset-small-lib": "^7.0.8", "@testing-library/react": "~12", "@tsconfig/create-react-app": "^1.0.2", diff --git a/yarn.lock b/yarn.lock index 0cf1b1e..f636297 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,6 +15,604 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@aws-crypto/crc32@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" + integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/crc32c@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz#016c92da559ef638a84a245eecb75c3e97cb664f" + integrity sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/ie11-detection@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" + integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/sha1-browser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz#f9083c00782b24714f528b1a1fef2174002266a3" + integrity sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-browser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" + integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/sha256-js" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" + integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + tslib "^1.11.1" + +"@aws-crypto/supports-web-crypto@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" + integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== + dependencies: + tslib "^1.11.1" + +"@aws-crypto/util@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" + integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + tslib "^1.11.1" + +"@aws-sdk/client-s3@^3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.481.0.tgz#121ad40970eb98ffeb6979ea4bc3bc0d21d6a58e" + integrity sha512-W4xpJRTuKKhQf1yCNPoErqAHize140LJf+YU+H60UB6rHy0uI52KJVSdMMKAghwAlAMLwmLWhKeMYWVpBOOtJw== + dependencies: + "@aws-crypto/sha1-browser" "3.0.0" + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.481.0" + "@aws-sdk/core" "3.481.0" + "@aws-sdk/credential-provider-node" "3.481.0" + "@aws-sdk/middleware-bucket-endpoint" "3.470.0" + "@aws-sdk/middleware-expect-continue" "3.468.0" + "@aws-sdk/middleware-flexible-checksums" "3.468.0" + "@aws-sdk/middleware-host-header" "3.468.0" + "@aws-sdk/middleware-location-constraint" "3.468.0" + "@aws-sdk/middleware-logger" "3.468.0" + "@aws-sdk/middleware-recursion-detection" "3.468.0" + "@aws-sdk/middleware-sdk-s3" "3.481.0" + "@aws-sdk/middleware-signing" "3.468.0" + "@aws-sdk/middleware-ssec" "3.468.0" + "@aws-sdk/middleware-user-agent" "3.478.0" + "@aws-sdk/region-config-resolver" "3.470.0" + "@aws-sdk/signature-v4-multi-region" "3.481.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.478.0" + "@aws-sdk/util-user-agent-browser" "3.468.0" + "@aws-sdk/util-user-agent-node" "3.470.0" + "@aws-sdk/xml-builder" "3.472.0" + "@smithy/config-resolver" "^2.0.21" + "@smithy/core" "^1.2.1" + "@smithy/eventstream-serde-browser" "^2.0.15" + "@smithy/eventstream-serde-config-resolver" "^2.0.15" + "@smithy/eventstream-serde-node" "^2.0.15" + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/hash-blob-browser" "^2.0.16" + "@smithy/hash-node" "^2.0.17" + "@smithy/hash-stream-node" "^2.0.17" + "@smithy/invalid-dependency" "^2.0.15" + "@smithy/md5-js" "^2.0.17" + "@smithy/middleware-content-length" "^2.0.17" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.25" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/protocol-http" "^3.0.11" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-body-length-browser" "^2.0.1" + "@smithy/util-body-length-node" "^2.1.0" + "@smithy/util-defaults-mode-browser" "^2.0.23" + "@smithy/util-defaults-mode-node" "^2.0.30" + "@smithy/util-endpoints" "^1.0.7" + "@smithy/util-retry" "^2.0.8" + "@smithy/util-stream" "^2.0.23" + "@smithy/util-utf8" "^2.0.2" + "@smithy/util-waiter" "^2.0.15" + fast-xml-parser "4.2.5" + tslib "^2.5.0" + +"@aws-sdk/client-sso@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.481.0.tgz#5d484dfa202eac580db984bb2c9cf52203b9a985" + integrity sha512-d+crFfW8HSDXa68MSfMDX6LH0J22P29SxJW4IGgRZKwHWEaSf4UjOP0mjA4V26R50suAV052/WBY6LjtGsZsHg== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/core" "3.481.0" + "@aws-sdk/middleware-host-header" "3.468.0" + "@aws-sdk/middleware-logger" "3.468.0" + "@aws-sdk/middleware-recursion-detection" "3.468.0" + "@aws-sdk/middleware-user-agent" "3.478.0" + "@aws-sdk/region-config-resolver" "3.470.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.478.0" + "@aws-sdk/util-user-agent-browser" "3.468.0" + "@aws-sdk/util-user-agent-node" "3.470.0" + "@smithy/config-resolver" "^2.0.21" + "@smithy/core" "^1.2.1" + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/hash-node" "^2.0.17" + "@smithy/invalid-dependency" "^2.0.15" + "@smithy/middleware-content-length" "^2.0.17" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.25" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/protocol-http" "^3.0.11" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-body-length-browser" "^2.0.1" + "@smithy/util-body-length-node" "^2.1.0" + "@smithy/util-defaults-mode-browser" "^2.0.23" + "@smithy/util-defaults-mode-node" "^2.0.30" + "@smithy/util-endpoints" "^1.0.7" + "@smithy/util-retry" "^2.0.8" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@aws-sdk/client-sts@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.481.0.tgz#4aa7d1d5fff175b3b9e30dd891cd8b7e127c997f" + integrity sha512-GSnJiceKpwLSEW5q2KRu9zHNJgtYysiy9Xkey0EKLKCdDRdM62yCJEFerAbvRRVJsF2LTSrmBmUl2zWB5RT8mw== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/core" "3.481.0" + "@aws-sdk/credential-provider-node" "3.481.0" + "@aws-sdk/middleware-host-header" "3.468.0" + "@aws-sdk/middleware-logger" "3.468.0" + "@aws-sdk/middleware-recursion-detection" "3.468.0" + "@aws-sdk/middleware-user-agent" "3.478.0" + "@aws-sdk/region-config-resolver" "3.470.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.478.0" + "@aws-sdk/util-user-agent-browser" "3.468.0" + "@aws-sdk/util-user-agent-node" "3.470.0" + "@smithy/config-resolver" "^2.0.21" + "@smithy/core" "^1.2.1" + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/hash-node" "^2.0.17" + "@smithy/invalid-dependency" "^2.0.15" + "@smithy/middleware-content-length" "^2.0.17" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.25" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/protocol-http" "^3.0.11" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-body-length-browser" "^2.0.1" + "@smithy/util-body-length-node" "^2.1.0" + "@smithy/util-defaults-mode-browser" "^2.0.23" + "@smithy/util-defaults-mode-node" "^2.0.30" + "@smithy/util-endpoints" "^1.0.7" + "@smithy/util-middleware" "^2.0.8" + "@smithy/util-retry" "^2.0.8" + "@smithy/util-utf8" "^2.0.2" + fast-xml-parser "4.2.5" + tslib "^2.5.0" + +"@aws-sdk/core@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.481.0.tgz#e0ed1c1e8dc322237f81f0442ba0f8fbb20ef76f" + integrity sha512-UeyAc2FnWQDts81vPVBWKEj0WagYK4SVAgNfGcg6zCzzqsUG4unr4NPKQoca2L+XOU55yMCy+5l2K6R3YsFGKg== + dependencies: + "@smithy/core" "^1.2.1" + "@smithy/protocol-http" "^3.0.11" + "@smithy/signature-v4" "^2.0.0" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-env@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz#4196d717d3f5485af863bd1fd84374ea3dcd6210" + integrity sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-ini@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.481.0.tgz#02300c2f044c88749790bdfba74d99131234cf9c" + integrity sha512-QXMlILewLV/yQHkyjXsu7PhvmTZIDAaQ4uAfhjnqbH1B8mErRpZKkzHWwp4yeZdTcHfenTVqoTnx9WDa+SnK/Q== + dependencies: + "@aws-sdk/credential-provider-env" "3.468.0" + "@aws-sdk/credential-provider-process" "3.468.0" + "@aws-sdk/credential-provider-sso" "3.481.0" + "@aws-sdk/credential-provider-web-identity" "3.468.0" + "@aws-sdk/types" "3.468.0" + "@smithy/credential-provider-imds" "^2.0.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-node@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.481.0.tgz#3bcc2577bb89ac2123f583e5d9b2d60e5dbea3b3" + integrity sha512-148Ztn2FjlS3VdGWJnAMjuXiZ55/tD823I/koawgp80LnDqMiKfmSGAioXIikqaBHl40K7ZvtBMqP/n/6GM41A== + dependencies: + "@aws-sdk/credential-provider-env" "3.468.0" + "@aws-sdk/credential-provider-ini" "3.481.0" + "@aws-sdk/credential-provider-process" "3.468.0" + "@aws-sdk/credential-provider-sso" "3.481.0" + "@aws-sdk/credential-provider-web-identity" "3.468.0" + "@aws-sdk/types" "3.468.0" + "@smithy/credential-provider-imds" "^2.0.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-process@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz#770ed72db036c5d011445e5abf4a4bcc4424c486" + integrity sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-sso@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.481.0.tgz#0a5b37407a087df0f1a1aaf181d94555807b0e9b" + integrity sha512-3MrSIQPQDOxhZDppC2XpOLVfuUm7iqRfTrwjSYGeWc//pUZtUI7nMXYjEDL+li5gvasw1lYfYX3VHNdwNnvyOQ== + dependencies: + "@aws-sdk/client-sso" "3.481.0" + "@aws-sdk/token-providers" "3.481.0" + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/credential-provider-web-identity@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz#5befcb593d99a84e16af9e9f285f0d59ed42771f" + integrity sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-bucket-endpoint@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.470.0.tgz#76a6dde27e791ec8fad798dd5d53789b876498c3" + integrity sha512-vLXXNWtsRmEIwzJ9HUQfIuTNAsEzvCv0Icsnkvt2BiBZXnmHdp2vIC3e3+kfy1D7dVQloXqMmnfcLu/BUMu2Jw== + dependencies: + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-arn-parser" "3.465.0" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + "@smithy/util-config-provider" "^2.0.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-expect-continue@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.468.0.tgz#664f7f1238e7bfb633cd44753f8cfb1a62ac624a" + integrity sha512-/wmLjmfgeulxhhmnxX3X3N933TvGsYckVIFjAtDSpLjqkbwzEcNiLq7AdmNJ4BfxG0MCMgcht561DCCD19x8Bg== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-flexible-checksums@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.468.0.tgz#96e26042e61724a4981edb3ba3fd2af280df57b6" + integrity sha512-LQwL/N5MCj3Y5keLLewHTqeAXUIMsHFZyxDXRm/uxrOon9ufLKDvGvzAmfwn1/CuSUo66ZfT8VPSA4BsC90RtA== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@aws-crypto/crc32c" "3.0.0" + "@aws-sdk/types" "3.468.0" + "@smithy/is-array-buffer" "^2.0.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@aws-sdk/middleware-host-header@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz#6da7b19032e9afccea54fbf8aa10cccd2f817bcf" + integrity sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-location-constraint@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.468.0.tgz#cc9ebcdabed96414fc91f4a39b3b7c08e6374187" + integrity sha512-0gBX/lDynQr4YIhM9h1dVnkVWqrg+34iOCVIUq8jHxzUzgZWglGkG9lHGGg0r1xkLTmegeoo1OKH8wrQ6n33Cg== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-logger@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz#a1883fb7ad8e156444d30689de4ab897357ef1d8" + integrity sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-recursion-detection@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz#85b05636a5c2638bf9e15c8b6be17654757e1bf4" + integrity sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-sdk-s3@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.481.0.tgz#e16c145c85b12c5e917fed1fffce05b8677fc854" + integrity sha512-LOFXtxZOnU75vB5rL5/rOjSrYrbk/kqJGbnQJywHQosAiPKSVw9BR/6Q6tQIDDvtMYsVqMB7Db5SzA64hr80Rg== + dependencies: + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-arn-parser" "3.465.0" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/protocol-http" "^3.0.11" + "@smithy/signature-v4" "^2.0.0" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + "@smithy/util-config-provider" "^2.0.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-signing@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz#d1b5a92c395f55063cfa72ee95e4921b16f4c515" + integrity sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/property-provider" "^2.0.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/signature-v4" "^2.0.0" + "@smithy/types" "^2.7.0" + "@smithy/util-middleware" "^2.0.8" + tslib "^2.5.0" + +"@aws-sdk/middleware-ssec@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.468.0.tgz#8fe4ccfd6f0689b77b230ce17e44438d1ce1b419" + integrity sha512-y1qLW24wRkOGBTK5d6eJXf6d8HYo4rzT4a1mNDN1rd18NSffwQ6Yke5qeUiIaxa0y/l+FvvNYErbhYtij2rJoQ== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/middleware-user-agent@3.478.0": + version "3.478.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.478.0.tgz#5b98d02ccaa8db880fb59096e5389960c4262fbe" + integrity sha512-Rec+nAPIzzwxgHPW+xqY6tooJGFOytpYg/xSRv8/IXl3xKGhmpMGs6gDWzmMBv/qy5nKTvLph/csNWJ98GWXCw== + dependencies: + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.478.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/region-config-resolver@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz#74e5c5f7a5633ad8c482503bf940a9330bd1cd09" + integrity sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/types" "^2.7.0" + "@smithy/util-config-provider" "^2.0.0" + "@smithy/util-middleware" "^2.0.8" + tslib "^2.5.0" + +"@aws-sdk/s3-request-presigner@^3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.481.0.tgz#caf2fb197515d62c6b2d7359beadc6896e516d8d" + integrity sha512-o4ySdoFLpYGVwnNJ2ktP2Y/9AegQmrbRBhXvkUexRX3xctZfiL2UEjunGh3JfHOxw1O1DSM8ZI5GiE9iDNgpbQ== + dependencies: + "@aws-sdk/signature-v4-multi-region" "3.481.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-format-url" "3.468.0" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/protocol-http" "^3.0.11" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/signature-v4-multi-region@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.481.0.tgz#8c9b4fbe5fa7f7a9852e7f3b1e180ab6c1b830ae" + integrity sha512-bNQ+5Gb3c6a+AiR4D9o0olPjPkGal8Dqvq4Mt0vWQ+ZOzzKEZZDSjpCMUdkhm3ezYIFr9rnCmQOpTtyf3/KDVg== + dependencies: + "@aws-sdk/middleware-sdk-s3" "3.481.0" + "@aws-sdk/types" "3.468.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/signature-v4" "^2.0.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/token-providers@3.481.0": + version "3.481.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.481.0.tgz#d10f86a3c3d61ee2917c70ecc43923d6d2a3d263" + integrity sha512-G4ObHF2A/FlvQG7Lb/2sjuklG89IiH3TI1EiNZSzgu6TvY904Js72Slldls4VeJLY2zAnZgyZ9903pBMkDrcxQ== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/middleware-host-header" "3.468.0" + "@aws-sdk/middleware-logger" "3.468.0" + "@aws-sdk/middleware-recursion-detection" "3.468.0" + "@aws-sdk/middleware-user-agent" "3.478.0" + "@aws-sdk/region-config-resolver" "3.470.0" + "@aws-sdk/types" "3.468.0" + "@aws-sdk/util-endpoints" "3.478.0" + "@aws-sdk/util-user-agent-browser" "3.468.0" + "@aws-sdk/util-user-agent-node" "3.470.0" + "@smithy/config-resolver" "^2.0.21" + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/hash-node" "^2.0.17" + "@smithy/invalid-dependency" "^2.0.15" + "@smithy/middleware-content-length" "^2.0.17" + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.25" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/property-provider" "^2.0.0" + "@smithy/protocol-http" "^3.0.11" + "@smithy/shared-ini-file-loader" "^2.0.6" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-body-length-browser" "^2.0.1" + "@smithy/util-body-length-node" "^2.1.0" + "@smithy/util-defaults-mode-browser" "^2.0.23" + "@smithy/util-defaults-mode-node" "^2.0.30" + "@smithy/util-endpoints" "^1.0.7" + "@smithy/util-retry" "^2.0.8" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@aws-sdk/types@3.468.0", "@aws-sdk/types@^3.222.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.468.0.tgz#f97b34fc92a800d1d8b866f47693ae8f3d46517b" + integrity sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/util-arn-parser@3.465.0": + version "3.465.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.465.0.tgz#2896f6b06f69770378586853c97a0f283cbb2e20" + integrity sha512-zOJ82vzDJFqBX9yZBlNeHHrul/kpx/DCoxzW5UBbZeb26kfV53QhMSoEmY8/lEbBqlqargJ/sgRC845GFhHNQw== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-endpoints@3.478.0": + version "3.478.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.478.0.tgz#d39c5667f22a7cbd2af93cdd6d883d25ef84e374" + integrity sha512-u9Mcg3euGJGs5clPt9mBuhBjHiEKiD0PnfvArhfq9i+dcY5mbCq/i1Dezp3iv1fZH9xxQt7hPXDfSpt1yUSM6g== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/util-endpoints" "^1.0.7" + tslib "^2.5.0" + +"@aws-sdk/util-format-url@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.468.0.tgz#1376e36173321da42a58aa3bc30f008e9074c37f" + integrity sha512-CtHApPmudJz/Z2MHVogWfkaSw4wWHQKVLQs4Q5XjvLcDSzODzxHbiOIckFCXQm2Mme4+TTe4GFU9g869ufegXg== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/querystring-builder" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.465.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.465.0.tgz#0471428fb5eb749d4b72c427f5726f7b61fb90eb" + integrity sha512-f+QNcWGswredzC1ExNAB/QzODlxwaTdXkNT5cvke2RLX8SFU5pYk6h4uCtWC0vWPELzOfMfloBrJefBzlarhsw== + dependencies: + tslib "^2.5.0" + +"@aws-sdk/util-user-agent-browser@3.468.0": + version "3.468.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz#095caecb3fd75104ee38ae81ed78821de0f58e28" + integrity sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/types" "^2.7.0" + bowser "^2.11.0" + tslib "^2.5.0" + +"@aws-sdk/util-user-agent-node@3.470.0": + version "3.470.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz#b78605f336859d6c3b5f573cff931ce41f83a27d" + integrity sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ== + dependencies: + "@aws-sdk/types" "3.468.0" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@aws-sdk/util-utf8-browser@^3.0.0": + version "3.259.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== + dependencies: + tslib "^2.3.1" + +"@aws-sdk/xml-builder@3.472.0": + version "3.472.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.472.0.tgz#fe804e26517779868f7093e361dce4816be546d6" + integrity sha512-PwjVxz1hr9up8QkddabuScPZ/d5aDHgvHYgK4acHYzltXL4wngfvimi5ZqXTzVWF2QANxHmWnHUr45QJX71oJQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" @@ -1446,6 +2044,470 @@ "@size-limit/esbuild" "7.0.8" "@size-limit/file" "7.0.8" +"@smithy/abort-controller@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-2.0.15.tgz#fcec9193da8b86eef1eedc3e71139a99c061db32" + integrity sha512-JkS36PIS3/UCbq/MaozzV7jECeL+BTt4R75bwY8i+4RASys4xOyUS1HsRyUNSqUXFP4QyCz5aNnh3ltuaxv+pw== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/chunked-blob-reader-native@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz#0599eaed8c2cd15c7ab43a1838cef1258ff27133" + integrity sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw== + dependencies: + "@smithy/util-base64" "^2.0.1" + tslib "^2.5.0" + +"@smithy/chunked-blob-reader@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz#c44fe2c780eaf77f9e5381d982ac99a880cce51b" + integrity sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg== + dependencies: + tslib "^2.5.0" + +"@smithy/config-resolver@^2.0.21": + version "2.0.21" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-2.0.21.tgz#97cb1c71f3c8c453fb01169545f98414b3414d7f" + integrity sha512-rlLIGT+BeqjnA6C2FWumPRJS1UW07iU5ZxDHtFuyam4W65gIaOFMjkB90ofKCIh+0mLVQrQFrl/VLtQT/6FWTA== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/types" "^2.7.0" + "@smithy/util-config-provider" "^2.0.0" + "@smithy/util-middleware" "^2.0.8" + tslib "^2.5.0" + +"@smithy/core@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-1.2.1.tgz#2ee9b9894f3b2ce5eac4010ea1a85874b446f203" + integrity sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw== + dependencies: + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-retry" "^2.0.25" + "@smithy/middleware-serde" "^2.0.15" + "@smithy/protocol-http" "^3.0.11" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + "@smithy/util-middleware" "^2.0.8" + tslib "^2.5.0" + +"@smithy/credential-provider-imds@^2.0.0", "@smithy/credential-provider-imds@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.4.tgz#126adf69eac333f23f8683edbfabdc2b3b2deb15" + integrity sha512-cwPJN1fa1YOQzhBlTXRavABEYRRchci1X79QRwzaNLySnIMJfztyv1Zkst0iZPLMnpn8+CnHu3wOHS11J5Dr3A== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/property-provider" "^2.0.16" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + tslib "^2.5.0" + +"@smithy/eventstream-codec@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.0.15.tgz#733e638fd38e7e264bc0429dbda139bab950bd25" + integrity sha512-crjvz3j1gGPwA0us6cwS7+5gAn35CTmqu/oIxVbYJo2Qm/sGAye6zGJnMDk3BKhWZw5kcU1G4MxciTkuBpOZPg== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@smithy/types" "^2.7.0" + "@smithy/util-hex-encoding" "^2.0.0" + tslib "^2.5.0" + +"@smithy/eventstream-serde-browser@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.15.tgz#f62c891e6f8ad59f552a92d8aa14eb6b4541d418" + integrity sha512-WiFG5N9j3jmS5P0z5Xev6dO0c3lf7EJYC2Ncb0xDnWFvShwXNn741AF71ABr5EcZw8F4rQma0362MMjAwJeZog== + dependencies: + "@smithy/eventstream-serde-universal" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/eventstream-serde-config-resolver@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.15.tgz#50e98c59aeb31a0702bad5dfab4009a15fc8b3bf" + integrity sha512-o65d2LRjgCbWYH+VVNlWXtmsI231SO99ZTOL4UuIPa6WTjbSHWtlXvUcJG9libhEKWmEV9DIUiH2IqyPWi7ubA== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/eventstream-serde-node@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.15.tgz#8be1bd024048adcff4ccbb723c55fc42ce582d33" + integrity sha512-9OOXiIhHq1VeOG6xdHkn2ZayfMYM3vzdUTV3zhcCnt+tMqA3BJK3XXTJFRR2BV28rtRM778DzqbBTf+hqwQPTg== + dependencies: + "@smithy/eventstream-serde-universal" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/eventstream-serde-universal@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.15.tgz#85cdff39abc630cb18b4d333913b7120651771ca" + integrity sha512-dP8AQp/pXlWBjvL0TaPBJC3rM0GoYv7O0Uim8d/7UKZ2Wo13bFI3/BhQfY/1DeiP1m23iCHFNFtOQxfQNBB8rQ== + dependencies: + "@smithy/eventstream-codec" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/fetch-http-handler@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.1.tgz#aa055db5bf4d78acec97abe6ef24283fa2c18430" + integrity sha512-6MNk16fqb8EwcYY8O8WxB3ArFkLZ2XppsSNo1h7SQcFdDDwIumiJeO6wRzm7iB68xvsOQzsdQKbdtTieS3hfSQ== + dependencies: + "@smithy/protocol-http" "^3.0.11" + "@smithy/querystring-builder" "^2.0.15" + "@smithy/types" "^2.7.0" + "@smithy/util-base64" "^2.0.1" + tslib "^2.5.0" + +"@smithy/hash-blob-browser@^2.0.16": + version "2.0.16" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.16.tgz#6cd3686e79f3c8d96a129076073bf20d06293152" + integrity sha512-cSYRi05LA7DZDwjB1HL0BP8B56eUNNeLglVH147QTXFyuXJq/7erAIiLRfsyXB8+GfFHkSS5BHbc76a7k/AYPA== + dependencies: + "@smithy/chunked-blob-reader" "^2.0.0" + "@smithy/chunked-blob-reader-native" "^2.0.1" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/hash-node@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-2.0.17.tgz#9ce5e3f137143e3658759d31a16e068ef94a14fc" + integrity sha512-Il6WuBcI1nD+e2DM7tTADMf01wEPGK8PAhz4D+YmDUVaoBqlA+CaH2uDJhiySifmuKBZj748IfygXty81znKhw== + dependencies: + "@smithy/types" "^2.7.0" + "@smithy/util-buffer-from" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@smithy/hash-stream-node@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-2.0.17.tgz#90375ed9c1a586118433c925a61d39b5555bf284" + integrity sha512-ey8DtnATzp1mOXgS7rqMwSmAki6iJA+jgNucKcxRkhMB1rrICfHg+rhmIF50iLPDHUhTcS5pBMOrLzzpZftvNQ== + dependencies: + "@smithy/types" "^2.7.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@smithy/invalid-dependency@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-2.0.15.tgz#7653490047bf0ab6042fb812adfbcce857aa2d06" + integrity sha512-dlEKBFFwVfzA5QroHlBS94NpgYjXhwN/bFfun+7w3rgxNvVy79SK0w05iGc7UAeC5t+D7gBxrzdnD6hreZnDVQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/is-array-buffer@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz#8fa9b8040651e7ba0b2f6106e636a91354ff7d34" + integrity sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug== + dependencies: + tslib "^2.5.0" + +"@smithy/md5-js@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-2.0.17.tgz#784c02da6cee539f5af0e45b1eaf9beb10ed8ad6" + integrity sha512-jmISTCnEkOnm2oCNx/rMkvBT/eQh3aA6nktevkzbmn/VYqYEuc5Z2n5sTTqsciMSO01Lvf56wG1A4twDqovYeQ== + dependencies: + "@smithy/types" "^2.7.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@smithy/middleware-content-length@^2.0.17": + version "2.0.17" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-2.0.17.tgz#13479173a15d1cd4224e3e21071a27c66a74b653" + integrity sha512-OyadvMcKC7lFXTNBa8/foEv7jOaqshQZkjWS9coEXPRZnNnihU/Ls+8ZuJwGNCOrN2WxXZFmDWhegbnM4vak8w== + dependencies: + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/middleware-endpoint@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.3.tgz#4069ab6e8d1b485bc0d2384b30f7b37096111ec2" + integrity sha512-nYfxuq0S/xoAjdLbyn1ixeVB6cyH9wYCMtbbOCpcCRYR5u2mMtqUtVjjPAZ/DIdlK3qe0tpB0Q76szFGNuz+kQ== + dependencies: + "@smithy/middleware-serde" "^2.0.15" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/shared-ini-file-loader" "^2.2.7" + "@smithy/types" "^2.7.0" + "@smithy/url-parser" "^2.0.15" + "@smithy/util-middleware" "^2.0.8" + tslib "^2.5.0" + +"@smithy/middleware-retry@^2.0.25": + version "2.0.25" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz#ae948f4a1ad5968bc315f07df930a55c09ffe040" + integrity sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/protocol-http" "^3.0.11" + "@smithy/service-error-classification" "^2.0.8" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + "@smithy/util-middleware" "^2.0.8" + "@smithy/util-retry" "^2.0.8" + tslib "^2.5.0" + uuid "^8.3.2" + +"@smithy/middleware-serde@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-2.0.15.tgz#9deac4daad1f2a60d5c4e7097658f9ae2eb0a33f" + integrity sha512-FOZRFk/zN4AT4wzGuBY+39XWe+ZnCFd0gZtyw3f9Okn2CJPixl9GyWe98TIaljeZdqWkgrzGyPre20AcW2UMHQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/middleware-stack@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-2.0.9.tgz#60e51697c74258fac087bc739d940f524921a15f" + integrity sha512-bCB5dUtGQ5wh7QNL2ELxmDc6g7ih7jWU3Kx6MYH1h4mZbv9xL3WyhKHojRltThCB1arLPyTUFDi+x6fB/oabtA== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/node-config-provider@^2.1.8": + version "2.1.8" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-2.1.8.tgz#8cab8f1172c8cd1146e7997292786909abcae763" + integrity sha512-+w26OKakaBUGp+UG+dxYZtFb5fs3tgHg3/QrRrmUZj+rl3cIuw840vFUXX35cVPTUCQIiTqmz7CpVF7+hdINdQ== + dependencies: + "@smithy/property-provider" "^2.0.16" + "@smithy/shared-ini-file-loader" "^2.2.7" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/node-http-handler@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-2.2.1.tgz#23f6540e565edcae8c558a854fffde3d003451c0" + integrity sha512-8iAKQrC8+VFHPAT8pg4/j6hlsTQh+NKOWlctJBrYtQa4ExcxX7aSg3vdQ2XLoYwJotFUurg/NLqFCmZaPRrogw== + dependencies: + "@smithy/abort-controller" "^2.0.15" + "@smithy/protocol-http" "^3.0.11" + "@smithy/querystring-builder" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/property-provider@^2.0.0", "@smithy/property-provider@^2.0.16": + version "2.0.16" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-2.0.16.tgz#0c15ea8a3e8c8e7012bf5877c79ce754f7d2c06e" + integrity sha512-28Ky0LlOqtEjwg5CdHmwwaDRHcTWfPRzkT6HrhwOSRS2RryAvuDfJrZpM+BMcrdeCyEg1mbcgIMoqTla+rdL8Q== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/protocol-http@^3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-3.0.11.tgz#a9ea712fe7cc3375378ac68d9168a7b6cd0b6f65" + integrity sha512-3ziB8fHuXIRamV/akp/sqiWmNPR6X+9SB8Xxnozzj+Nq7hSpyKdFHd1FLpBkgfGFUTzzcBJQlDZPSyxzmdcx5A== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/querystring-builder@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-2.0.15.tgz#aa8c889bcaef274b8345be4ddabae3bfedf2cf33" + integrity sha512-e1q85aT6HutvouOdN+dMsN0jcdshp50PSCvxDvo6aIM57LqeXimjfONUEgfqQ4IFpYWAtVixptyIRE5frMp/2A== + dependencies: + "@smithy/types" "^2.7.0" + "@smithy/util-uri-escape" "^2.0.0" + tslib "^2.5.0" + +"@smithy/querystring-parser@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-2.0.15.tgz#46c8806a145f46636e4aee2a5d79e7ba68161a4c" + integrity sha512-jbBvoK3cc81Cj1c1TH1qMYxNQKHrYQ2DoTntN9FBbtUWcGhc+T4FP6kCKYwRLXyU4AajwGIZstvNAmIEgUUNTQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/service-error-classification@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-2.0.8.tgz#c9e421312a2def84da025c5efe6de06679c5be95" + integrity sha512-jCw9+005im8tsfYvwwSc4TTvd29kXRFkH9peQBg5R/4DD03ieGm6v6Hpv9nIAh98GwgYg1KrztcINC1s4o7/hg== + dependencies: + "@smithy/types" "^2.7.0" + +"@smithy/shared-ini-file-loader@^2.0.6", "@smithy/shared-ini-file-loader@^2.2.7": + version "2.2.7" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.7.tgz#4a3bd469703d02c3cc8e36dcba2238c06efa12cb" + integrity sha512-0Qt5CuiogIuvQIfK+be7oVHcPsayLgfLJGkPlbgdbl0lD28nUKu4p11L+UG3SAEsqc9UsazO+nErPXw7+IgDpQ== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/signature-v4@^2.0.0": + version "2.0.18" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.0.18.tgz#53b78b238edaa84cc8d61faf67d2b3c926cdd698" + integrity sha512-SJRAj9jT/l9ocm8D0GojMbnA1sp7I4JeStOQ4lEXI8A5eHE73vbjlzlqIFB7cLvIgau0oUl4cGVpF9IGCrvjlw== + dependencies: + "@smithy/eventstream-codec" "^2.0.15" + "@smithy/is-array-buffer" "^2.0.0" + "@smithy/types" "^2.7.0" + "@smithy/util-hex-encoding" "^2.0.0" + "@smithy/util-middleware" "^2.0.8" + "@smithy/util-uri-escape" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@smithy/smithy-client@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-2.2.0.tgz#9865981a2f49dd0e9ef68193aebcd5654cdd7f00" + integrity sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q== + dependencies: + "@smithy/middleware-endpoint" "^2.2.3" + "@smithy/middleware-stack" "^2.0.9" + "@smithy/protocol-http" "^3.0.11" + "@smithy/types" "^2.7.0" + "@smithy/util-stream" "^2.0.23" + tslib "^2.5.0" + +"@smithy/types@^2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.7.0.tgz#6ed9ba5bff7c4d28c980cff967e6d8456840a4f3" + integrity sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw== + dependencies: + tslib "^2.5.0" + +"@smithy/url-parser@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-2.0.15.tgz#878d9b61f9eac8834cb611cf1a8a0e5d9a48038c" + integrity sha512-sADUncUj9rNbOTrdDGm4EXlUs0eQ9dyEo+V74PJoULY4jSQxS+9gwEgsPYyiu8PUOv16JC/MpHonOgqP/IEDZA== + dependencies: + "@smithy/querystring-parser" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-base64@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-2.0.1.tgz#57f782dafc187eddea7c8a1ff2a7c188ed1a02c4" + integrity sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ== + dependencies: + "@smithy/util-buffer-from" "^2.0.0" + tslib "^2.5.0" + +"@smithy/util-body-length-browser@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz#424485cc81c640d18c17c683e0e6edb57e8e2ab9" + integrity sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ== + dependencies: + tslib "^2.5.0" + +"@smithy/util-body-length-node@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz#313a5f7c5017947baf5fa018bfc22628904bbcfa" + integrity sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw== + dependencies: + tslib "^2.5.0" + +"@smithy/util-buffer-from@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz#7eb75d72288b6b3001bc5f75b48b711513091deb" + integrity sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw== + dependencies: + "@smithy/is-array-buffer" "^2.0.0" + tslib "^2.5.0" + +"@smithy/util-config-provider@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz#4dd6a793605559d94267312fd06d0f58784b4c38" + integrity sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg== + dependencies: + tslib "^2.5.0" + +"@smithy/util-defaults-mode-browser@^2.0.23": + version "2.0.23" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz#27bce42b7a55974ed4aff5b2b870256ce383613a" + integrity sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w== + dependencies: + "@smithy/property-provider" "^2.0.16" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + bowser "^2.11.0" + tslib "^2.5.0" + +"@smithy/util-defaults-mode-node@^2.0.30": + version "2.0.30" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.30.tgz#12c4c737a9f8b151cfbd951348cdf94febd083dd" + integrity sha512-nmcmEyRlClNprp7mBnUzfmW6HrKQK+yvl+cyXCRUoQSxRvZuLDrztV+JD+zr3qV/oirEc4Q0QNIrrhTDCE6JeA== + dependencies: + "@smithy/config-resolver" "^2.0.21" + "@smithy/credential-provider-imds" "^2.1.4" + "@smithy/node-config-provider" "^2.1.8" + "@smithy/property-provider" "^2.0.16" + "@smithy/smithy-client" "^2.2.0" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-endpoints@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-1.0.7.tgz#5a258ac7838dea085660060b515cd2d19f19a4bc" + integrity sha512-Q2gEind3jxoLk6hdKWyESMU7LnXz8aamVwM+VeVjOYzYT1PalGlY/ETa48hv2YpV4+YV604y93YngyzzzQ4IIA== + dependencies: + "@smithy/node-config-provider" "^2.1.8" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-hex-encoding@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz#0aa3515acd2b005c6d55675e377080a7c513b59e" + integrity sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA== + dependencies: + tslib "^2.5.0" + +"@smithy/util-middleware@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-2.0.8.tgz#2ec1da1190d09b69512ce0248ebd5e819e3c8a92" + integrity sha512-qkvqQjM8fRGGA8P2ydWylMhenCDP8VlkPn8kiNuFEaFz9xnUKC2irfqsBSJrfrOB9Qt6pQsI58r3zvvumhFMkw== + dependencies: + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-retry@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-2.0.8.tgz#61f8db11e4fe60975cb9fb2eada173f5024a06f3" + integrity sha512-cQTPnVaVFMjjS6cb44WV2yXtHVyXDC5icKyIbejMarJEApYeJWpBU3LINTxHqp/tyLI+MZOUdosr2mZ3sdziNg== + dependencies: + "@smithy/service-error-classification" "^2.0.8" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + +"@smithy/util-stream@^2.0.23": + version "2.0.23" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-2.0.23.tgz#468ad29913d091092317cfea2d8ac5b866326a07" + integrity sha512-OJMWq99LAZJUzUwTk+00plyxX3ESktBaGPhqNIEVab+53gLULiWN9B/8bRABLg0K6R6Xg4t80uRdhk3B/LZqMQ== + dependencies: + "@smithy/fetch-http-handler" "^2.3.1" + "@smithy/node-http-handler" "^2.2.1" + "@smithy/types" "^2.7.0" + "@smithy/util-base64" "^2.0.1" + "@smithy/util-buffer-from" "^2.0.0" + "@smithy/util-hex-encoding" "^2.0.0" + "@smithy/util-utf8" "^2.0.2" + tslib "^2.5.0" + +"@smithy/util-uri-escape@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz#19955b1a0f517a87ae77ac729e0e411963dfda95" + integrity sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw== + dependencies: + tslib "^2.5.0" + +"@smithy/util-utf8@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.0.2.tgz#626b3e173ad137208e27ed329d6bea70f4a1a7f7" + integrity sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA== + dependencies: + "@smithy/util-buffer-from" "^2.0.0" + tslib "^2.5.0" + +"@smithy/util-waiter@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-2.0.15.tgz#b02a42bf1b82f07973d1756a0ee10fafa1fbf58e" + integrity sha512-9Y+btzzB7MhLADW7xgD6SjvmoYaRkrb/9SCbNGmNdfO47v38rxb90IGXyDtAK0Shl9bMthTmLgjlfYc+vtz2Qw== + dependencies: + "@smithy/abort-controller" "^2.0.15" + "@smithy/types" "^2.7.0" + tslib "^2.5.0" + "@testing-library/dom@^8.0.0": version "8.20.1" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" @@ -2234,6 +3296,11 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3641,6 +4708,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz#a6747a09296a6cb34f2ae634019bf1738f3b421f" + integrity sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g== + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.16.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" @@ -6763,6 +7837,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + style-inject@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" @@ -6969,12 +8048,12 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1: +tslib@^1.11.1, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1: +tslib@^2.0.3, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -7140,6 +8219,11 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" From 2b8a6a03d92b950c55cb1192c560af25deafa73c Mon Sep 17 00:00:00 2001 From: "Jason R. Stevens, CFA" Date: Wed, 27 Dec 2023 11:05:06 -0600 Subject: [PATCH 5/6] :sparkles: add storage module for necessary bucket creation, reading, and uploading functionality #5 --- __tests__/storage.test.ts | 128 ++++++++++++++++++++++++++++++++++++++ src/storage.ts | 100 +++++++++++++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 __tests__/storage.test.ts create mode 100644 src/storage.ts diff --git a/__tests__/storage.test.ts b/__tests__/storage.test.ts new file mode 100644 index 0000000..e74df80 --- /dev/null +++ b/__tests__/storage.test.ts @@ -0,0 +1,128 @@ +import { + uploadMedia, + getS3Client, + getS3PutUrl, + getS3ReadUrl, +} from '../src/storage'; +import { + S3Client, + PutObjectCommand, + GetObjectCommand, +} from '@aws-sdk/client-s3'; +import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +jest.mock('@aws-sdk/client-s3', () => { + return { + S3Client: jest.fn(), + PutObjectCommand: jest.fn(), + GetObjectCommand: jest.fn(), + }; +}); +jest.mock('../src/utils', () => { + return { + generateFilePath: jest.fn(() => 'pid/mockPath'), + }; +}); +jest.mock('@aws-sdk/s3-request-presigner', () => { + return { + getSignedUrl: jest.fn(() => Promise.resolve('mockSignedUrl')), + }; +}); + +describe('uploadMedia', () => { + it('should upload media and return the upload status and URL', async () => { + // Mock the fetch function + global.fetch = jest.fn().mockImplementation((url, options) => { + if (url.includes('/api/media')) { + return Promise.resolve({ + json: () => + Promise.resolve({ putUrl: 'mockPutUrl', getUrl: 'mockGetUrl' }), + }); + } + return Promise.resolve({ ok: true }); + }); + + const mockFile = new File([''], 'testfile.png', { type: 'image/png' }); + const result = await uploadMedia('http://backendRoute', mockFile); + + expect(result).toEqual({ status: true, uploadedUrl: 'mockGetUrl' }); + expect(fetch).toHaveBeenCalledTimes(2); + }); + + it('should throw an error when the fetch to the backend fails', async () => { + // Mock the fetch function to simulate a failure + global.fetch = jest + .fn() + .mockImplementation(() => Promise.reject(new Error('Network failure'))); + + const mockFile = new File([''], 'testfile.png', { type: 'image/png' }); + + await expect(uploadMedia('http://backendRoute', mockFile)).rejects.toThrow( + 'Network failure' + ); + + expect(fetch).toHaveBeenCalledWith(expect.any(String), expect.any(Object)); + }); +}); + +describe('getS3Client', () => { + it('should create an S3 client with specified region and credentials', () => { + const mockCredentials = { accessKeyId: 'key', secretAccessKey: 'secret' }; + const client = getS3Client('us-west-2', mockCredentials); + + expect(client).toBeInstanceOf(S3Client); + // Additional assertions to check if the client was configured correctly + }); +}); + +describe('getS3PutUrl', () => { + it('should create a pre-signed PUT URL for S3', async () => { + const mockClient = new S3Client({ region: 'mock-region' }); + const mockFile = new File([''], 'testfile.png', { type: 'image/png' }); + + const result = await getS3PutUrl( + 'my-bucket', + 'promo-id', + mockFile, + mockClient + ); + + expect(PutObjectCommand).toHaveBeenCalledWith({ + Key: 'pid/mockPath', + ContentType: 'image/png', + Bucket: 'my-bucket', + }); + expect(getSignedUrl).toHaveBeenCalledWith( + mockClient, + expect.any(PutObjectCommand), + { expiresIn: 600 } + ); + expect(result).toEqual({ + putUrl: 'mockSignedUrl', + awsPath: 'pid/mockPath', + }); + }); + + // Additional tests can be added to cover different scenarios +}); + +describe('getS3ReadUrl', () => { + it('should create a pre-signed GET URL for S3', async () => { + const mockClient = new S3Client({ region: 'mock-region' }); + const mockPath = 's3://my-bucket/pid/mockPath'; + + const result = await getS3ReadUrl(mockPath, mockClient); + + expect(GetObjectCommand).toHaveBeenCalledWith({ + Key: 'pid/mockPath', + Bucket: 'my-bucket', + }); + expect(getSignedUrl).toHaveBeenCalledWith( + mockClient, + expect.any(GetObjectCommand), + { expiresIn: 600 } + ); + expect(result).toEqual({ getUrl: 'mockSignedUrl' }); + }); + + // Additional tests can be added for different scenarios and error handling +}); diff --git a/src/storage.ts b/src/storage.ts new file mode 100644 index 0000000..fedf3af --- /dev/null +++ b/src/storage.ts @@ -0,0 +1,100 @@ +import { + S3Client, + PutObjectCommand, + GetObjectCommand, +} from '@aws-sdk/client-s3'; +import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; +import { generateFilePath } from './utils'; +/** + * uploadMedia + * @description Upload a file to AWS S3 given a backend route and the file. + * The server at the given `backendRoute` should return a pre-signed URL for uploading the file and + * one for reading the file. + * + */ +export async function uploadMedia(backendRoute: string, file: File) { + try { + const res = await fetch(`${backendRoute}/api/media`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + fileName: file.name, + fileType: file.type, + fileSize: file.size, + }), + }); + + const { putUrl, getUrl } = await res.json(); + + const uploadResponse = await fetch(putUrl, { + body: file, + method: 'PUT', + headers: { 'Content-Type': file.type }, + }); + + return { status: uploadResponse.ok, uploadedUrl: getUrl }; + } catch (error) { + console.error(error); + throw error; + } +} +export type S3Credentials = { + accessKeyId: string; + secretAccessKey: string; +}; + +/** + * getS3Client + * @description Get the client instance of the AWS S3 service. + */ +export function getS3Client(region: string, credentials: S3Credentials) { + return new S3Client({ + region: region, + credentials: credentials, + }); +} + +/** + * getS3PutUrl + * @description Given the bucket base, Promo ID and file object, return a pre-signed URL for uploading the file. + */ +export async function getS3PutUrl( + bucketName: string, + pid: string, + file: File, + client: S3Client, + expiresInSeconds?: number +) { + const awsPath = generateFilePath(file, pid); + const putCommand = new PutObjectCommand({ + Key: awsPath, + ContentType: file.type, + Bucket: bucketName, + }); + const signedPutUrl = await getSignedUrl(client, putCommand, { + expiresIn: expiresInSeconds || 600, + }); + return { putUrl: signedPutUrl, awsPath }; +} + +/** + * getS3ReadUrl + * @description Given the awsPath and S3Client, return a pre-signed URL for reading the file. + */ +export async function getS3ReadUrl( + awsPath: string, + client: S3Client, + expiresInSeconds?: number +) { + let key = awsPath.split('/').slice(3).join('/'); + let bucket = awsPath.split('/').slice(2, 3).join(); + const getCommand = new GetObjectCommand({ + Key: key, + Bucket: bucket, + }); + // Generate pre-signed URL for GET request + const signedGetUrl = await getSignedUrl(client, getCommand, { + expiresIn: expiresInSeconds || 600, + }); + return { getUrl: signedGetUrl }; +} From 2d315897c6c8d1b94c1fa865912ded515df9f41f Mon Sep 17 00:00:00 2001 From: "Jason R. Stevens, CFA" Date: Wed, 27 Dec 2023 11:07:55 -0600 Subject: [PATCH 6/6] :wrench: add exports from storage module #5 --- src/index.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 1ca7594..7f71f08 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,19 @@ import { getToken } from './getToken'; import { getWidget, getWidgetCallback, showWidget } from './cloudinary-utils'; import defaultOptions from './defaultOptions'; import { VIDEO_EXTENSIONS, IMAGE_EXTENSIONS } from './constants'; -import { fetcher, detectMediaType, getOptions } from './utils'; +import { + fetcher, + detectMediaType, + getOptions, + generateFilePath, +} from './utils'; +import { + uploadMedia, + getS3Client, + getS3PutUrl, + getS3ReadUrl, + S3Credentials, +} from './storage'; export { generateAccessToken, getToken, @@ -16,4 +28,9 @@ export { fetcher, detectMediaType, getOptions, + uploadMedia, + getS3Client, + getS3PutUrl, + getS3ReadUrl, }; +export type { S3Credentials };