From 024ac3dd21e801403697e3c173135d3e4315ffc1 Mon Sep 17 00:00:00 2001 From: Keyu Wu Date: Wed, 10 Dec 2025 17:20:22 -0800 Subject: [PATCH] Upgrade sdk v2 to sdk v3 - DataZoneCustomClient --- package-lock.json | 1087 +++++++++++++++++ packages/core/package.json | 1 + .../scripts/build/generateServiceClient.ts | 4 - .../client/datazoneCustomClientHelper.ts | 118 +- .../shared/client/datazonecustomclient.json | 919 -------------- .../client/datazoneCustomClientHelper.test.ts | 130 +- .../@amzn/datazone-custom-client/3.0.0.tgz | Bin 0 -> 46241 bytes 7 files changed, 1208 insertions(+), 1051 deletions(-) delete mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json create mode 100644 src.gen/@amzn/datazone-custom-client/3.0.0.tgz diff --git a/package-lock.json b/package-lock.json index 7a34807d47a..bb400e1621e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,6 +71,1092 @@ "resolved": "src.gen/@amzn/codewhisperer-streaming", "link": true }, + "node_modules/@amzn/datazone-custom-client": { + "version": "3.0.0", + "resolved": "file:src.gen/@amzn/datazone-custom-client/3.0.0.tgz", + "integrity": "sha512-jUYc+wHaHGUkeunJd5oeogsBFMAMpLW1fgflJWqoRJ9t9zZ1inR/wPenMxsLT1pA6VizEW8CQtwG5cSUjCIvng==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-node": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-stream": "^4.4.0", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/client-sso": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.901.0.tgz", + "integrity": "sha512-sGyDjjkJ7ppaE+bAKL/Q5IvVCxtoyBIzN+7+hWTS/mUxWJ9EOq9238IqmVIIK6sYNIzEf9yhobfMARasPYVTNg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/core": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.901.0.tgz", + "integrity": "sha512-brKAc3y64tdhyuEf+OPIUln86bRTqkLgb9xkd6kUdIeA5+qmp/N6amItQz+RN4k4O3kqkCPYnAd3LonTKluobw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@aws-sdk/xml-builder": "3.901.0", + "@smithy/core": "^3.14.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/signature-v4": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.901.0.tgz", + "integrity": "sha512-5hAdVl3tBuARh3zX5MLJ1P/d+Kr5kXtDU3xm1pxUEF4xt2XkEEpwiX5fbkNkz2rbh3BCt2gOHsAbh6b3M7n+DA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.901.0.tgz", + "integrity": "sha512-Ggr7+0M6QZEsrqRkK7iyJLf4LkIAacAxHz9c4dm9hnDdU7vqrlJm6g73IxMJXWN1bIV7IxfpzB11DsRrB/oNjQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/util-stream": "^4.4.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.901.0.tgz", + "integrity": "sha512-zxadcDS0hNJgv8n4hFYJNOXyfjaNE1vvqIiF/JzZSQpSSYXzCd+WxXef5bQh+W3giDtRUmkvP5JLbamEFjZKyw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.901.0.tgz", + "integrity": "sha512-dPuFzMF7L1s/lQyT3wDxqLe82PyTH+5o1jdfseTEln64LJMl0ZMWaKX/C1UFNDxaTd35Cgt1bDbjjAWHMiKSFQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.901.0", + "@aws-sdk/credential-provider-http": "3.901.0", + "@aws-sdk/credential-provider-ini": "3.901.0", + "@aws-sdk/credential-provider-process": "3.901.0", + "@aws-sdk/credential-provider-sso": "3.901.0", + "@aws-sdk/credential-provider-web-identity": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/credential-provider-imds": "^4.2.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.901.0.tgz", + "integrity": "sha512-/IWgmgM3Cl1wTdJA5HqKMAojxLkYchh5kDuphApxKhupLu6Pu0JBOHU8A5GGeFvOycyaVwosod6zDduINZxe+A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.901.0.tgz", + "integrity": "sha512-SjmqZQHmqFSET7+6xcZgtH7yEyh5q53LN87GqwYlJZ6KJ5oNw11acUNEhUOL1xTSJEvaWqwTIkS2zqrzLcM9bw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.901.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/token-providers": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.901.0.tgz", + "integrity": "sha512-NYjy/6NLxH9m01+pfpB4ql8QgAorJcu8tw69kzHwUd/ql6wUDTbC7HcXqtKlIwWjzjgj2BKL7j6SyFapgCuafA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.901.0.tgz", + "integrity": "sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/middleware-logger": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.901.0.tgz", + "integrity": "sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.901.0.tgz", + "integrity": "sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@aws/lambda-invoke-store": "^0.0.1", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.901.0.tgz", + "integrity": "sha512-Zby4F03fvD9xAgXGPywyk4bC1jCbnyubMEYChLYohD+x20ULQCf+AimF/Btn7YL+hBpzh1+RmqmvZcx+RgwgNQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@smithy/core": "^3.14.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/nested-clients": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.901.0.tgz", + "integrity": "sha512-feAAAMsVwctk2Tms40ONybvpfJPLCmSdI+G+OTrNpizkGLNl6ik2Ng2RzxY6UqOfN8abqKP/DOUj1qYDRDG8ag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.901.0", + "@aws-sdk/middleware-host-header": "3.901.0", + "@aws-sdk/middleware-logger": "3.901.0", + "@aws-sdk/middleware-recursion-detection": "3.901.0", + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/region-config-resolver": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@aws-sdk/util-endpoints": "3.901.0", + "@aws-sdk/util-user-agent-browser": "3.901.0", + "@aws-sdk/util-user-agent-node": "3.901.0", + "@smithy/config-resolver": "^4.3.0", + "@smithy/core": "^3.14.0", + "@smithy/fetch-http-handler": "^5.3.0", + "@smithy/hash-node": "^4.2.0", + "@smithy/invalid-dependency": "^4.2.0", + "@smithy/middleware-content-length": "^4.2.0", + "@smithy/middleware-endpoint": "^4.3.0", + "@smithy/middleware-retry": "^4.4.0", + "@smithy/middleware-serde": "^4.2.0", + "@smithy/middleware-stack": "^4.2.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/node-http-handler": "^4.3.0", + "@smithy/protocol-http": "^5.3.0", + "@smithy/smithy-client": "^4.7.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-base64": "^4.2.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.0", + "@smithy/util-defaults-mode-browser": "^4.2.0", + "@smithy/util-defaults-mode-node": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "@smithy/util-middleware": "^4.2.0", + "@smithy/util-retry": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.901.0.tgz", + "integrity": "sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/token-providers": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.901.0.tgz", + "integrity": "sha512-pJEr1Ggbc/uVTDqp9IbNu9hdr0eQf3yZix3s4Nnyvmg4xmJSGAlbPC9LrNr5u3CDZoc8Z9CuLrvbP4MwYquNpQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.901.0", + "@aws-sdk/nested-clients": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/property-provider": "^4.2.0", + "@smithy/shared-ini-file-loader": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/types": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.901.0.tgz", + "integrity": "sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/util-endpoints": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.901.0.tgz", + "integrity": "sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", + "@smithy/url-parser": "^4.2.0", + "@smithy/util-endpoints": "^3.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.901.0.tgz", + "integrity": "sha512-Ntb6V/WFI21Ed4PDgL/8NSfoZQQf9xzrwNgiwvnxgAl/KvAvRBgQtqj5gHsDX8Nj2YmJuVoHfH9BGjL9VQ4WNg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.901.0", + "@smithy/types": "^4.6.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.901.0.tgz", + "integrity": "sha512-l59KQP5TY7vPVUfEURc7P5BJKuNg1RSsAKBQW7LHLECXjLqDUbo2SMLrexLBEoArSt6E8QOrIN0C8z/0Xk0jYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.901.0", + "@aws-sdk/types": "3.901.0", + "@smithy/node-config-provider": "^4.3.0", + "@smithy/types": "^4.6.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@aws-sdk/xml-builder": { + "version": "3.901.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.901.0.tgz", + "integrity": "sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.6.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/core": { + "version": "3.18.7", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.7.tgz", + "integrity": "sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.14.tgz", + "integrity": "sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.7", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-retry": { + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz", + "integrity": "sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/smithy-client": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.10.tgz", + "integrity": "sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.7", + "@smithy/middleware-endpoint": "^4.3.14", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz", + "integrity": "sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz", + "integrity": "sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@amzn/datazone-custom-client/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/@amzn/glue-catalog-client": { "version": "0.0.1", "resolved": "file:src.gen/@amzn/glue-catalog-client/0.0.1.tgz", @@ -41337,6 +42423,7 @@ "dependencies": { "@amzn/amazon-q-developer-streaming-client": "file:../../src.gen/@amzn/amazon-q-developer-streaming-client", "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", + "@amzn/datazone-custom-client": "file:../../src.gen/@amzn/datazone-custom-client/3.0.0.tgz", "@amzn/glue-catalog-client": "file:../../src.gen/@amzn/glue-catalog-client/0.0.1.tgz", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", "@aws-sdk/client-accessanalyzer": "^3.888.0", diff --git a/packages/core/package.json b/packages/core/package.json index efc06d6e6de..f0216226472 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -582,6 +582,7 @@ "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", "@amzn/glue-catalog-client": "file:../../src.gen/@amzn/glue-catalog-client/0.0.1.tgz", + "@amzn/datazone-custom-client": "file:../../src.gen/@amzn/datazone-custom-client/3.0.0.tgz", "@aws-sdk/client-accessanalyzer": "^3.888.0", "@aws-sdk/client-api-gateway": "<3.731.0", "@aws-sdk/client-apprunner": "<3.731.0", diff --git a/packages/core/scripts/build/generateServiceClient.ts b/packages/core/scripts/build/generateServiceClient.ts index 6e6829fd1ec..1c2a45bec58 100644 --- a/packages/core/scripts/build/generateServiceClient.ts +++ b/packages/core/scripts/build/generateServiceClient.ts @@ -245,10 +245,6 @@ void (async () => { serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/sqlworkbench.json', serviceName: 'SQLWorkbench', }, - { - serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json', - serviceName: 'DataZoneCustomClient', - }, ] await generateServiceClients(serviceClientDefinitions) })() diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts index 684bddf2e08..127446fa7fc 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts @@ -4,12 +4,19 @@ */ import { getLogger } from '../../../shared/logger/logger' -import apiConfig = require('./datazonecustomclient.json') -import globals from '../../../shared/extensionGlobals' -import { Service } from 'aws-sdk' -import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' -import * as DataZoneCustomClient from './datazonecustomclient' -import { adaptConnectionCredentialsProvider } from './credentialsAdapter' +import { + DataZone, + ListDomainsCommand, + GetDomainCommand, + SearchGroupProfilesCommand, + SearchUserProfilesCommand, + DomainSummary, + GetDomainOutput, + GroupProfileSummary, + UserProfileSummary, + GroupSearchType, + UserSearchType, +} from '@amzn/datazone-custom-client' import { CredentialsProvider } from '../../../auth/providers/credentials' import { ToolkitError } from '../../../shared/errors' import { SmusUtils, isIamDomain } from '../smusUtils' @@ -30,7 +37,7 @@ export const DataZoneErrorCode = { * Helper client for interacting with AWS DataZone Custom API */ export class DataZoneCustomClientHelper { - private datazoneCustomClient: DataZoneCustomClient | undefined + private datazoneCustomClient: DataZone | undefined private static instances = new Map() private readonly logger = getLogger('smus') @@ -91,33 +98,38 @@ export class DataZoneCustomClientHelper { /** * Gets the DataZone client, initializing it if necessary */ - private async getDataZoneCustomClient(): Promise { + private async getDataZoneCustomClient(): Promise { if (!this.datazoneCustomClient) { try { this.logger.info('DataZoneCustomClientHelper: Creating authenticated DataZone client') - // Use user setting for endpoint if provided, otherwise use default + // Create credential provider function for auto-refresh + const awsCredentialProvider = async () => { + const credentials = await this.credentialProvider.getCredentials() + return { + accessKeyId: credentials.accessKeyId, + secretAccessKey: credentials.secretAccessKey, + sessionToken: credentials.sessionToken, + expiration: credentials.expiration, + } + } + + const clientConfig: any = { + region: this.region, + credentials: awsCredentialProvider, + } + + // Use user setting for endpoint if provided const devSettings = DevSettings.instance const customEndpoint = devSettings.get('endpoints', {})['datazone'] - const endpoint = customEndpoint || `https://datazone.${this.region}.api.aws` - if (customEndpoint) { + clientConfig.endpoint = customEndpoint this.logger.debug( - `DataZoneCustomClientHelper: Using custom DataZone endpoint from settings: ${endpoint}` + `DataZoneCustomClientHelper: Using custom DataZone endpoint from settings: ${customEndpoint}` ) } - this.datazoneCustomClient = (await globals.sdkClientBuilder.createAwsService( - Service, - { - apiConfig: apiConfig, - endpoint: endpoint, - region: this.region, - credentialProvider: adaptConnectionCredentialsProvider(this.credentialProvider), - } as ServiceConfigurationOptions, - undefined, - false - )) as DataZoneCustomClient + this.datazoneCustomClient = new DataZone(clientConfig) this.logger.info('DataZoneCustomClientHelper: Successfully created authenticated DataZone client') } catch (err) { @@ -137,20 +149,19 @@ export class DataZoneCustomClientHelper { maxResults?: number status?: string nextToken?: string - }): Promise<{ domains: DataZoneCustomClient.Types.DomainSummary[]; nextToken?: string }> { + }): Promise<{ domains: DomainSummary[]; nextToken?: string }> { try { this.logger.info(`DataZoneCustomClientHelper: Listing domains in region ${this.region}`) const datazoneCustomClient = await this.getDataZoneCustomClient() // Call DataZone API to list domains with pagination - const response = await datazoneCustomClient - .listDomains({ - maxResults: options?.maxResults, - status: options?.status, - nextToken: options?.nextToken, - }) - .promise() + const command = new ListDomainsCommand({ + maxResults: options?.maxResults, + status: options?.status as any, + nextToken: options?.nextToken, + }) + const response = await datazoneCustomClient.send(command) const domains = response.items || [] @@ -172,9 +183,9 @@ export class DataZoneCustomClientHelper { * @param options Options for listing domains (excluding nextToken which is handled internally) * @returns Promise resolving to an array of all DataZone domains */ - public async fetchAllDomains(options?: { status?: string }): Promise { + public async fetchAllDomains(options?: { status?: string }): Promise { try { - let allDomains: DataZoneCustomClient.Types.DomainSummary[] = [] + let allDomains: DomainSummary[] = [] let nextToken: string | undefined do { const maxResultsPerPage = 25 @@ -199,7 +210,7 @@ export class DataZoneCustomClientHelper { * Gets the domain with IAM authentication mode using pagination with early termination * @returns Promise resolving to the DataZone domain or undefined if not found */ - public async getIamDomain(): Promise { + public async getIamDomain(): Promise { const logger = getLogger('smus') try { @@ -259,17 +270,16 @@ export class DataZoneCustomClientHelper { * @param domainId The ID of the domain to retrieve * @returns Promise resolving to the GetDomainOutput */ - public async getDomain(domainId: string): Promise { + public async getDomain(domainId: string): Promise { try { this.logger.debug(`DataZoneCustomClientHelper: Getting domain with ID: ${domainId}`) const datazoneCustomClient = await this.getDataZoneCustomClient() - const response = await datazoneCustomClient - .getDomain({ - identifier: domainId, - }) - .promise() + const command = new GetDomainCommand({ + identifier: domainId, + }) + const response = await datazoneCustomClient.send(command) this.logger.debug(`DataZoneCustomClientHelper: Successfully retrieved domain: ${domainId}`) return response @@ -293,7 +303,7 @@ export class DataZoneCustomClientHelper { maxResults?: number nextToken?: string } - ): Promise<{ items: DataZoneCustomClient.Types.GroupProfileSummary[]; nextToken?: string }> { + ): Promise<{ items: GroupProfileSummary[]; nextToken?: string }> { try { this.logger.debug( `DataZoneCustomClientHelper: Searching group profiles in domain ${domainIdentifier} with groupType: ${options?.groupType}, searchText: ${options?.searchText}` @@ -301,17 +311,15 @@ export class DataZoneCustomClientHelper { const datazoneCustomClient = await this.getDataZoneCustomClient() - // Build the request parameters - const params: DataZoneCustomClient.Types.SearchGroupProfilesInput = { + // Call DataZone API to search group profiles + const command = new SearchGroupProfilesCommand({ domainIdentifier, - groupType: options?.groupType as DataZoneCustomClient.Types.GroupSearchType, + groupType: options?.groupType as GroupSearchType, searchText: options?.searchText, maxResults: options?.maxResults, nextToken: options?.nextToken, - } - - // Call DataZone API to search group profiles - const response = await datazoneCustomClient.searchGroupProfiles(params).promise() + }) + const response = await datazoneCustomClient.send(command) const items = response.items || [] @@ -342,7 +350,7 @@ export class DataZoneCustomClientHelper { maxResults?: number nextToken?: string } - ): Promise<{ items: DataZoneCustomClient.Types.UserProfileSummary[]; nextToken?: string }> { + ): Promise<{ items: UserProfileSummary[]; nextToken?: string }> { try { this.logger.debug( `DataZoneCustomClientHelper: Searching user profiles in domain ${domainIdentifier} with userType: ${options.userType}, searchText: ${options.searchText}` @@ -350,17 +358,15 @@ export class DataZoneCustomClientHelper { const datazoneCustomClient = await this.getDataZoneCustomClient() - // Build the request parameters - const params: DataZoneCustomClient.Types.SearchUserProfilesInput = { + // Call DataZone API to search user profiles + const command = new SearchUserProfilesCommand({ domainIdentifier, - userType: options.userType as DataZoneCustomClient.Types.UserSearchType, + userType: options.userType as UserSearchType, searchText: options.searchText, maxResults: options.maxResults, nextToken: options.nextToken, - } - - // Call DataZone API to search user profiles - const response = await datazoneCustomClient.searchUserProfiles(params).promise() + }) + const response = await datazoneCustomClient.send(command) const items = response.items || [] diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json b/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json deleted file mode 100644 index 8414d3340b8..00000000000 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json +++ /dev/null @@ -1,919 +0,0 @@ -{ - "version": "2.0", - "metadata": { - "apiVersion": "2018-05-10", - "auth": ["aws.auth#sigv4"], - "endpointPrefix": "datazone", - "protocol": "rest-json", - "protocols": ["rest-json"], - "serviceFullName": "Amazon DataZone", - "serviceId": "DataZone", - "signatureVersion": "v4", - "signingName": "datazone", - "uid": "datazone-2018-05-10" - }, - "operations": { - "GetDomain": { - "name": "GetDomain", - "http": { - "method": "GET", - "requestUri": "/v2/domains/{identifier}", - "responseCode": 200 - }, - "input": { - "shape": "GetDomainInput" - }, - "output": { - "shape": "GetDomainOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ServiceQuotaExceededException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ], - "readonly": true - }, - "ListDomains": { - "name": "ListDomains", - "http": { - "method": "GET", - "requestUri": "/v2/domains", - "responseCode": 200 - }, - "input": { - "shape": "ListDomainsInput" - }, - "output": { - "shape": "ListDomainsOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ServiceQuotaExceededException" - }, - { - "shape": "ConflictException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ], - "readonly": true - }, - "SearchGroupProfiles": { - "name": "SearchGroupProfiles", - "http": { - "method": "POST", - "requestUri": "/v2/domains/{domainIdentifier}/search-group-profiles", - "responseCode": 200 - }, - "input": { - "shape": "SearchGroupProfilesInput" - }, - "output": { - "shape": "SearchGroupProfilesOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ConflictException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ] - }, - "SearchUserProfiles": { - "name": "SearchUserProfiles", - "http": { - "method": "POST", - "requestUri": "/v2/domains/{domainIdentifier}/search-user-profiles", - "responseCode": 200 - }, - "input": { - "shape": "SearchUserProfilesInput" - }, - "output": { - "shape": "SearchUserProfilesOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ConflictException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ] - } - }, - "shapes": { - "GetDomainInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DomainId": { - "type": "string", - "pattern": "dzd[-_][a-zA-Z0-9_-]{1,36}" - }, - "GetDomainOutput": { - "type": "structure", - "required": ["id", "status"], - "members": { - "id": { - "shape": "DomainId" - }, - "rootDomainUnitId": { - "shape": "DomainUnitId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "singleSignOn": { - "shape": "SingleSignOn" - }, - "domainExecutionRole": { - "shape": "RoleArn" - }, - "arn": { - "shape": "String" - }, - "kmsKeyIdentifier": { - "shape": "KmsKeyArn" - }, - "status": { - "shape": "DomainStatus" - }, - "failureReasons": { - "shape": "FailureReasonsList" - }, - "portalUrl": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "tags": { - "shape": "Tags" - }, - "provisionStatus": { - "shape": "ProvisionStatus", - "internalonly": true - }, - "domainVersion": { - "shape": "DomainVersion" - }, - "domainServiceRole": { - "shape": "RoleArn", - "deprecated": true, - "internalonly": true - }, - "serviceRole": { - "shape": "RoleArn" - }, - "supportedDomainVersions": { - "shape": "SupportedDomainVersions", - "internalonly": true - }, - "iamSignIns": { - "shape": "IamSignIns", - "internalonly": true - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - } - } - }, - "DomainUnitId": { - "type": "string", - "max": 256, - "min": 1, - "pattern": "[a-z0-9_\\-]+" - }, - "String": { - "type": "string" - }, - "SingleSignOn": { - "type": "structure", - "members": { - "type": { - "shape": "AuthType" - }, - "userAssignment": { - "shape": "UserAssignment" - }, - "idcInstanceArn": { - "shape": "SingleSignOnIdcInstanceArnString" - }, - "ssoUrl": { - "shape": "String", - "internalonly": true - }, - "idcApplicationArn": { - "shape": "String", - "internalonly": true - } - } - }, - "AuthType": { - "type": "string", - "enum": ["IAM_IDC", "DISABLED", "SAML"] - }, - "UserAssignment": { - "type": "string", - "enum": ["AUTOMATIC", "MANUAL"] - }, - "SingleSignOnIdcInstanceArnString": { - "type": "string", - "pattern": ".*arn:(aws|aws-us-gov|aws-cn|aws-iso|aws-iso-b):sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}.*" - }, - "RoleArn": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:role(/[a-zA-Z0-9+=,.@_-]+)*/[a-zA-Z0-9+=,.@_-]+" - }, - "KmsKeyArn": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "arn:aws(|-cn|-us-gov):kms:[a-zA-Z0-9-]*:[0-9]{12}:key/[a-zA-Z0-9-]{36}" - }, - "DomainStatus": { - "type": "string", - "enum": ["CREATING", "AVAILABLE", "CREATION_FAILED", "DELETING", "DELETED", "DELETION_FAILED"] - }, - "FailureReasonsList": { - "type": "list", - "member": { - "shape": "FailureReason" - } - }, - "FailureReason": { - "type": "structure", - "members": { - "code": { - "shape": "String" - }, - "message": { - "shape": "String" - } - } - }, - "CreatedAt": { - "type": "timestamp" - }, - "UpdatedAt": { - "type": "timestamp" - }, - "Tags": { - "type": "map", - "key": { - "shape": "TagKey" - }, - "value": { - "shape": "TagValue" - } - }, - "TagKey": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\w \\.:/=+@-]+" - }, - "TagValue": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\w \\.:/=+@-]*" - }, - "ProvisionStatus": { - "type": "string", - "enum": [ - "PROVISIONING", - "PROVISIONING_PROJECT_PROFILES", - "PROVISIONING_MODEL_ASSETS", - "PROVISION_FAILED", - "PROVISION_COMPLETE" - ] - }, - "DomainVersion": { - "type": "string", - "enum": ["V1", "V2"] - }, - "SupportedDomainVersions": { - "type": "list", - "member": { - "shape": "DomainVersion" - } - }, - "IamSignIns": { - "type": "list", - "member": { - "shape": "IamSignIn" - }, - "internalonly": true - }, - "IamSignIn": { - "type": "string", - "enum": ["IAM_ROLE", "IAM_USER"], - "internalonly": true - }, - "Preferences": { - "type": "map", - "key": { - "shape": "PreferenceKey" - }, - "value": { - "shape": "PreferenceValue" - }, - "max": 10, - "min": 0 - }, - "PreferenceKey": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\w \\.:/=+@-]+" - }, - "PreferenceValue": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\w \\.:/=+@-]*" - }, - "InternalServerException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 500 - }, - "exception": true, - "fault": true, - "retryable": { - "throttling": false - } - }, - "ErrorMessage": { - "type": "string" - }, - "ResourceNotFoundException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 404, - "senderFault": true - }, - "exception": true - }, - "AccessDeniedException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 403, - "senderFault": true - }, - "exception": true - }, - "ThrottlingException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 429, - "senderFault": true - }, - "exception": true, - "retryable": { - "throttling": false - } - }, - "ServiceQuotaExceededException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 402, - "senderFault": true - }, - "exception": true - }, - "ValidationException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "UnauthorizedException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 401, - "senderFault": true - }, - "exception": true - }, - "ListDomainsInput": { - "type": "structure", - "members": { - "status": { - "shape": "DomainStatus", - "location": "querystring", - "locationName": "status" - }, - "maxResults": { - "shape": "MaxResultsForListDomains", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "MaxResultsForListDomains": { - "type": "integer", - "box": true, - "max": 25, - "min": 1 - }, - "PaginationToken": { - "type": "string", - "max": 8192, - "min": 1 - }, - "ListDomainsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "DomainSummaries" - }, - "domains": { - "shape": "DomainSummaries", - "internalonly": true - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "DomainSummaries": { - "type": "list", - "member": { - "shape": "DomainSummary" - } - }, - "DomainSummary": { - "type": "structure", - "required": ["id", "name", "arn", "managedAccountId", "status", "createdAt"], - "members": { - "id": { - "shape": "DomainId" - }, - "name": { - "shape": "DomainName" - }, - "description": { - "shape": "DomainDescription" - }, - "arn": { - "shape": "String" - }, - "managedAccountId": { - "shape": "String" - }, - "status": { - "shape": "DomainStatus" - }, - "portalUrl": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "domainVersion": { - "shape": "DomainVersion" - }, - "iamSignIns": { - "shape": "IamSignIns", - "internalonly": true - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - } - } - }, - "DomainName": { - "type": "string", - "sensitive": true - }, - "DomainDescription": { - "type": "string", - "sensitive": true - }, - "ConflictException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - }, - "reason": { - "shape": "ConflictReason" - }, - "details": { - "shape": "ConflictDetails" - } - }, - "error": { - "httpStatusCode": 409, - "senderFault": true - }, - "exception": true - }, - "ConflictReason": { - "type": "string", - "enum": ["RESOURCE_LOCKED"] - }, - "ConflictDetails": { - "type": "structure", - "members": { - "lock": { - "shape": "LockDetails" - } - }, - "union": true - }, - "LockDetails": { - "type": "structure", - "required": ["lockedBy", "lockedAt", "lockExpiresAt"], - "members": { - "lockedBy": { - "shape": "String" - }, - "lockedAt": { - "shape": "Timestamp" - }, - "lockExpiresAt": { - "shape": "Timestamp" - } - } - }, - "Timestamp": { - "type": "timestamp" - }, - "SearchGroupProfilesInput": { - "type": "structure", - "required": ["domainIdentifier", "groupType"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "groupType": { - "shape": "GroupSearchType" - }, - "searchText": { - "shape": "GroupSearchText" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "GroupSearchType": { - "type": "string", - "enum": ["SSO_GROUP", "DATAZONE_SSO_GROUP", "IAM_ROLE_SESSION_GROUP"] - }, - "GroupSearchText": { - "type": "string", - "max": 1024, - "min": 0, - "sensitive": true - }, - "MaxResults": { - "type": "integer", - "box": true, - "max": 50, - "min": 1 - }, - "SearchGroupProfilesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "GroupProfileSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "GroupProfileSummaries": { - "type": "list", - "member": { - "shape": "GroupProfileSummary" - } - }, - "GroupProfileSummary": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GroupProfileId" - }, - "status": { - "shape": "GroupProfileStatus" - }, - "groupName": { - "shape": "GroupProfileName" - }, - "rolePrincipalArn": { - "shape": "String", - "internalonly": true - }, - "rolePrincipalId": { - "shape": "String", - "internalonly": true - } - } - }, - "GroupProfileId": { - "type": "string", - "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" - }, - "GroupProfileStatus": { - "type": "string", - "enum": ["ASSIGNED", "NOT_ASSIGNED"] - }, - "GroupProfileName": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "[a-zA-Z_0-9+=,.@-]+", - "sensitive": true - }, - "SearchUserProfilesInput": { - "type": "structure", - "required": ["domainIdentifier", "userType"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "userType": { - "shape": "UserSearchType" - }, - "searchText": { - "shape": "UserSearchText" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "UserSearchType": { - "type": "string", - "enum": ["SSO_USER", "DATAZONE_USER", "DATAZONE_SSO_USER", "DATAZONE_IAM_USER"] - }, - "UserSearchText": { - "type": "string", - "max": 1024, - "min": 0, - "sensitive": true - }, - "SearchUserProfilesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "UserProfileSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "UserProfileSummaries": { - "type": "list", - "member": { - "shape": "UserProfileSummary" - } - }, - "UserProfileSummary": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "UserProfileId" - }, - "type": { - "shape": "UserProfileType" - }, - "status": { - "shape": "UserProfileStatus" - }, - "details": { - "shape": "UserProfileDetails" - } - } - }, - "UserProfileId": { - "type": "string", - "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" - }, - "UserProfileType": { - "type": "string", - "enum": ["IAM", "SSO", "SAML"] - }, - "UserProfileStatus": { - "type": "string", - "enum": ["ASSIGNED", "NOT_ASSIGNED", "ACTIVATED", "DEACTIVATED", "ARCHIVED"] - }, - "UserProfileDetails": { - "type": "structure", - "members": { - "iam": { - "shape": "IamUserProfileDetails" - }, - "sso": { - "shape": "SsoUserProfileDetails" - } - }, - "union": true - }, - "IamUserProfileDetails": { - "type": "structure", - "members": { - "arn": { - "shape": "String" - }, - "principalId": { - "shape": "String" - } - } - }, - "SsoUserProfileDetails": { - "type": "structure", - "members": { - "username": { - "shape": "UserProfileName" - }, - "firstName": { - "shape": "FirstName" - }, - "lastName": { - "shape": "LastName" - }, - "email": { - "shape": "String", - "internalonly": true - }, - "userId": { - "shape": "String", - "internalonly": true - } - } - }, - "UserProfileName": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "[a-zA-Z_0-9+=,.@-]+", - "sensitive": true - }, - "FirstName": { - "type": "string", - "sensitive": true - }, - "LastName": { - "type": "string", - "sensitive": true - } - } -} diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts index 59dfd0c7d97..4cb806f104c 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts @@ -6,9 +6,15 @@ import * as assert from 'assert' import * as sinon from 'sinon' import { DataZoneCustomClientHelper } from '../../../../sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper' -import * as DataZoneCustomClient from '../../../../sagemakerunifiedstudio/shared/client/datazonecustomclient' +import { + DomainSummary, + ListDomainsCommand, + GetDomainCommand, + SearchGroupProfilesCommand, + SearchUserProfilesCommand, +} from '@amzn/datazone-custom-client' -type DataZoneDomain = DataZoneCustomClient.Types.DomainSummary +type DataZoneDomain = DomainSummary describe('DataZoneCustomClientHelper', () => { let client: DataZoneCustomClientHelper @@ -103,9 +109,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - listDomains: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(ListDomainsCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -124,6 +128,12 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.nextToken, 'next-token') assert.ok(result.domains[0].createdAt instanceof Date) assert.ok(result.domains[0].lastUpdatedAt instanceof Date) + + // Verify API was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.maxResults, 10) + assert.strictEqual(command.input.status, 'AVAILABLE') }) it('should handle empty results', async () => { @@ -133,9 +143,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - listDomains: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(ListDomainsCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -369,9 +377,7 @@ describe('DataZoneCustomClientHelper', () => { preferences: { DOMAIN_MODE: 'EXPRESS' }, } const mockDataZoneClient = { - getDomain: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(GetDomainCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -387,11 +393,10 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.domainVersion, '1.0') assert.deepStrictEqual(result.preferences, { DOMAIN_MODE: 'EXPRESS' }) - // Verify the API was called with correct parameters - assert.ok(mockDataZoneClient.getDomain.calledOnce) - assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { - identifier: mockDomainId, - }) + // Verify the API was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.identifier, mockDomainId) }) it('should handle API errors when getting domain', async () => { @@ -399,9 +404,7 @@ describe('DataZoneCustomClientHelper', () => { const error = new Error('Domain not found') const mockDataZoneClient = { - getDomain: sinon.stub().returns({ - promise: () => Promise.reject(error), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(GetDomainCommand)).rejects(error), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -409,10 +412,9 @@ describe('DataZoneCustomClientHelper', () => { await assert.rejects(() => client.getDomain(mockDomainId), error) // Verify the API was called with correct parameters - assert.ok(mockDataZoneClient.getDomain.calledOnce) - assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { - identifier: mockDomainId, - }) + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.identifier, mockDomainId) }) }) @@ -425,7 +427,7 @@ describe('DataZoneCustomClientHelper', () => { { domainId: mockDomainId, id: 'gp_profile1', - status: 'ACTIVATED', + status: 'ASSIGNED', groupName: 'AdminGroup', rolePrincipalArn: 'arn:aws:iam::123456789012:role/AdminRole', rolePrincipalId: 'AIDAI123456789EXAMPLE', @@ -433,7 +435,7 @@ describe('DataZoneCustomClientHelper', () => { { domainId: mockDomainId, id: 'gp_profile2', - status: 'ACTIVATED', + status: 'ASSIGNED', groupName: 'DeveloperGroup', rolePrincipalArn: 'arn:aws:iam::123456789012:role/DeveloperRole', rolePrincipalId: 'AIDAI987654321EXAMPLE', @@ -443,9 +445,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchGroupProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchGroupProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -461,12 +461,12 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.items[1].id, 'gp_profile2') assert.strictEqual(result.nextToken, 'next-token') - // Verify API was called with correct parameters - assert.ok(mockDataZoneClient.searchGroupProfiles.calledOnce) - const callArgs = mockDataZoneClient.searchGroupProfiles.firstCall.args[0] - assert.strictEqual(callArgs.domainIdentifier, mockDomainId) - assert.strictEqual(callArgs.groupType, 'IAM_ROLE_SESSION_GROUP') - assert.strictEqual(callArgs.maxResults, 50) + // Verify API was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.domainIdentifier, mockDomainId) + assert.strictEqual(command.input.groupType, 'IAM_ROLE_SESSION_GROUP') + assert.strictEqual(command.input.maxResults, 50) }) it('should handle empty results', async () => { @@ -476,9 +476,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchGroupProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchGroupProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -492,9 +490,7 @@ describe('DataZoneCustomClientHelper', () => { it('should handle API errors', async () => { const error = new Error('API Error') const mockDataZoneClient = { - searchGroupProfiles: sinon.stub().returns({ - promise: () => Promise.reject(error), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchGroupProfilesCommand)).rejects(error), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -508,7 +504,7 @@ describe('DataZoneCustomClientHelper', () => { { domainId: mockDomainId, id: 'gp_profile3', - status: 'ACTIVATED', + status: 'ASSIGNED', groupName: 'TestGroup', rolePrincipalArn: 'arn:aws:iam::123456789012:role/TestRole', rolePrincipalId: 'AIDAI111111111EXAMPLE', @@ -518,9 +514,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchGroupProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchGroupProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -532,9 +526,11 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.items.length, 1) assert.strictEqual(result.nextToken, undefined) - // Verify nextToken was passed - const callArgs = mockDataZoneClient.searchGroupProfiles.firstCall.args[0] - assert.strictEqual(callArgs.nextToken, 'previous-token') + // Verify send was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.domainIdentifier, mockDomainId) + assert.strictEqual(command.input.nextToken, 'previous-token') }) }) @@ -573,9 +569,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchUserProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchUserProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -591,12 +585,12 @@ describe('DataZoneCustomClientHelper', () => { assert.strictEqual(result.items[1].id, 'up_user2') assert.strictEqual(result.nextToken, 'next-token') - // Verify API was called with correct parameters - assert.ok(mockDataZoneClient.searchUserProfiles.calledOnce) - const callArgs = mockDataZoneClient.searchUserProfiles.firstCall.args[0] - assert.strictEqual(callArgs.domainIdentifier, mockDomainId) - assert.strictEqual(callArgs.userType, 'DATAZONE_IAM_USER') - assert.strictEqual(callArgs.maxResults, 50) + // Verify API was called with correct command type and parameters + assert.ok(mockDataZoneClient.send.calledOnce) + const command = mockDataZoneClient.send.firstCall.args[0] + assert.strictEqual(command.input.domainIdentifier, mockDomainId) + assert.strictEqual(command.input.userType, 'DATAZONE_IAM_USER') + assert.strictEqual(command.input.maxResults, 50) }) it('should handle SSO user profiles', async () => { @@ -620,9 +614,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchUserProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchUserProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -643,9 +635,7 @@ describe('DataZoneCustomClientHelper', () => { } const mockDataZoneClient = { - searchUserProfiles: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchUserProfilesCommand)).resolves(mockResponse), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -661,9 +651,7 @@ describe('DataZoneCustomClientHelper', () => { it('should handle API errors', async () => { const error = new Error('API Error') const mockDataZoneClient = { - searchUserProfiles: sinon.stub().returns({ - promise: () => Promise.reject(error), - }), + send: sinon.stub().withArgs(sinon.match.instanceOf(SearchUserProfilesCommand)).rejects(error), } sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) @@ -689,7 +677,7 @@ describe('DataZoneCustomClientHelper', () => { { id: 'gp_profile1', rolePrincipalArn: mockRoleArn, - status: 'ACTIVATED', + status: 'ASSIGNED', }, ], nextToken: undefined, @@ -710,7 +698,7 @@ describe('DataZoneCustomClientHelper', () => { { id: 'gp_profile1', rolePrincipalArn: 'arn:aws:iam::123456789012:role/OtherRole', - status: 'ACTIVATED', + status: 'ASSIGNED', }, ], nextToken: undefined, @@ -861,10 +849,8 @@ describe('DataZoneCustomClientHelper', () => { items: [ { id: 'up_user1', - status: 'ACTIVATED', - details: { - // No iam field - }, + status: 'ASSIGNED', + details: undefined, }, ], nextToken: undefined, @@ -947,7 +933,7 @@ describe('DataZoneCustomClientHelper', () => { { id: mockGroupProfileId, rolePrincipalArn: mockRoleArn, - status: 'ACTIVATED', + status: 'ASSIGNED', }, ], nextToken: undefined, diff --git a/src.gen/@amzn/datazone-custom-client/3.0.0.tgz b/src.gen/@amzn/datazone-custom-client/3.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5fd87b8fe4229be94ce747ce7f4608374d981b12 GIT binary patch literal 46241 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 Qe&~PyKQ0P<3ILo40D4d0hX4Qo literal 0 HcmV?d00001