From 2446278ba68d8f381b6afcbf28c5d8004c49e4b1 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 5 Jan 2023 20:08:07 +0100 Subject: [PATCH] refactor: conflicts & types --- package-lock.json | 360 ++++++++++-------- packages/parameters/package.json | 7 +- packages/parameters/src/DynamoDBProvider.ts | 116 ------ .../src/dynamodb/DynamoDBProvider.ts | 91 +++++ packages/parameters/src/dynamodb/index.ts | 1 + .../tests/unit/DynamoDBProvider.test.ts | 192 +++++----- 6 files changed, 379 insertions(+), 388 deletions(-) delete mode 100644 packages/parameters/src/DynamoDBProvider.ts create mode 100644 packages/parameters/src/dynamodb/DynamoDBProvider.ts create mode 100644 packages/parameters/src/dynamodb/index.ts diff --git a/package-lock.json b/package-lock.json index 6d5b738de9..fccb7410ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -347,15 +347,15 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.238.0.tgz", - "integrity": "sha512-XFLuy1WqjstMXgLqhrIQtG6RI+c0Wv9DRUlKAR3JkAipbZDPPwDXbP6SiECuK/c1D/BdzlqjgIxr82lobFS80Q==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.241.0.tgz", + "integrity": "sha512-UFbX6KXHy18liDcFbKu/HUQdxDeAeGjl/HBFQ6tXq4eRx0tfMSsBZYNDJZl2T+bUpbBIi1Qzc7cH/g3FOO1vQQ==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.238.0", + "@aws-sdk/client-sts": "3.241.0", "@aws-sdk/config-resolver": "3.234.0", - "@aws-sdk/credential-provider-node": "3.238.0", + "@aws-sdk/credential-provider-node": "3.241.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -381,7 +381,7 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", @@ -395,6 +395,18 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/client-dynamodb/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -661,24 +673,6 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/middleware-retry": { - "version": "3.235.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz", - "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==", - "dev": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/service-error-classification": "3.229.0", - "@aws-sdk/types": "3.226.0", - "@aws-sdk/util-middleware": "3.226.0", - "@aws-sdk/util-retry": "3.229.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/smithy-client": { "version": "3.234.0", "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz", @@ -709,38 +703,6 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.234.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz", - "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==", - "dev": true, - "dependencies": { - "@aws-sdk/property-provider": "3.226.0", - "@aws-sdk/types": "3.226.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.234.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz", - "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==", - "dev": true, - "dependencies": { - "@aws-sdk/config-resolver": "3.234.0", - "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/node-config-provider": "3.226.0", - "@aws-sdk/property-provider": "3.226.0", - "@aws-sdk/types": "3.226.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@aws-sdk/client-secrets-manager/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -751,9 +713,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.238.0.tgz", - "integrity": "sha512-KHJJWP7hBDa9KLYiU5+hOb+3AAba93PhWebXkpKyQ/Bs+e7ECCreyLCwuME6uWTV01NDuFDpwZ6zUMpyNIcP6Q==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.241.0.tgz", + "integrity": "sha512-Jm4HR+RYAqKMEYZvvWaq0NYUKKonyInOeubObXH4BLXZpmUBSdYCSjjLdNJY3jkQoxbDVPVMIurVNh5zT5SMRw==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -781,7 +743,7 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", @@ -794,9 +756,9 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.238.0.tgz", - "integrity": "sha512-kazcA2Kp+cXQRtaZi5/T5YFfU9J3nzu1tXJsh0xAm+J3S9LS1ertY1bSX6KBed2xuxx2mfum8JRqli0TJad/pA==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.241.0.tgz", + "integrity": "sha512-/Ml2QBGpGfUEeBrPzBZhSTBkHuXFD2EAZEIHGCBH4tKaURDI6/FoGI8P1Rl4BzoFt+II/Cr91Eox6YT9EwChsQ==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -824,7 +786,7 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", @@ -836,15 +798,39 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/client-sts": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.238.0.tgz", - "integrity": "sha512-jQNwHqxWUGvWCN4o8KUFYQES8r41Oobu7x1KZOMrPhPxy27FUcDjBq/h85VoD2/AZlETSCZLiCnKV3KBh5pT5w==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.241.0.tgz", + "integrity": "sha512-vmlG8cJzRf8skCtTJbA2wBvD2c3NQ5gZryzJvTKDS06KzBzcEpnjlLseuTekcnOiRNekbFUX5hRu5Zj3N2ReLg==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", "@aws-sdk/config-resolver": "3.234.0", - "@aws-sdk/credential-provider-node": "3.238.0", + "@aws-sdk/credential-provider-node": "3.241.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -870,7 +856,7 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", @@ -883,6 +869,18 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/config-resolver": { "version": "3.234.0", "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.234.0.tgz", @@ -927,14 +925,14 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.238.0.tgz", - "integrity": "sha512-WmPNtIYyUasjV7VQxvPNq7ihmx0vFsiKAtjNjjakdrt5TPoma4nUYb9tIG9SuG+kcp4DJIgRLJAgZtXbCcVimg==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.241.0.tgz", + "integrity": "sha512-CI+mu6h74Kzmscw35TvNkc/wYHsHPGAwP7humSHoWw53H9mVw21Ggft/dT1iFQQZWQ8BNXkzuXlNo1IlqwMgOA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", "@aws-sdk/credential-provider-process": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.238.0", + "@aws-sdk/credential-provider-sso": "3.241.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -946,15 +944,15 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.238.0.tgz", - "integrity": "sha512-/RN5EyGfgdIIJdFzv+O0nSaHX1/F3anQjTIBeVg8GJ+82m+bDxMdALsG+NzkYnLilN9Uhc1lSNjLBCoPa5DSEg==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.241.0.tgz", + "integrity": "sha512-08zPQcD5o9brQmzEipWHeHgU85aQcEF8MWLfpeyjO6e1/l7ysQ35NsS+PYtv77nLpGCx/X+ZuW/KXWoRrbw77w==", "dependencies": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/credential-provider-ini": "3.238.0", + "@aws-sdk/credential-provider-ini": "3.241.0", "@aws-sdk/credential-provider-process": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.238.0", + "@aws-sdk/credential-provider-sso": "3.241.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -980,14 +978,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.238.0.tgz", - "integrity": "sha512-i70V4bFlCVYey3QARJ6XxKEg/4YuoFRnePV2oK37UHOGpEn49uXKwVZqLjzJgFHln7BPlC06cWDqrHUQIMvYrQ==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.241.0.tgz", + "integrity": "sha512-6Bjd6eEIrVomRTrPrM4dlxusQm+KMJ9hLYKECCpFkwDKIK+pTgZNLRtQdalHyzwneHJPdimrm8cOv1kUQ8hPoA==", "dependencies": { - "@aws-sdk/client-sso": "3.238.0", + "@aws-sdk/client-sso": "3.241.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", - "@aws-sdk/token-providers": "3.238.0", + "@aws-sdk/token-providers": "3.241.0", "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" }, @@ -1387,11 +1385,11 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.238.0.tgz", - "integrity": "sha512-vYUwmy0kTzA99mJCVvad+/5RDlWve/xxnppT8DJK3JIdAgskp+rULY+joVnq2NSl489UAioUnFGs57vUxi8Pog==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.241.0.tgz", + "integrity": "sha512-79okvuOS7V559OIL/RalIPG98wzmWxeFOChFnbEjn2pKOyGQ6FJRwLPYZaVRtNdAtnkBNgRpmFq9dX843QxhtQ==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.238.0", + "@aws-sdk/client-sso-oidc": "3.241.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -1521,6 +1519,7 @@ "version": "3.226.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.226.0.tgz", "integrity": "sha512-iqOkac/zLmyPBUJd7SLN0PeZMkOmlGgD5PHmmekTClOkce2eUjK9SNX1PzL73aXPoPTyhg9QGLH8uEZEQ8YUzg==", + "dev": true, "dependencies": { "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" @@ -16823,11 +16822,25 @@ "@aws-sdk/util-base64": "^3.208.0" }, "devDependencies": { + "@aws-sdk/client-dynamodb": "^3.241.0", "@aws-sdk/client-secrets-manager": "^3.238.0", + "@aws-sdk/util-dynamodb": "^3.241.0", "aws-sdk-client-mock": "^2.0.1", "aws-sdk-client-mock-jest": "^2.0.1" } }, + "packages/parameters/node_modules/@aws-sdk/util-dynamodb": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.241.0.tgz", + "integrity": "sha512-1gDDxlj4fB9YXzUB36D4ji4kqFBMdWCklkPAhkCxaAeFAqAs4NvKGZK9k4AzxJoRD6vwsl+O7GdANjbTHweauQ==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", "version": "1.5.0", @@ -17095,10 +17108,23 @@ "@aws-lambda-powertools/parameters": { "version": "file:packages/parameters", "requires": { + "@aws-sdk/client-dynamodb": "*", "@aws-sdk/client-secrets-manager": "^3.238.0", "@aws-sdk/util-base64": "^3.208.0", + "@aws-sdk/util-dynamodb": "*", "aws-sdk-client-mock": "^2.0.1", "aws-sdk-client-mock-jest": "^2.0.1" + }, + "dependencies": { + "@aws-sdk/util-dynamodb": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.241.0.tgz", + "integrity": "sha512-1gDDxlj4fB9YXzUB36D4ji4kqFBMdWCklkPAhkCxaAeFAqAs4NvKGZK9k4AzxJoRD6vwsl+O7GdANjbTHweauQ==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + } + } } }, "@aws-lambda-powertools/tracer": { @@ -17123,15 +17149,15 @@ } }, "@aws-sdk/client-dynamodb": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.238.0.tgz", - "integrity": "sha512-XFLuy1WqjstMXgLqhrIQtG6RI+c0Wv9DRUlKAR3JkAipbZDPPwDXbP6SiECuK/c1D/BdzlqjgIxr82lobFS80Q==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.241.0.tgz", + "integrity": "sha512-UFbX6KXHy18liDcFbKu/HUQdxDeAeGjl/HBFQ6tXq4eRx0tfMSsBZYNDJZl2T+bUpbBIi1Qzc7cH/g3FOO1vQQ==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.238.0", + "@aws-sdk/client-sts": "3.241.0", "@aws-sdk/config-resolver": "3.234.0", - "@aws-sdk/credential-provider-node": "3.238.0", + "@aws-sdk/credential-provider-node": "3.241.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -17157,7 +17183,7 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", @@ -17168,6 +17194,15 @@ "uuid": "^8.3.2" }, "dependencies": { + "@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -17409,21 +17444,6 @@ "tslib": "^2.3.1" } }, - "@aws-sdk/middleware-retry": { - "version": "3.235.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.235.0.tgz", - "integrity": "sha512-50WHbJGpD3SNp9763MAlHqIhXil++JdQbKejNpHg7HsJne/ao3ub+fDOfx//mMBjpzBV25BGd5UlfL6blrClSg==", - "dev": true, - "requires": { - "@aws-sdk/protocol-http": "3.226.0", - "@aws-sdk/service-error-classification": "3.229.0", - "@aws-sdk/types": "3.226.0", - "@aws-sdk/util-middleware": "3.226.0", - "@aws-sdk/util-retry": "3.229.0", - "tslib": "^2.3.1", - "uuid": "^8.3.2" - } - }, "@aws-sdk/smithy-client": { "version": "3.234.0", "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.234.0.tgz", @@ -17448,32 +17468,6 @@ "tslib": "^2.3.1" } }, - "@aws-sdk/util-defaults-mode-browser": { - "version": "3.234.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.234.0.tgz", - "integrity": "sha512-IHMKXjTbOD8XMz5+2oCOsVP94BYb9YyjXdns0aAXr2NAo7k2+RCzXQ2DebJXppGda1F6opFutoKwyVSN0cmbMw==", - "dev": true, - "requires": { - "@aws-sdk/property-provider": "3.226.0", - "@aws-sdk/types": "3.226.0", - "bowser": "^2.11.0", - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-defaults-mode-node": { - "version": "3.234.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.234.0.tgz", - "integrity": "sha512-UGjQ+OjBYYhxFVtUY+jtr0ZZgzZh6OHtYwRhFt8IHewJXFCfZTyfsbX20szBj5y1S4HRIUJ7cwBLIytTqMbI5w==", - "dev": true, - "requires": { - "@aws-sdk/config-resolver": "3.234.0", - "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/node-config-provider": "3.226.0", - "@aws-sdk/property-provider": "3.226.0", - "@aws-sdk/types": "3.226.0", - "tslib": "^2.3.1" - } - }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -17483,9 +17477,9 @@ } }, "@aws-sdk/client-sso": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.238.0.tgz", - "integrity": "sha512-KHJJWP7hBDa9KLYiU5+hOb+3AAba93PhWebXkpKyQ/Bs+e7ECCreyLCwuME6uWTV01NDuFDpwZ6zUMpyNIcP6Q==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.241.0.tgz", + "integrity": "sha512-Jm4HR+RYAqKMEYZvvWaq0NYUKKonyInOeubObXH4BLXZpmUBSdYCSjjLdNJY3jkQoxbDVPVMIurVNh5zT5SMRw==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -17513,19 +17507,30 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", "@aws-sdk/util-utf8-browser": "3.188.0", "@aws-sdk/util-utf8-node": "3.208.0", "tslib": "^2.3.1" + }, + "dependencies": { + "@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + } } }, "@aws-sdk/client-sso-oidc": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.238.0.tgz", - "integrity": "sha512-kazcA2Kp+cXQRtaZi5/T5YFfU9J3nzu1tXJsh0xAm+J3S9LS1ertY1bSX6KBed2xuxx2mfum8JRqli0TJad/pA==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.241.0.tgz", + "integrity": "sha512-/Ml2QBGpGfUEeBrPzBZhSTBkHuXFD2EAZEIHGCBH4tKaURDI6/FoGI8P1Rl4BzoFt+II/Cr91Eox6YT9EwChsQ==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -17553,24 +17558,35 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", "@aws-sdk/util-utf8-browser": "3.188.0", "@aws-sdk/util-utf8-node": "3.208.0", "tslib": "^2.3.1" + }, + "dependencies": { + "@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + } } }, "@aws-sdk/client-sts": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.238.0.tgz", - "integrity": "sha512-jQNwHqxWUGvWCN4o8KUFYQES8r41Oobu7x1KZOMrPhPxy27FUcDjBq/h85VoD2/AZlETSCZLiCnKV3KBh5pT5w==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.241.0.tgz", + "integrity": "sha512-vmlG8cJzRf8skCtTJbA2wBvD2c3NQ5gZryzJvTKDS06KzBzcEpnjlLseuTekcnOiRNekbFUX5hRu5Zj3N2ReLg==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", "@aws-sdk/config-resolver": "3.234.0", - "@aws-sdk/credential-provider-node": "3.238.0", + "@aws-sdk/credential-provider-node": "3.241.0", "@aws-sdk/fetch-http-handler": "3.226.0", "@aws-sdk/hash-node": "3.226.0", "@aws-sdk/invalid-dependency": "3.226.0", @@ -17596,7 +17612,7 @@ "@aws-sdk/util-body-length-node": "3.208.0", "@aws-sdk/util-defaults-mode-browser": "3.234.0", "@aws-sdk/util-defaults-mode-node": "3.234.0", - "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-endpoints": "3.241.0", "@aws-sdk/util-retry": "3.229.0", "@aws-sdk/util-user-agent-browser": "3.226.0", "@aws-sdk/util-user-agent-node": "3.226.0", @@ -17604,6 +17620,17 @@ "@aws-sdk/util-utf8-node": "3.208.0", "fast-xml-parser": "4.0.11", "tslib": "^2.3.1" + }, + "dependencies": { + "@aws-sdk/util-endpoints": { + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.241.0.tgz", + "integrity": "sha512-jVf8bKrN22Ey0xLmj75sL7EUvm5HFpuOMkXsZkuXycKhCwLBcEUWlvtJYtRjOU1zScPQv9GMJd2QXQglp34iOQ==", + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + } } }, "@aws-sdk/config-resolver": { @@ -17641,14 +17668,14 @@ } }, "@aws-sdk/credential-provider-ini": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.238.0.tgz", - "integrity": "sha512-WmPNtIYyUasjV7VQxvPNq7ihmx0vFsiKAtjNjjakdrt5TPoma4nUYb9tIG9SuG+kcp4DJIgRLJAgZtXbCcVimg==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.241.0.tgz", + "integrity": "sha512-CI+mu6h74Kzmscw35TvNkc/wYHsHPGAwP7humSHoWw53H9mVw21Ggft/dT1iFQQZWQ8BNXkzuXlNo1IlqwMgOA==", "requires": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", "@aws-sdk/credential-provider-process": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.238.0", + "@aws-sdk/credential-provider-sso": "3.241.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -17657,15 +17684,15 @@ } }, "@aws-sdk/credential-provider-node": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.238.0.tgz", - "integrity": "sha512-/RN5EyGfgdIIJdFzv+O0nSaHX1/F3anQjTIBeVg8GJ+82m+bDxMdALsG+NzkYnLilN9Uhc1lSNjLBCoPa5DSEg==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.241.0.tgz", + "integrity": "sha512-08zPQcD5o9brQmzEipWHeHgU85aQcEF8MWLfpeyjO6e1/l7ysQ35NsS+PYtv77nLpGCx/X+ZuW/KXWoRrbw77w==", "requires": { "@aws-sdk/credential-provider-env": "3.226.0", "@aws-sdk/credential-provider-imds": "3.226.0", - "@aws-sdk/credential-provider-ini": "3.238.0", + "@aws-sdk/credential-provider-ini": "3.241.0", "@aws-sdk/credential-provider-process": "3.226.0", - "@aws-sdk/credential-provider-sso": "3.238.0", + "@aws-sdk/credential-provider-sso": "3.241.0", "@aws-sdk/credential-provider-web-identity": "3.226.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", @@ -17685,14 +17712,14 @@ } }, "@aws-sdk/credential-provider-sso": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.238.0.tgz", - "integrity": "sha512-i70V4bFlCVYey3QARJ6XxKEg/4YuoFRnePV2oK37UHOGpEn49uXKwVZqLjzJgFHln7BPlC06cWDqrHUQIMvYrQ==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.241.0.tgz", + "integrity": "sha512-6Bjd6eEIrVomRTrPrM4dlxusQm+KMJ9hLYKECCpFkwDKIK+pTgZNLRtQdalHyzwneHJPdimrm8cOv1kUQ8hPoA==", "requires": { - "@aws-sdk/client-sso": "3.238.0", + "@aws-sdk/client-sso": "3.241.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", - "@aws-sdk/token-providers": "3.238.0", + "@aws-sdk/token-providers": "3.241.0", "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" } @@ -18002,11 +18029,11 @@ } }, "@aws-sdk/token-providers": { - "version": "3.238.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.238.0.tgz", - "integrity": "sha512-vYUwmy0kTzA99mJCVvad+/5RDlWve/xxnppT8DJK3JIdAgskp+rULY+joVnq2NSl489UAioUnFGs57vUxi8Pog==", + "version": "3.241.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.241.0.tgz", + "integrity": "sha512-79okvuOS7V559OIL/RalIPG98wzmWxeFOChFnbEjn2pKOyGQ6FJRwLPYZaVRtNdAtnkBNgRpmFq9dX843QxhtQ==", "requires": { - "@aws-sdk/client-sso-oidc": "3.238.0", + "@aws-sdk/client-sso-oidc": "3.241.0", "@aws-sdk/property-provider": "3.226.0", "@aws-sdk/shared-ini-file-loader": "3.226.0", "@aws-sdk/types": "3.226.0", @@ -18109,6 +18136,7 @@ "version": "3.226.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.226.0.tgz", "integrity": "sha512-iqOkac/zLmyPBUJd7SLN0PeZMkOmlGgD5PHmmekTClOkce2eUjK9SNX1PzL73aXPoPTyhg9QGLH8uEZEQ8YUzg==", + "dev": true, "requires": { "@aws-sdk/types": "3.226.0", "tslib": "^2.3.1" @@ -30107,4 +30135,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/parameters/package.json b/packages/parameters/package.json index a6ac1decec..97f59e4adf 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -51,8 +51,13 @@ "nodejs" ], "devDependencies": { + "@aws-sdk/client-dynamodb": "^3.241.0", "@aws-sdk/client-secrets-manager": "^3.238.0", + "@aws-sdk/util-dynamodb": "^3.241.0", "aws-sdk-client-mock": "^2.0.1", "aws-sdk-client-mock-jest": "^2.0.1" + }, + "dependencies": { + "@aws-sdk/util-base64": "^3.208.0" } -} \ No newline at end of file +} diff --git a/packages/parameters/src/DynamoDBProvider.ts b/packages/parameters/src/DynamoDBProvider.ts deleted file mode 100644 index cd3fee1ac1..0000000000 --- a/packages/parameters/src/DynamoDBProvider.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { BaseProvider } from './BaseProvider'; -import { DynamoDBClient, GetItemCommand, paginateQuery } from '@aws-sdk/client-dynamodb'; -import type { - DynamoDBProviderOptions, - DynamoDBGetOptionsInterface, - DynamoDBGetMultipleOptionsInterface -} from './types/DynamoDBProvider'; -import type { GetItemCommandInput, QueryCommandInput } from '@aws-sdk/client-dynamodb'; -import { marshall, unmarshall } from '@aws-sdk/util-dynamodb'; -import type { PaginationConfiguration } from '@aws-sdk/types'; - -class DynamoDBProvider extends BaseProvider { - public client: DynamoDBClient; - protected keyAttr: string = 'id'; - protected sortAttr: string = 'sk'; - protected tableName: string; - protected valueAttr: string = 'value'; - - public constructor(config: DynamoDBProviderOptions) { - super(); - - const clientConfig = config.clientConfig || {}; - this.client = new DynamoDBClient(clientConfig); - this.tableName = config.tableName; - if (config.keyAttr) this.keyAttr = config.keyAttr; - if (config.sortAttr) this.sortAttr = config.sortAttr; - if (config.valueAttr) this.valueAttr = config.valueAttr; - } - - public async get(name: string, options?: DynamoDBGetOptionsInterface): Promise> { - return super.get(name, options); - } - - public async getMultiple(path: string, options?: DynamoDBGetMultipleOptionsInterface): Promise> { - return super.getMultiple(path, options); - } - - protected async _get(name: string, options?: DynamoDBGetOptionsInterface): Promise { - const sdkOptions: GetItemCommandInput = { - TableName: this.tableName, - Key: marshall({ [this.keyAttr]: name }), - ProjectionExpression: this.valueAttr, - }; - if (options && options.sdkOptions) { - this.removeNonOverridableOptions(options.sdkOptions as GetItemCommandInput); - Object.assign(sdkOptions, options.sdkOptions); - } - const result = await this.client.send(new GetItemCommand(sdkOptions)); - - return result.Item ? unmarshall(result.Item)[this.valueAttr] : undefined; - } - - protected async _getMultiple(path: string, options?: DynamoDBGetMultipleOptionsInterface): Promise> { - const sdkOptions: QueryCommandInput = { - TableName: this.tableName, - KeyConditionExpression: `${this.keyAttr} = :key`, - ExpressionAttributeValues: marshall({ ':key': path }), - ProjectionExpression: `${this.sortAttr}, ${this.valueAttr}`, - }; - const paginationOptions: PaginationConfiguration = { - client: this.client, - }; - if (options && options.sdkOptions) { - this.removeNonOverridableOptions(options.sdkOptions as QueryCommandInput); - if (options.sdkOptions?.hasOwnProperty('Limit')) { - paginationOptions.pageSize = options.sdkOptions.Limit; - } - Object.assign(sdkOptions, options.sdkOptions); - } - - const parameters: Record = {}; - for await (const page of paginateQuery(paginationOptions, sdkOptions)) { - for (const item of page.Items || []) { - const unmarshalledItem = unmarshall(item); - parameters[unmarshalledItem[this.sortAttr]] = unmarshalledItem[this.valueAttr]; - } - } - - return parameters; - } - - /** - * This method is used as a type guard to narrow down the type of the options object. - */ - protected isGetItemCommandInput(options: GetItemCommandInput | QueryCommandInput): options is GetItemCommandInput { - return (options as GetItemCommandInput).Key !== undefined; - } - - /** - * Explicit arguments passed to the constructor will take precedence over ones passed to the method. - * For users who consume the library with TypeScript, this will be enforced by the type system. However, - * for JavaScript users, we need to manually delete the properties that are not allowed to be overridden. - */ - protected removeNonOverridableOptions(options: GetItemCommandInput | QueryCommandInput): void { - if (options.hasOwnProperty('TableName')) { - delete options.TableName; - } - if (options.hasOwnProperty('ProjectionExpression')) { - delete options.ProjectionExpression; - } - if (options.hasOwnProperty('Key') && this.isGetItemCommandInput(options)) { - delete options.Key; - } else if (options.hasOwnProperty('KeyConditionExpression') && !this.isGetItemCommandInput(options)) { - if (options.hasOwnProperty('KeyConditionExpression')) { - delete options.KeyConditionExpression; - } - if (options.hasOwnProperty('ExpressionAttributeValues')) { - delete options.ExpressionAttributeValues; - } - } - } -} - -export { - DynamoDBProvider, -}; \ No newline at end of file diff --git a/packages/parameters/src/dynamodb/DynamoDBProvider.ts b/packages/parameters/src/dynamodb/DynamoDBProvider.ts new file mode 100644 index 0000000000..f99ab90651 --- /dev/null +++ b/packages/parameters/src/dynamodb/DynamoDBProvider.ts @@ -0,0 +1,91 @@ +import { BaseProvider } from '../BaseProvider'; +import { DynamoDBClient, GetItemCommand, paginateQuery } from '@aws-sdk/client-dynamodb'; +import type { + DynamoDBProviderOptions, + DynamoDBGetOptionsInterface, + DynamoDBGetMultipleOptionsInterface +} from '../types/DynamoDBProvider'; +import type { GetItemCommandInput, QueryCommandInput } from '@aws-sdk/client-dynamodb'; +import { marshall, unmarshall } from '@aws-sdk/util-dynamodb'; +import type { PaginationConfiguration } from '@aws-sdk/types'; + +class DynamoDBProvider extends BaseProvider { + public client: DynamoDBClient; + protected keyAttr: string = 'id'; + protected sortAttr: string = 'sk'; + protected tableName: string; + protected valueAttr: string = 'value'; + + public constructor(config: DynamoDBProviderOptions) { + super(); + + const clientConfig = config.clientConfig || {}; + this.client = new DynamoDBClient(clientConfig); + this.tableName = config.tableName; + if (config.keyAttr) this.keyAttr = config.keyAttr; + if (config.sortAttr) this.sortAttr = config.sortAttr; + if (config.valueAttr) this.valueAttr = config.valueAttr; + } + + public async get( + name: string, + options?: DynamoDBGetOptionsInterface + ): Promise> { + return super.get(name, options) as Promise>; + } + + public async getMultiple( + path: string, + options?: DynamoDBGetMultipleOptionsInterface + ): Promise> { + return super.getMultiple(path, options); + } + + protected async _get( + name: string, + options?: DynamoDBGetOptionsInterface + ): Promise { + const sdkOptions: GetItemCommandInput = { + ...(options?.sdkOptions || {}), + TableName: this.tableName, + Key: marshall({ [this.keyAttr]: name }), + ProjectionExpression: this.valueAttr, + }; + const result = await this.client.send(new GetItemCommand(sdkOptions)); + + return result.Item ? unmarshall(result.Item)[this.valueAttr] : undefined; + } + + protected async _getMultiple( + path: string, + options?: DynamoDBGetMultipleOptionsInterface + ): Promise> { + const sdkOptions: QueryCommandInput = { + ...(options?.sdkOptions || {}), + TableName: this.tableName, + KeyConditionExpression: `${this.keyAttr} = :key`, + ExpressionAttributeValues: marshall({ ':key': path }), + ProjectionExpression: `${this.sortAttr}, ${this.valueAttr}`, + }; + const paginationOptions: PaginationConfiguration = { + client: this.client, + pageSize: options?.sdkOptions?.Limit, + }; + + const parameters: Record = {}; + for await (const page of paginateQuery(paginationOptions, sdkOptions)) { + for (const item of page.Items || []) { + const unmarshalledItem = unmarshall(item); + parameters[ + unmarshalledItem[this.sortAttr] + ] = unmarshalledItem[this.valueAttr]; + } + } + + return parameters; + } +} + +export { + DynamoDBProvider, +}; \ No newline at end of file diff --git a/packages/parameters/src/dynamodb/index.ts b/packages/parameters/src/dynamodb/index.ts new file mode 100644 index 0000000000..f5b2c448a3 --- /dev/null +++ b/packages/parameters/src/dynamodb/index.ts @@ -0,0 +1 @@ +export * from './DynamoDBProvider'; \ No newline at end of file diff --git a/packages/parameters/tests/unit/DynamoDBProvider.test.ts b/packages/parameters/tests/unit/DynamoDBProvider.test.ts index 0d14cd6bcb..2ecbd4dd44 100644 --- a/packages/parameters/tests/unit/DynamoDBProvider.test.ts +++ b/packages/parameters/tests/unit/DynamoDBProvider.test.ts @@ -3,7 +3,7 @@ * * @group unit/parameters/DynamoDBProvider/class */ -import { DynamoDBProvider } from '../../src/DynamoDBProvider'; +import { DynamoDBProvider } from '../../src/dynamodb'; import { DynamoDBClient, GetItemCommand, QueryCommand } from '@aws-sdk/client-dynamodb'; import type { GetItemCommandInput, QueryCommandInput } from '@aws-sdk/client-dynamodb'; import { marshall } from '@aws-sdk/util-dynamodb'; @@ -132,6 +132,43 @@ describe('Class: DynamoDBProvider', () => { }); + test('when called with sdkOptions that override arguments passed to the method, it gets the parameter using the arguments', async () => { + + // Prepare + const provider = new DynamoDBProvider({ + tableName: 'test-table', + }); + const parameterName = 'foo'; + const parameterValue = 'bar'; + const client = mockClient(DynamoDBClient).on(GetItemCommand).resolves({ + Item: marshall({ + id: parameterName, + value: parameterValue, + }) + }); + + // Act + await provider.get(parameterName, { + sdkOptions: { + TableName: 'override-table', + Key: marshall({ + id: 'override-name', + }), + ProjectionExpression: 'override-value', + } as unknown as GetItemCommandInput, + }); + + // Assess + expect(client).toReceiveCommandWith(GetItemCommand, { + TableName: 'test-table', + Key: marshall({ + id: parameterName, + }), + ProjectionExpression: 'value', + }); + + }); + }); describe('Method: _getMultiple', () => { @@ -146,17 +183,17 @@ describe('Class: DynamoDBProvider', () => { const client = mockClient(DynamoDBClient).on(QueryCommand).resolves({ Items: [ marshall({ - id: 'foo', + id: parameterPath, sk: 'a', value: 'parameter-a' }), marshall({ - id: 'foo', + id: parameterPath, sk: 'b', value: 'parameter-b' }), marshall({ - id: 'foo', + id: parameterPath, sk: 'c', value: 'parameter-c' }), @@ -196,17 +233,17 @@ describe('Class: DynamoDBProvider', () => { const client = mockClient(DynamoDBClient).on(QueryCommand).resolves({ Items: [ marshall({ - key: 'foo', + key: parameterPath, sort: 'a', val: 'parameter-a' }), marshall({ - key: 'foo', + key: parameterPath, sort: 'b', val: 'parameter-b' }), marshall({ - key: 'foo', + key: parameterPath, sort: 'c', val: 'parameter-c' }), @@ -243,17 +280,17 @@ describe('Class: DynamoDBProvider', () => { const client = mockClient(DynamoDBClient).on(QueryCommand).resolves({ Items: [ marshall({ - id: 'foo', + id: parameterPath, sk: 'a', value: 'parameter-a' }), marshall({ - id: 'foo', + id: parameterPath, sk: 'b', value: 'parameter-b' }), marshall({ - id: 'foo', + id: parameterPath, sk: 'c', value: 'parameter-c' }), @@ -277,7 +314,6 @@ describe('Class: DynamoDBProvider', () => { }), ProjectionExpression: 'sk, value', ConsistentRead: true, - Limit: 10, }); expect(parameters).toEqual({ a: 'parameter-a', @@ -298,31 +334,31 @@ describe('Class: DynamoDBProvider', () => { .resolvesOnce({ Items: [ marshall({ - id: 'foo', + id: parameterPath, sk: 'a', value: 'parameter-a' }), marshall({ - id: 'foo', + id: parameterPath, sk: 'b', value: 'parameter-b' }), ], LastEvaluatedKey: marshall({ - id: 'foo', + id: parameterPath, sk: 'b', }), }) .resolvesOnce({ Items: [ marshall({ - id: 'foo', + id: parameterPath, sk: 'c', value: 'parameter-c' }), ], LastEvaluatedKey: marshall({ - id: 'foo', + id: parameterPath, sk: 'c', }), }) @@ -340,108 +376,54 @@ describe('Class: DynamoDBProvider', () => { }); - }); - - describe('Method: isGetItemCommandInput', () => { - - class DummyProvider extends DynamoDBProvider { - public isGetItemCommandInput(options: GetItemCommandInput | QueryCommandInput): options is GetItemCommandInput { - return super.isGetItemCommandInput(options); - } - } - - test('when called with a valid GetItemCommandInput, it returns true', () => { - - // Prepare - const provider = new DummyProvider({ - tableName: 'test-table', - }); - - // Act & Assess - expect(provider.isGetItemCommandInput({ - TableName: 'test-table', - Key: marshall({ - id: 'foo', - }), - })).toBe(true); - - }); - - test('when called with a valid QueryCommandInput, it returns false', () => { + test('when called with sdkOptions that override arguments or internals, it discards the ones passed in sdkOptions and leaves others untouched', async () => { // Prepare - const provider = new DummyProvider({ + const provider = new DynamoDBProvider({ tableName: 'test-table', }); - - // Act & Assess - expect(provider.isGetItemCommandInput({ - TableName: 'test-table', - KeyConditionExpression: `id = :key`, - ExpressionAttributeValues: marshall({ - ':key': 'foo', - }), - })).toBe(false); - - }); - - }); - - describe('Method: removeNonOverridableOptions', () => { - - class DummyProvider extends DynamoDBProvider { - public removeNonOverridableOptions(options: GetItemCommandInput | QueryCommandInput): void { - super.removeNonOverridableOptions(options); - } - } - - test('when called with a valid GetItemCommandInput, it removes the non-overridable options', () => { - - // Prepare - const provider = new DummyProvider({ - tableName: 'test-table', + const parameterPath = 'foo'; + const client = mockClient(DynamoDBClient).on(QueryCommand).resolves({ + Items: [ + marshall({ + id: parameterPath, + sk: 'a', + value: 'parameter-a' + }), + marshall({ + id: parameterPath, + sk: 'b', + value: 'parameter-b' + }), + marshall({ + id: parameterPath, + sk: 'c', + value: 'parameter-c' + }), + ], }); - const options: GetItemCommandInput = { - TableName: 'test-table', - Key: marshall({ - id: 'foo', - }), - ConsistentRead: true, - ProjectionExpression: 'sk, value', - }; // Act - provider.removeNonOverridableOptions(options); - - // Assess - expect(options).toEqual({ - ConsistentRead: true, - }); - - }); - - test('when called with a valid QueryCommandInput, it removes the non-overridable options', () => { - - // Prepare - const provider = new DummyProvider({ - tableName: 'test-table', + await provider.getMultiple(parameterPath, { + sdkOptions: { + KeyConditionExpression: `key = :myKey`, + ExpressionAttributeValues: marshall({ + ':myKey': 'foo', + }), + ConsistentRead: true, + ProjectionExpression: 'sort, val', + Limit: 10, + } as unknown as QueryCommandInput, }); - const options: QueryCommandInput = { + + // Assess + expect(client).toReceiveCommandWith(QueryCommand, { TableName: 'test-table', KeyConditionExpression: `id = :key`, ExpressionAttributeValues: marshall({ - ':key': 'foo', + ':key': parameterPath, }), - ConsistentRead: true, ProjectionExpression: 'sk, value', - Limit: 10, - }; - - // Act - provider.removeNonOverridableOptions(options); - - // Assess - expect(options).toEqual({ ConsistentRead: true, Limit: 10, });