From 450d100c39839a1b158fb4b0d0ef07c115621caf Mon Sep 17 00:00:00 2001 From: Max <53796487+dyedwiper@users.noreply.github.com> Date: Wed, 29 Jan 2025 14:13:52 +0100 Subject: [PATCH 1/6] BC-8861 Revert upgrade of aws dependencies (#5472) --- package-lock.json | 5103 +++++++++++++++++++++++++++++++-------------- package.json | 4 +- 2 files changed, 3547 insertions(+), 1560 deletions(-) diff --git a/package-lock.json b/package-lock.json index 091401d6d4..2f4a532a23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,8 @@ "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { - "@aws-sdk/client-s3": "^3.731.1", - "@aws-sdk/lib-storage": "^3.731.1", + "@aws-sdk/client-s3": "3.617.0", + "@aws-sdk/lib-storage": "3.617.0", "@feathersjs/adapter-commons": "^5.0.31", "@feathersjs/authentication": "^5.0.31", "@feathersjs/authentication-local": "^5.0.31", @@ -864,70 +864,72 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.731.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.731.1.tgz", - "integrity": "sha512-Ab2PA/8Th6JkurCkxnQJZHPE/JnnSsX/XHQzirkQb+JpKOyWMRC/YZUBfAaiwhxqX65RHgklrwil+UbFl4TtAQ==", + "version": "3.617.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.617.0.tgz", + "integrity": "sha512-0f954CU42BhPFVRQCCBc1jAvV9N4XW9I3D4h7tJ8tzxft7fS62MSJkgxRIXNKgWKLeGR7DUbz+XGZ1R5e7pyjA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.731.0", - "@aws-sdk/credential-provider-node": "3.731.1", - "@aws-sdk/middleware-bucket-endpoint": "3.731.0", - "@aws-sdk/middleware-expect-continue": "3.731.0", - "@aws-sdk/middleware-flexible-checksums": "3.731.0", - "@aws-sdk/middleware-host-header": "3.731.0", - "@aws-sdk/middleware-location-constraint": "3.731.0", - "@aws-sdk/middleware-logger": "3.731.0", - "@aws-sdk/middleware-recursion-detection": "3.731.0", - "@aws-sdk/middleware-sdk-s3": "3.731.0", - "@aws-sdk/middleware-ssec": "3.731.0", - "@aws-sdk/middleware-user-agent": "3.731.0", - "@aws-sdk/region-config-resolver": "3.731.0", - "@aws-sdk/signature-v4-multi-region": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@aws-sdk/util-endpoints": "3.731.0", - "@aws-sdk/util-user-agent-browser": "3.731.0", - "@aws-sdk/util-user-agent-node": "3.731.0", - "@aws-sdk/xml-builder": "3.723.0", - "@smithy/config-resolver": "^4.0.0", - "@smithy/core": "^3.0.0", - "@smithy/eventstream-serde-browser": "^4.0.0", - "@smithy/eventstream-serde-config-resolver": "^4.0.0", - "@smithy/eventstream-serde-node": "^4.0.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/hash-blob-browser": "^4.0.0", - "@smithy/hash-node": "^4.0.0", - "@smithy/hash-stream-node": "^4.0.0", - "@smithy/invalid-dependency": "^4.0.0", - "@smithy/md5-js": "^4.0.0", - "@smithy/middleware-content-length": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/middleware-retry": "^4.0.0", - "@smithy/middleware-serde": "^4.0.0", - "@smithy/middleware-stack": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/url-parser": "^4.0.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.0", - "@smithy/util-defaults-mode-node": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-retry": "^4.0.0", - "@smithy/util-stream": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.0", + "@aws-sdk/client-sso-oidc": "3.616.0", + "@aws-sdk/client-sts": "3.616.0", + "@aws-sdk/core": "3.616.0", + "@aws-sdk/credential-provider-node": "3.616.0", + "@aws-sdk/middleware-bucket-endpoint": "3.616.0", + "@aws-sdk/middleware-expect-continue": "3.616.0", + "@aws-sdk/middleware-flexible-checksums": "3.616.0", + "@aws-sdk/middleware-host-header": "3.616.0", + "@aws-sdk/middleware-location-constraint": "3.609.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.616.0", + "@aws-sdk/middleware-sdk-s3": "3.617.0", + "@aws-sdk/middleware-signing": "3.616.0", + "@aws-sdk/middleware-ssec": "3.609.0", + "@aws-sdk/middleware-user-agent": "3.616.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/signature-v4-multi-region": "3.617.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@aws-sdk/xml-builder": "3.609.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.2.7", + "@smithy/eventstream-serde-browser": "^3.0.4", + "@smithy/eventstream-serde-config-resolver": "^3.0.3", + "@smithy/eventstream-serde-node": "^3.0.4", + "@smithy/fetch-http-handler": "^3.2.2", + "@smithy/hash-blob-browser": "^3.1.2", + "@smithy/hash-node": "^3.0.3", + "@smithy/hash-stream-node": "^3.1.2", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/md5-js": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.4", + "@smithy/middleware-endpoint": "^3.0.5", + "@smithy/middleware-retry": "^3.0.10", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.3", + "@smithy/protocol-http": "^4.0.4", + "@smithy/smithy-client": "^3.1.8", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.10", + "@smithy/util-defaults-mode-node": "^3.0.10", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.0", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-crypto/sha256-browser": { @@ -1006,286 +1008,404 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.731.0.tgz", - "integrity": "sha512-O4C/UYGgqMsBg21MMApFdgyh8BX568hQhbdoNFmRVTBoSnCZ3w+H4a1wBPX4Gyl0NX+ab6Xxo9rId8HiyPXJ0A==", + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.616.0.tgz", + "integrity": "sha512-hwW0u1f8U4dSloAe61/eupUiGd5Q13B72BuzGxvRk0cIpYX/2m0KBG8DDl7jW1b2QQ+CflTLpG2XUf2+vRJxGA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.731.0", - "@aws-sdk/middleware-host-header": "3.731.0", - "@aws-sdk/middleware-logger": "3.731.0", - "@aws-sdk/middleware-recursion-detection": "3.731.0", - "@aws-sdk/middleware-user-agent": "3.731.0", - "@aws-sdk/region-config-resolver": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@aws-sdk/util-endpoints": "3.731.0", - "@aws-sdk/util-user-agent-browser": "3.731.0", - "@aws-sdk/util-user-agent-node": "3.731.0", - "@smithy/config-resolver": "^4.0.0", - "@smithy/core": "^3.0.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/hash-node": "^4.0.0", - "@smithy/invalid-dependency": "^4.0.0", - "@smithy/middleware-content-length": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/middleware-retry": "^4.0.0", - "@smithy/middleware-serde": "^4.0.0", - "@smithy/middleware-stack": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/url-parser": "^4.0.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.0", - "@smithy/util-defaults-mode-node": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-retry": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.616.0", + "@aws-sdk/middleware-host-header": "3.616.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.616.0", + "@aws-sdk/middleware-user-agent": "3.616.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.2.7", + "@smithy/fetch-http-handler": "^3.2.2", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.4", + "@smithy/middleware-endpoint": "^3.0.5", + "@smithy/middleware-retry": "^3.0.10", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.3", + "@smithy/protocol-http": "^4.0.4", + "@smithy/smithy-client": "^3.1.8", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.10", + "@smithy/util-defaults-mode-node": "^3.0.10", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.731.0.tgz", - "integrity": "sha512-h0WWZg4QMLgFVyIvQrC43zpVqsUWg1mPM1clpogP43B8+wEhDEQ4qWRzvFs3dQ4cqx/FLyDUZZF4cqgd94z7kw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.616.0.tgz", + "integrity": "sha512-YY1hpYS/G1uRGjQf88dL8VLHkP/IjGxKeXdhy+JnzMdCkAWl3V9j0fEALw40NZe0x79gr6R2KUOUH/IKYQfUmg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.616.0", + "@aws-sdk/credential-provider-node": "3.616.0", + "@aws-sdk/middleware-host-header": "3.616.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.616.0", + "@aws-sdk/middleware-user-agent": "3.616.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.2.7", + "@smithy/fetch-http-handler": "^3.2.2", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.4", + "@smithy/middleware-endpoint": "^3.0.5", + "@smithy/middleware-retry": "^3.0.10", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.3", + "@smithy/protocol-http": "^4.0.4", + "@smithy/smithy-client": "^3.1.8", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.10", + "@smithy/util-defaults-mode-node": "^3.0.10", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.616.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.731.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.731.1.tgz", - "integrity": "sha512-0M0ejuqW8iHNcTH2ZXSY9m+I7Y06qVkj6k3vfQU9XaB//mTUCxxfGfqWAtgfr7Yi73egABTcPc0jyPdcvSW4Kw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.616.0.tgz", + "integrity": "sha512-FP7i7hS5FpReqnysQP1ukQF1OUWy8lkomaOnbu15H415YUrfCp947SIx6+BItjmx+esKxPkEjh/fbCVzw2D6hQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.731.0", - "@aws-sdk/credential-provider-env": "3.731.0", - "@aws-sdk/credential-provider-http": "3.731.0", - "@aws-sdk/credential-provider-process": "3.731.0", - "@aws-sdk/credential-provider-sso": "3.731.1", - "@aws-sdk/credential-provider-web-identity": "3.731.1", - "@aws-sdk/nested-clients": "3.731.1", - "@aws-sdk/types": "3.731.0", - "@smithy/credential-provider-imds": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.616.0", + "@aws-sdk/core": "3.616.0", + "@aws-sdk/credential-provider-node": "3.616.0", + "@aws-sdk/middleware-host-header": "3.616.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.616.0", + "@aws-sdk/middleware-user-agent": "3.616.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.2.7", + "@smithy/fetch-http-handler": "^3.2.2", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.4", + "@smithy/middleware-endpoint": "^3.0.5", + "@smithy/middleware-retry": "^3.0.10", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.3", + "@smithy/protocol-http": "^4.0.4", + "@smithy/smithy-client": "^3.1.8", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.10", + "@smithy/util-defaults-mode-node": "^3.0.10", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.731.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.731.1.tgz", - "integrity": "sha512-5c0ZiagMTPmWilXNffeXJCLoCEz97jilHr3QJWwf2GaTay4tzN+Ld71rpdfEenzUR7fuxEWFfVlwQbFOzFNYHg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.609.0.tgz", + "integrity": "sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.731.0", - "@aws-sdk/credential-provider-http": "3.731.0", - "@aws-sdk/credential-provider-ini": "3.731.1", - "@aws-sdk/credential-provider-process": "3.731.0", - "@aws-sdk/credential-provider-sso": "3.731.1", - "@aws-sdk/credential-provider-web-identity": "3.731.1", - "@aws-sdk/types": "3.731.0", - "@smithy/credential-provider-imds": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.616.0.tgz", + "integrity": "sha512-5gQdMr9cca3xV7FF2SxpxWGH2t6+t4o+XBGiwsHm8muEjf4nUmw7Ij863x25Tjt2viPYV0UStczSb5Sihp7bkA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.609.0", + "@aws-sdk/credential-provider-http": "3.616.0", + "@aws-sdk/credential-provider-process": "3.614.0", + "@aws-sdk/credential-provider-sso": "3.616.0", + "@aws-sdk/credential-provider-web-identity": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.616.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.616.0.tgz", + "integrity": "sha512-Se+u6DAxjDPjKE3vX1X2uxjkWgGq69BTo0uTB0vDUiWwBVgh16s9BsBhSAlKEH1CCbbJHvOg4YdTrzjwzqyClg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.609.0", + "@aws-sdk/credential-provider-http": "3.616.0", + "@aws-sdk/credential-provider-ini": "3.616.0", + "@aws-sdk/credential-provider-process": "3.614.0", + "@aws-sdk/credential-provider-sso": "3.616.0", + "@aws-sdk/credential-provider-web-identity": "3.609.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.731.0.tgz", - "integrity": "sha512-6yNMY6q3xHLbs2f2+C6GhvMrjTgtFBiPJJqKaPLsTIhlTRvh4sK8pGm3ITcma0jOxtPDIuoPfBAV8N8XVMBlZg==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.614.0.tgz", + "integrity": "sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.731.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.731.1.tgz", - "integrity": "sha512-p1tp+rMUf5YNQLr8rVRmDgNtKGYLL0KCdq3K2hwwvFnx9MjReF1sA4lfm3xWsxBQM+j3QN9AvMQqBzDJ+NOSdw==", + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.616.0.tgz", + "integrity": "sha512-3rsWs9GBi8Z8Gps5ROwqguxtw+J6OIg1vawZMLRNMqqZoBvbOToe9wEnpid8ylU+27+oG8uibJNlNuRyXApUjw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.731.0", - "@aws-sdk/core": "3.731.0", - "@aws-sdk/token-providers": "3.731.1", - "@aws-sdk/types": "3.731.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/client-sso": "3.616.0", + "@aws-sdk/token-providers": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.731.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.731.1.tgz", - "integrity": "sha512-+ynAvEGWDR5ZJFxgpwwzhvlQ3WQ7BleWXU6JwpIw3yFrD4eZEn85b8DZC1aEz7C9kb1HSV6B3gpqHqlyS6wj8g==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.609.0.tgz", + "integrity": "sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.731.0", - "@aws-sdk/nested-clients": "3.731.1", - "@aws-sdk/types": "3.731.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.609.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.731.0.tgz", - "integrity": "sha512-ndAJsm5uWPPJRZowLKpB1zuL17qWlWVtCJP4I/ynBkq1PU1DijDXBul2UZaG6Mpvsgms1NXo/h9noHuK7T3v8w==", + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.616.0.tgz", + "integrity": "sha512-mhNfHuGhCDZwYCABebaOvTgOM44UCZZRq2cBpgPZLVKP0ydAv5aFHXv01goexxXHqgHoEGx0uXWxlw0s2EpFDg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.0.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.731.0.tgz", - "integrity": "sha512-IIZrOdjbY2vKzPJPrwE7FoFQCIPEL6UqURi8LEaiVyCag4p2fvaTN5pgKuQtGC2+iYd/HHcGT4qn2bAqF5Jmmw==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", + "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.731.0.tgz", - "integrity": "sha512-y6FLASB1iKWuR5tUipMyo77bt0lEl3OnCrrd2xw/H24avq1HhJjjPR0HHhJE6QKJzF/FYXeV88tcyPSMe32VDw==", + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.616.0.tgz", + "integrity": "sha512-LQKAcrZRrR9EGez4fdCIVjdn0Ot2HMN12ChnoMGEU6oIxnQ2aSC7iASFFCV39IYfeMh7iSCPj7Wopqw8rAouzg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.0.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-signing": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.616.0.tgz", + "integrity": "sha512-wwzZFlXyURwo40oz1NmufreQa5DqwnCF8hR8tIP5+oKCyhbkmlmv8xG4Wn51bzY2WEbQhvFebgZSFTEvelCoCg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.0.4", + "@smithy/signature-v4": "^4.0.0", + "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.731.0.tgz", - "integrity": "sha512-Ngr2Gz0aec/uduoKaO3srN52SYkEHndYtFzkK/gDUyQwQzi4ha2eIisxPiuHEX6RvXT31V9ouqn/YtVkt0R76A==", + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.616.0.tgz", + "integrity": "sha512-iMcAb4E+Z3vuEcrDsG6T2OBNiqWAquwahP9qepHqfmnmJqHr1mSHtXDYTGBNid31+621sUQmneUQ+fagpGAe4w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@aws-sdk/util-endpoints": "3.731.0", - "@smithy/core": "^3.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.614.0", + "@smithy/protocol-http": "^4.0.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.731.0.tgz", - "integrity": "sha512-riztxTAfncFS9yQWcBJffGgOgLoKSa63ph+rxWJxKl6BHAmWEvHICj1qDcVmnWfIcvJ5cClclY75l9qKaUH7rQ==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", + "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/types": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "@smithy/util-endpoints": "^2.0.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.731.0.tgz", - "integrity": "sha512-EnYXxTkCNCjTTBjW/pelRPv4Thsi9jepoB6qQjPMA9/ixrZ71BhhQecz9kgqzZLR9BPCwb6hgJ/Yd702jqJ4aQ==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", + "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.731.0.tgz", - "integrity": "sha512-Rze78Ym5Bx7aWMvmZE2iL3JPo2INNCC5N9rLVx98Gg1G0ZaxclVRUvJrh1AojNlOFxU+otkxAe7FA3Foy2iLLQ==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", + "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -1309,28 +1429,28 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-buffer-from": { @@ -1389,158 +1509,1333 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.352.0", + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.735.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.735.0.tgz", + "integrity": "sha512-vc/5aXLRjIhn4czx7sxR07Q8qLNmLG2DmwukyZ1AAcVcSWbs67Mdw3nAxV3X94gmH1jS/OuqTrpDmBvOvnnk4g==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.352.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-sdk-sts": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.352.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.352.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", - "@aws-sdk/util-utf8": "3.310.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/credential-provider-node": "3.734.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.734.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.2", + "@smithy/middleware-retry": "^4.0.3", + "@smithy/middleware-serde": "^4.0.1", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.3", + "@smithy/util-defaults-mode-node": "^4.0.3", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/config-resolver": { - "version": "3.347.0", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-config-provider": "3.310.0", - "@aws-sdk/util-middleware": "3.347.0", - "tslib": "^2.5.0" + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/core": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.731.0.tgz", - "integrity": "sha512-ithBN1VWASkvAIlozJmenqDvNnFddr/SZXAs58+jCnBHgy3tXLHABZGVNCjetZkHRqNdXEO1kirnoxaFeXMeDA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/core": "^3.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/signature-v4": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-middleware": "^4.0.0", - "fast-xml-parser": "4.4.1", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "license": "MIT", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.352.0", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.352.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/client-sso": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.734.0.tgz", + "integrity": "sha512-oerepp0mut9VlgTwnG5Ds/lb0C0b2/rQ+hL/rF6q+HGKPfGsCuPvFx1GtwGKCXd49ase88/jVgrhcA9OQbz3kg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.734.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.2", + "@smithy/middleware-retry": "^4.0.3", + "@smithy/middleware-serde": "^4.0.1", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.3", + "@smithy/util-defaults-mode-node": "^4.0.3", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/core": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.734.0.tgz", + "integrity": "sha512-SxnDqf3vobdm50OLyAKfqZetv6zzwnSqwIwd3jrbopxxHKqNIM/I0xcYjD6Tn+mPig+u7iRKb9q3QnEooFTlmg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.734.0.tgz", + "integrity": "sha512-gtRkzYTGafnm1FPpiNO8VBmJrYMoxhDlGPYDVcijzx3DlF8dhWnowuSBCxLSi+MJMx5hvwrX2A+e/q0QAeHqmw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.734.0.tgz", + "integrity": "sha512-JFSL6xhONsq+hKM8xroIPhM5/FOhiQ1cov0lZxhzZWj6Ai3UAjucy3zyIFDr9MgP1KfCYNdvyaUq9/o+HWvEDg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.0.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.734.0.tgz", + "integrity": "sha512-HEyaM/hWI7dNmb4NhdlcDLcgJvrilk8G4DQX6qz0i4pBZGC2l4iffuqP8K6ZQjUfz5/6894PzeFuhTORAMd+cg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/credential-provider-env": "3.734.0", + "@aws-sdk/credential-provider-http": "3.734.0", + "@aws-sdk/credential-provider-process": "3.734.0", + "@aws-sdk/credential-provider-sso": "3.734.0", + "@aws-sdk/credential-provider-web-identity": "3.734.0", + "@aws-sdk/nested-clients": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.734.0.tgz", + "integrity": "sha512-9NOSNbkPVb91JwaXOhyfahkzAwWdMsbWHL6fh5/PHlXYpsDjfIfT23I++toepNF2nODAJNLnOEHGYIxgNgf6jQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.734.0", + "@aws-sdk/credential-provider-http": "3.734.0", + "@aws-sdk/credential-provider-ini": "3.734.0", + "@aws-sdk/credential-provider-process": "3.734.0", + "@aws-sdk/credential-provider-sso": "3.734.0", + "@aws-sdk/credential-provider-web-identity": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.734.0.tgz", + "integrity": "sha512-zvjsUo+bkYn2vjT+EtLWu3eD6me+uun+Hws1IyWej/fKFAqiBPwyeyCgU7qjkiPQSXqk1U9+/HG9IQ6Iiz+eBw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.734.0.tgz", + "integrity": "sha512-cCwwcgUBJOsV/ddyh1OGb4gKYWEaTeTsqaAK19hiNINfYV/DO9r4RMlnWAo84sSBfJuj9shUNsxzyoe6K7R92Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/client-sso": "3.734.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/token-providers": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.734.0.tgz", + "integrity": "sha512-t4OSOerc+ppK541/Iyn1AS40+2vT/qE+MFMotFkhCgCJbApeRF2ozEdnDN6tGmnl4ybcUuxnp9JWLjwDVlR/4g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/nested-clients": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz", + "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-logger": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", + "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz", + "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.734.0.tgz", + "integrity": "sha512-MFVzLWRkfFz02GqGPjqSOteLe5kPfElUrXZft1eElnqulqs6RJfVSpOV7mO90gu293tNAeggMWAVSGRPKIYVMg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@smithy/core": "^3.1.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", + "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/token-providers": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.734.0.tgz", + "integrity": "sha512-2U6yWKrjWjZO8Y5SHQxkFvMVWHQWbS0ufqfAIBROqmIZNubOL7jXCiVdEFekz6MZ9LF2tvYGnOW4jX8OKDGfIw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/nested-clients": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", + "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-endpoints": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.734.0.tgz", + "integrity": "sha512-w2+/E88NUbqql6uCVAsmMxDQKu7vsKV0KqhlQb0lL+RCq4zy07yXYptVNs13qrnuTfyX7uPXkXrlugvK9R1Ucg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", + "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.734.0.tgz", + "integrity": "sha512-c6Iinh+RVQKs6jYUFQ64htOU2HUXFQ3TVx+8Tu3EDF19+9vzWi9UukhIMH9rqyyEXIAkk9XL7avt8y2Uyw2dGA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/abort-controller": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", + "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/config-resolver": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz", + "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/core": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.2.tgz", + "integrity": "sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.0.2", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz", + "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz", + "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/hash-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", + "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/invalid-dependency": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", + "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-content-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", + "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-endpoint": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.3.tgz", + "integrity": "sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/core": "^3.1.2", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-retry": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.4.tgz", + "integrity": "sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-serde": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz", + "integrity": "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-stack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz", + "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-config-provider": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz", + "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-http-handler": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz", + "integrity": "sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/property-provider": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz", + "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/protocol-http": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", + "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/querystring-builder": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", + "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/querystring-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz", + "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/service-error-classification": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz", + "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz", + "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/signature-v4": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", + "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/smithy-client": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.3.tgz", + "integrity": "sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/core": "^3.1.2", + "@smithy/middleware-endpoint": "^4.0.3", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.0.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/url-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz", + "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.4.tgz", + "integrity": "sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.4.tgz", + "integrity": "sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/config-resolver": "^4.0.1", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-endpoints": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", + "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-middleware": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz", + "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-retry": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz", + "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.0.2.tgz", + "integrity": "sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.352.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/credential-provider-node": "3.352.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-sdk-sts": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.352.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.350.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.352.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-config-provider": "3.310.0", + "@aws-sdk/util-middleware": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.616.0.tgz", + "integrity": "sha512-O/urkh2kECs/IqZIVZxyeyHZ7OR2ZWhLNK7btsVQBQvJKrEspLrk/Fp20Qfg5JDerQfBN83ZbyRXLJOOucdZpw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.2.7", + "@smithy/protocol-http": "^4.0.4", + "@smithy/signature-v4": "^4.0.0", + "@smithy/smithy-client": "^3.1.8", + "@smithy/types": "^3.3.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.352.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.352.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -1551,100 +2846,764 @@ "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.616.0.tgz", + "integrity": "sha512-1rgCkr7XvEMBl7qWCo5BKu3yAxJs71dRaZ55Xnjte/0ZHH6Oc93ZrHzyYy6UH6t0nZrH+FAuw7Yko2YtDDwDeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.1.3", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.0.4", + "@smithy/smithy-client": "^3.1.8", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.352.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.352.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.352.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.352.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.352.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.352.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso": "3.352.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/token-providers": "3.352.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.352.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.347.0", + "@aws-sdk/fetch-http-handler": "3.347.0", + "@aws-sdk/hash-node": "3.347.0", + "@aws-sdk/invalid-dependency": "3.347.0", + "@aws-sdk/middleware-content-length": "3.347.0", + "@aws-sdk/middleware-endpoint": "3.347.0", + "@aws-sdk/middleware-host-header": "3.347.0", + "@aws-sdk/middleware-logger": "3.347.0", + "@aws-sdk/middleware-recursion-detection": "3.347.0", + "@aws-sdk/middleware-retry": "3.347.0", + "@aws-sdk/middleware-serde": "3.347.0", + "@aws-sdk/middleware-stack": "3.347.0", + "@aws-sdk/middleware-user-agent": "3.352.0", + "@aws-sdk/node-config-provider": "3.347.0", + "@aws-sdk/node-http-handler": "3.350.0", + "@aws-sdk/smithy-client": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.347.0", + "@aws-sdk/util-defaults-mode-node": "3.347.0", + "@aws-sdk/util-endpoints": "3.352.0", + "@aws-sdk/util-retry": "3.347.0", + "@aws-sdk/util-user-agent-browser": "3.347.0", + "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { + "version": "3.352.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.352.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.352.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.352.0", + "@aws-sdk/client-sso": "3.352.0", + "@aws-sdk/client-sts": "3.352.0", + "@aws-sdk/credential-provider-cognito-identity": "3.352.0", + "@aws-sdk/credential-provider-env": "3.347.0", + "@aws-sdk/credential-provider-imds": "3.347.0", + "@aws-sdk/credential-provider-ini": "3.352.0", + "@aws-sdk/credential-provider-node": "3.352.0", + "@aws-sdk/credential-provider-process": "3.347.0", + "@aws-sdk/credential-provider-sso": "3.352.0", + "@aws-sdk/credential-provider-web-identity": "3.347.0", + "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/eventstream-codec": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/querystring-builder": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-base64": "3.310.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.310.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/lib-storage": { + "version": "3.617.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.617.0.tgz", + "integrity": "sha512-bR+3E66Dp3CyuSGywxMSwrYQCfwuFu7gRJxOpk1i2AKV1Wh7g0y1eANXHVKnk+UbVRz4S53UCD8LEiKp2KYShA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.1", + "@smithy/middleware-endpoint": "^3.0.5", + "@smithy/smithy-client": "^3.1.8", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-s3": "^3.617.0" + } + }, + "node_modules/@aws-sdk/lib-storage/node_modules/buffer": { + "version": "5.6.0", + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.616.0.tgz", + "integrity": "sha512-KZv78s8UE7+s3qZCfG3pE9U9XV5WTP478aNWis5gDXmsb5LF7QWzEeR8kve5dnjNlK6qVQ33v+mUZa6lR5PwMw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-arn-parser": "3.568.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.0.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-serde": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.731.0.tgz", - "integrity": "sha512-iRtrjtcYaWgbvtu2cvDhIsPWXZGvhy1Hgks4682MEBNTc9AUwlfvDrYz2EEnTtJJyrbOdEHVrYrzqD8qPyVLCg==", + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.616.0.tgz", + "integrity": "sha512-IM1pfJPm7pDUXa55js9bnGjS8o3ldzDwf95mL9ZAYdEsm10q6i0ZxZbbro2gTq25Ap5ykdeeS34lOSzIqPiW1A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-stream": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.0.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds": { + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.616.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.616.0.tgz", + "integrity": "sha512-Mrco/dURoTXVqwcnYRcyrFaPTIg36ifg2PK0kUYfSVTGEOClZOQXlVG5zYCZoo3yEMgy/gLT907FjUQxwoifIw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-sdk/types": "3.609.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.0.4", + "@smithy/types": "^3.3.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-buffer-from/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { "version": "3.347.0", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz", + "integrity": "sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.347.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", "tslib": "^2.5.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.347.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/service-error-classification": "3.347.0", + "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", + "@aws-sdk/util-retry": "3.347.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.617.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.617.0.tgz", + "integrity": "sha512-zVOS6sNGcLGhq7i+5POmVqmSPNmrQYDFsynpnWMSLsNaej+xvkdSOnytLrUvag3Du4kAxfO5NNIC0GuNj9lcCg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-arn-parser": "3.568.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/protocol-http": "^4.0.4", + "@smithy/signature-v4": "^4.0.0", + "@smithy/smithy-client": "^3.1.8", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-stream": "^3.1.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.352.0", + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.347.0", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.347.0", - "@aws-sdk/credential-provider-imds": "3.347.0", - "@aws-sdk/credential-provider-process": "3.347.0", - "@aws-sdk/credential-provider-sso": "3.352.0", - "@aws-sdk/credential-provider-web-identity": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/middleware-signing": "3.347.0", "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, @@ -1652,19 +3611,11 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.352.0", + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.347.0", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.347.0", - "@aws-sdk/credential-provider-imds": "3.347.0", - "@aws-sdk/credential-provider-ini": "3.352.0", - "@aws-sdk/credential-provider-process": "3.347.0", - "@aws-sdk/credential-provider-sso": "3.352.0", - "@aws-sdk/credential-provider-web-identity": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, @@ -1672,335 +3623,318 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@aws-sdk/middleware-signing": { "version": "3.347.0", "license": "Apache-2.0", "optional": true, "dependencies": { "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", + "@aws-sdk/signature-v4": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-middleware": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.352.0", + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz", + "integrity": "sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==", "license": "Apache-2.0", - "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.352.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/token-providers": "3.352.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.352.0", + "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "license": "Apache-2.0", - "optional": true, "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.352.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", - "@aws-sdk/util-base64": "3.310.0", - "@aws-sdk/util-body-length-browser": "3.310.0", - "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.352.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", - "@aws-sdk/util-utf8": "3.310.0", - "@smithy/protocol-http": "^1.0.1", - "@smithy/types": "^1.0.0", - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { - "version": "3.352.0", + "node_modules/@aws-sdk/middleware-ssec/node_modules/@smithy/types": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", - "optional": true, "dependencies": { - "@aws-sdk/client-sso-oidc": "3.352.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/middleware-stack": { "version": "3.347.0", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-providers": { + "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.352.0", "license": "Apache-2.0", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.352.0", - "@aws-sdk/client-sso": "3.352.0", - "@aws-sdk/client-sts": "3.352.0", - "@aws-sdk/credential-provider-cognito-identity": "3.352.0", - "@aws-sdk/credential-provider-env": "3.347.0", - "@aws-sdk/credential-provider-imds": "3.347.0", - "@aws-sdk/credential-provider-ini": "3.352.0", - "@aws-sdk/credential-provider-node": "3.352.0", - "@aws-sdk/credential-provider-process": "3.347.0", - "@aws-sdk/credential-provider-sso": "3.352.0", - "@aws-sdk/credential-provider-web-identity": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", + "@aws-sdk/protocol-http": "3.347.0", "@aws-sdk/types": "3.347.0", + "@aws-sdk/util-endpoints": "3.352.0", "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/eventstream-codec": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.734.0.tgz", + "integrity": "sha512-iph2XUy8UzIfdJFWo1r0Zng9uWj3253yvW9gljhtu+y/LNmNvSnJxQk1f3D2BC5WmcoPZqTS3UsycT3mLPSzWA==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-crypto/crc32": "3.0.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-hex-encoding": "3.310.0", - "tslib": "^2.5.0" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.734.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.2", + "@smithy/middleware-retry": "^4.0.3", + "@smithy/middleware-serde": "^4.0.1", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.3", + "@smithy/util-defaults-mode-node": "^4.0.3", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/querystring-builder": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-base64": "3.310.0", - "tslib": "^2.5.0" + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/hash-node": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-buffer-from": "3.310.0", - "@aws-sdk/util-utf8": "3.310.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.347.0", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" - } - }, - "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.310.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/lib-storage": { - "version": "3.731.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.731.1.tgz", - "integrity": "sha512-+ajlL3FOCHu+HEB8M5BJ3Rvq+QmXfGdgzU5tmnVMJUl1V9ggbG9P01EmrVX7Q7INdWezQYr/VWqUcOmUW4zuBQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/abort-controller": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/smithy-client": "^4.0.0", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-s3": "^3.731.1" - } - }, - "node_modules/@aws-sdk/lib-storage/node_modules/buffer": { - "version": "5.6.0", - "license": "MIT", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.731.0.tgz", - "integrity": "sha512-G9vuGW5GWCbzGOwlGFJcOkfxhw1cB6vzcv75QTT0CmciLXK+Cio8O2pqMSTTF2kg9Y6iHVC2BlOtLRkJAVOxVQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@aws-sdk/util-arn-parser": "3.723.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-config-provider": "^4.0.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", - "@aws-sdk/util-middleware": "3.347.0", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.731.0.tgz", - "integrity": "sha512-oY4nsY/mb5O5eZCzIuWpyvzO45Bi6UBtE48IaJsoyVctagA1l8hB66aczH9M1NHNjvbS4Beu1agwh3Nyb1eJug==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/core": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.734.0.tgz", + "integrity": "sha512-SxnDqf3vobdm50OLyAKfqZetv6zzwnSqwIwd3jrbopxxHKqNIM/I0xcYjD6Tn+mPig+u7iRKb9q3QnEooFTlmg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.2", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz", + "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-logger": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", + "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -2008,290 +3942,317 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz", + "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.731.0.tgz", - "integrity": "sha512-LMs/rndovYjYSntSYyPE/PIl4iHNiquaU0lpDqpQc9iTgQcNbjdriSUWpibgu1jXlGBpBYCqttNkxmEThbbWxA==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.734.0.tgz", + "integrity": "sha512-MFVzLWRkfFz02GqGPjqSOteLe5kPfElUrXZft1eElnqulqs6RJfVSpOV7mO90gu293tNAeggMWAVSGRPKIYVMg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-stream": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.734.0", + "@smithy/core": "^3.1.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/crc32": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", - "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", + "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", + "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.734.0.tgz", + "integrity": "sha512-w2+/E88NUbqql6uCVAsmMxDQKu7vsKV0KqhlQb0lL+RCq4zy07yXYptVNs13qrnuTfyX7uPXkXrlugvK9R1Ucg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", + "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.734.0.tgz", + "integrity": "sha512-c6Iinh+RVQKs6jYUFQ64htOU2HUXFQ3TVx+8Tu3EDF19+9vzWi9UukhIMH9rqyyEXIAkk9XL7avt8y2Uyw2dGA==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@aws-sdk/middleware-user-agent": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/abort-controller": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", + "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-buffer-from/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/config-resolver": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz", + "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/core": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.2.tgz", + "integrity": "sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.0.2", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.731.0.tgz", - "integrity": "sha512-1I2EjAFxrQksrzqdN7YYuY/q2YsjqeX4l7f9VOkdBjiZeDvVIEdM99IT5sISJB/r6CjNrYX5MhqGhE8i1VFchA==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz", + "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/types": "^4.0.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz", + "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/hash-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", + "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/invalid-dependency": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", + "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-retry": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-content-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", + "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/service-error-classification": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-middleware": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "peer": true, + "dependencies": { + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.731.0.tgz", - "integrity": "sha512-J9aKyQaVoec5eWTSDfO4h2sKHNP0wTzN15LFcHnkD+e/d0rdmOi7BTkkbJrIaynma9WShIasmrtM3HNi9GiiTA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@aws-sdk/util-arn-parser": "3.723.0", - "@smithy/core": "^3.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/signature-v4": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-stream": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-endpoint": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.3.tgz", + "integrity": "sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/core": "^3.1.2", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-retry": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.4.tgz", + "integrity": "sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-serde": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz", + "integrity": "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -2300,165 +4261,150 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-stack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz", + "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-config-provider": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz", + "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-serde": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz", + "integrity": "sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/types": "3.347.0", - "tslib": "^2.5.0" + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/property-provider": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz", + "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/signature-v4": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-middleware": "3.347.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.731.0.tgz", - "integrity": "sha512-1HP4lxGcQx4awXgxfL8t9faBK7TqEL7zkAZrm/YBbLrT9oQomxZOHKIOHvo5VVh4qmsNBdqnH2XUlSMY71gsww==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", + "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/types": "^4.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-builder": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", + "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-ssec/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz", + "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-stack": { - "version": "3.347.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/service-error-classification": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz", + "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.352.0", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz", + "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==", "license": "Apache-2.0", - "optional": true, + "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-endpoints": "3.352.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.731.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.731.1.tgz", - "integrity": "sha512-/L8iVrulnXZl+kgmTn+oxRxNnhcSIbf+r12C06vGUq60w0YMidLvxJZN7vt8H9SnCAGCHqud2MS7ExCEvhc0gA==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/signature-v4": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", + "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.731.0", - "@aws-sdk/middleware-host-header": "3.731.0", - "@aws-sdk/middleware-logger": "3.731.0", - "@aws-sdk/middleware-recursion-detection": "3.731.0", - "@aws-sdk/middleware-user-agent": "3.731.0", - "@aws-sdk/region-config-resolver": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@aws-sdk/util-endpoints": "3.731.0", - "@aws-sdk/util-user-agent-browser": "3.731.0", - "@aws-sdk/util-user-agent-node": "3.731.0", - "@smithy/config-resolver": "^4.0.0", - "@smithy/core": "^3.0.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/hash-node": "^4.0.0", - "@smithy/invalid-dependency": "^4.0.0", - "@smithy/middleware-content-length": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/middleware-retry": "^4.0.0", - "@smithy/middleware-serde": "^4.0.0", - "@smithy/middleware-stack": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/url-parser": "^4.0.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.0", - "@smithy/util-defaults-mode-node": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-retry": "^4.0.0", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -2466,255 +4412,296 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.3.tgz", + "integrity": "sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/core": "^3.1.2", + "@smithy/middleware-endpoint": "^4.0.3", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.0.2", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/url-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz", + "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.731.0.tgz", - "integrity": "sha512-ndAJsm5uWPPJRZowLKpB1zuL17qWlWVtCJP4I/ynBkq1PU1DijDXBul2UZaG6Mpvsgms1NXo/h9noHuK7T3v8w==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-logger": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.731.0.tgz", - "integrity": "sha512-IIZrOdjbY2vKzPJPrwE7FoFQCIPEL6UqURi8LEaiVyCag4p2fvaTN5pgKuQtGC2+iYd/HHcGT4qn2bAqF5Jmmw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.731.0.tgz", - "integrity": "sha512-y6FLASB1iKWuR5tUipMyo77bt0lEl3OnCrrd2xw/H24avq1HhJjjPR0HHhJE6QKJzF/FYXeV88tcyPSMe32VDw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.4.tgz", + "integrity": "sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.731.0.tgz", - "integrity": "sha512-Ngr2Gz0aec/uduoKaO3srN52SYkEHndYtFzkK/gDUyQwQzi4ha2eIisxPiuHEX6RvXT31V9ouqn/YtVkt0R76A==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.4.tgz", + "integrity": "sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@aws-sdk/util-endpoints": "3.731.0", - "@smithy/core": "^3.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.3", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-endpoints": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", + "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-endpoints": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.731.0.tgz", - "integrity": "sha512-riztxTAfncFS9yQWcBJffGgOgLoKSa63ph+rxWJxKl6BHAmWEvHICj1qDcVmnWfIcvJ5cClclY75l9qKaUH7rQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/types": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.731.0.tgz", - "integrity": "sha512-EnYXxTkCNCjTTBjW/pelRPv4Thsi9jepoB6qQjPMA9/ixrZ71BhhQecz9kgqzZLR9BPCwb6hgJ/Yd702jqJ4aQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-middleware": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz", + "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/types": "^4.0.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.731.0.tgz", - "integrity": "sha512-Rze78Ym5Bx7aWMvmZE2iL3JPo2INNCC5N9rLVx98Gg1G0ZaxclVRUvJrh1AojNlOFxU+otkxAe7FA3Foy2iLLQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-retry": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz", + "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.0.2.tgz", + "integrity": "sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.2", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/nested-clients/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" + "strnum": "^1.0.5" }, - "engines": { - "node": ">=14.0.0" + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/@aws-sdk/node-config-provider": { @@ -2796,45 +4783,45 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.731.0.tgz", - "integrity": "sha512-XlDpRNkDVHF59f07JmkuAidEv//m3hT6/JL85h0l3+zrpaRWhf8n8lVUyAPNq35ZujK8AcorYM+93u7hdWsliQ==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", + "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.731.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/region-config-resolver/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/region-config-resolver/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/service-error-classification": { @@ -2876,58 +4863,58 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.731.0.tgz", - "integrity": "sha512-1r/b4Os15dR+BCVRRLVQJMF7Krq6xX6IKHxN43kuvODYWz8Nv3XDlaSpeRpAzyJuzW/fTp4JgE+z0+gmJfdEeA==", + "version": "3.617.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.617.0.tgz", + "integrity": "sha512-kGbLs9q0/ziuzA1huf0BBh05ChxDeZ8ZWc/kedb80ocq6izOLaGgeqqUR8oB0ianwjel4AQq/iv1fsOIt3wmAA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.731.0", - "@aws-sdk/types": "3.731.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/signature-v4": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/middleware-sdk-s3": "3.617.0", + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.0.4", + "@smithy/signature-v4": "^4.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/smithy-client": { @@ -2944,45 +4931,47 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.731.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.731.1.tgz", - "integrity": "sha512-t34GOPwBZsX7zGHjiTXmMHGY3kHM7fLiQ60Jqk0On9P0ASHTDE5U75RgCXboE3u+qEv9wyKyaqMNyMWj9qQlFg==", + "version": "3.614.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", + "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/nested-clients": "3.731.1", - "@aws-sdk/types": "3.731.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.614.0" } }, "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { - "version": "3.731.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.731.0.tgz", - "integrity": "sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", + "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/token-providers/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/types": { @@ -3006,15 +4995,15 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz", - "integrity": "sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==", + "version": "3.568.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", + "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/util-base64": { @@ -3221,28 +5210,28 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.723.0.tgz", - "integrity": "sha512-5xK2SqGU1mzzsOeemy7cy3fGKxR1sEpUs4pEiIjaT0OIvU+fZaDVUEYWOqsgns6wI90XZEQJlXtI8uAHX/do5Q==", + "version": "3.609.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz", + "integrity": "sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/xml-builder/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@babel/code-frame": { @@ -7534,168 +9523,159 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", - "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz", + "integrity": "sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/abort-controller/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", - "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-4.0.0.tgz", + "integrity": "sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", - "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.1.tgz", + "integrity": "sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-base64": "^4.0.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/config-resolver": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz", - "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.13.tgz", + "integrity": "sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/core": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.1.tgz", - "integrity": "sha512-hhUZlBWYuh9t6ycAcN90XOyG76C1AzwxZZgaCVPMYpWqqk9uMFo7HGG5Zu2cEhCJn7DdOi5krBmlibWWWPgdsw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.0.2", - "@smithy/util-utf8": "^4.0.0", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.7.tgz", + "integrity": "sha512-8olpW6mKCa0v+ibCjoCzgZHQx1SQmZuW/WkrdZo73wiTprTH6qhmskT60QLFdT9DRa5mXxjz89kQPZ7ZSsoqqg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^3.0.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-stream": "^3.3.4", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/core/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/core/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz", - "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.8.tgz", + "integrity": "sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/property-provider": "^3.1.11", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz", - "integrity": "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.10.tgz", + "integrity": "sha512-323B8YckSbUH0nMIpXn7HZsAVKHYHFUODa8gG9cHo0ySvA1fr5iWaNT+iIL0UCqUzG6QPHA3BSsBtRQou4mMqQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.1.0", - "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-codec/node_modules/@aws-crypto/crc32": { @@ -7736,15 +9716,15 @@ } }, "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-codec/node_modules/@smithy/util-buffer-from": { @@ -7774,405 +9754,393 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz", - "integrity": "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.14.tgz", + "integrity": "sha512-kbrt0vjOIihW3V7Cqj1SXQvAI5BR8SnyQYsandva0AOR307cXAc+IhPngxIPslxTLfxwDpNu0HzCAq6g42kCPg==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/eventstream-serde-universal": "^3.0.13", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz", - "integrity": "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.11.tgz", + "integrity": "sha512-P2pnEp4n75O+QHjyO7cbw/vsw5l93K/8EWyjNCAAybYwUmj3M+hjSQZ9P5TVdUgEG08ueMAP5R4FkuSkElZ5tQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz", - "integrity": "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.13.tgz", + "integrity": "sha512-zqy/9iwbj8Wysmvi7Lq7XFLeDgjRpTbCfwBhJa8WbrylTAHiAu6oQTwdY7iu2lxigbc9YYr9vPv5SzYny5tCXQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/eventstream-serde-universal": "^3.0.13", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz", - "integrity": "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.13.tgz", + "integrity": "sha512-L1Ib66+gg9uTnqp/18Gz4MDpJPKRE44geOjOQ2SVc0eiaO5l255ADziATZgjQjqumC7yPtp1XnjHlF1srcwjKw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/eventstream-codec": "^3.1.10", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz", - "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.1.tgz", - "integrity": "sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.10.tgz", + "integrity": "sha512-elwslXOoNunmfS0fh55jHggyhccobFkexLYC1ZeZ1xP2BTSrcIBaHV2b4xUQOdctrSNOpMqOZH1r2XzWTEhyfA==", "license": "Apache-2.0", "dependencies": { - "@smithy/chunked-blob-reader": "^5.0.0", - "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.1.0", + "@smithy/chunked-blob-reader": "^4.0.0", + "@smithy/chunked-blob-reader-native": "^3.0.1", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/hash-blob-browser/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/hash-node": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", - "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.11.tgz", + "integrity": "sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^3.7.2", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/hash-node/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.1.tgz", - "integrity": "sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.10.tgz", + "integrity": "sha512-olomK/jZQ93OMayW1zfTHwcbwBdhcZOHsyWyiZ9h9IXvc1mCD/VuvzbLb3Gy/qNJwI4MANPLctTp2BucV2oU/Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^3.7.2", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/hash-stream-node/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", - "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.11.tgz", + "integrity": "sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/md5-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.1.tgz", - "integrity": "sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.11.tgz", + "integrity": "sha512-3NM0L3i2Zm4bbgG6Ymi9NBcxXhryi3uE8fIfHJZIOfZVxOkGdjdgjR9A06SFIZCfnEIWKXZdm6Yq5/aPXFFhsQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^3.7.2", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/md5-js/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", - "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz", + "integrity": "sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.2.tgz", - "integrity": "sha512-Z9m67CXizGpj8CF/AW/7uHqYNh1VXXOn9Ap54fenWsCa0HnT4cJuE61zqG3cBkTZJDCy0wHJphilI41co/PE5g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.1.1", - "@smithy/middleware-serde": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "@smithy/util-middleware": "^4.0.1", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.8.tgz", + "integrity": "sha512-OEJZKVUEhMOqMs3ktrTWp7UvvluMJEvD5XgQwRePSbDg1VvBaL8pX8mwPltFn6wk1GySbcVwwyldL8S+iqnrEQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^2.5.7", + "@smithy/middleware-serde": "^3.0.11", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", + "@smithy/url-parser": "^3.0.11", + "@smithy/util-middleware": "^3.0.11", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-endpoint/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.3.tgz", - "integrity": "sha512-TiKwwQTwUDeDtwWW8UWURTqu7s6F3wN2pmziLU215u7bqpVT9Mk2oEvURjpRLA+5XeQhM68R5BpAGzVtomsqgA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/service-error-classification": "^4.0.1", - "@smithy/smithy-client": "^4.1.2", - "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", + "version": "3.0.34", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.34.tgz", + "integrity": "sha512-yVRr/AAtPZlUvwEkrq7S3x7Z8/xCd97m2hLDaqdz6ucP2RKHsBjEqaUA2ebNv2SsZoPEi+ZD0dZbOB1u37tGCA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/protocol-http": "^4.1.8", + "@smithy/service-error-classification": "^3.0.11", + "@smithy/smithy-client": "^3.7.0", + "@smithy/types": "^3.7.2", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-retry/node_modules/uuid": { @@ -8189,146 +10157,146 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.1.tgz", - "integrity": "sha512-Fh0E2SOF+S+P1+CsgKyiBInAt3o2b6Qk7YOp2W0Qx2XnfTdfMuSDKUEcnrtpxCzgKJnqXeLUZYqtThaP0VGqtA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz", + "integrity": "sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-serde/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz", - "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz", + "integrity": "sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/middleware-stack/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz", - "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz", + "integrity": "sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/shared-ini-file-loader": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/node-config-provider/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz", - "integrity": "sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.3.tgz", + "integrity": "sha512-BrpZOaZ4RCbcJ2igiSNG16S+kgAc65l/2hmxWdmhyoGWHTLlzQzr06PXavJp9OBlPEG/sHlqdxjWmjzV66+BSQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/abort-controller": "^3.1.9", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/node-http-handler/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz", - "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz", + "integrity": "sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/property-provider/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/protocol-http": { @@ -8342,192 +10310,192 @@ "engines": { "node": ">=14.0.0" } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", - "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", + }, + "node_modules/@smithy/querystring-builder": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz", + "integrity": "sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/types": "^3.7.2", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/querystring-builder/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz", - "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz", + "integrity": "sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/querystring-parser/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz", - "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", + "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0" + "@smithy/types": "^3.7.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/service-error-classification/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz", - "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz", + "integrity": "sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/shared-ini-file-loader/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", - "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz", + "integrity": "sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.2.tgz", - "integrity": "sha512-0yApeHWBqocelHGK22UivZyShNxFbDNrgREBllGh5Ws0D0rg/yId/CJfeoKKpjbfY2ju8j6WgDUGZHYQmINZ5w==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.7.0.tgz", + "integrity": "sha512-9wYrjAZFlqWhgVo3C4y/9kpc68jgiSsKUnsFPzr/MSiRL93+QRDafGTfhhKAb2wsr69Ru87WTiqSfQusSmWipA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.1.1", - "@smithy/middleware-endpoint": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.0.2", + "@smithy/core": "^2.5.7", + "@smithy/middleware-endpoint": "^3.2.8", + "@smithy/middleware-stack": "^3.0.11", + "@smithy/protocol-http": "^4.1.8", + "@smithy/types": "^3.7.2", + "@smithy/util-stream": "^3.3.4", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/smithy-client/node_modules/@smithy/protocol-http": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", - "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/smithy-client/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/types": { @@ -8542,321 +10510,341 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz", - "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz", + "integrity": "sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/querystring-parser": "^3.0.11", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/url-parser/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", + "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", + "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", + "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", + "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.3.tgz", - "integrity": "sha512-7c5SF1fVK0EOs+2EOf72/qF199zwJflU1d02AevwKbAUPUZyE9RUZiyJxeUmhVxfKDWdUKaaVojNiaDQgnHL9g==", + "version": "3.0.34", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.34.tgz", + "integrity": "sha512-FumjjF631lR521cX+svMLBj3SwSDh9VdtyynTYDAiBDEf8YPP5xORNXKQ9j0105o5+ARAGnOOP/RqSl40uXddA==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.2", - "@smithy/types": "^4.1.0", + "@smithy/property-provider": "^3.1.11", + "@smithy/smithy-client": "^3.7.0", + "@smithy/types": "^3.7.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">= 10.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.3.tgz", - "integrity": "sha512-CVnD42qYD3JKgDlImZ9+On+MqJHzq9uJgPbMdeBE8c2x8VJ2kf2R3XO/yVFx+30ts5lD/GlL0eFIShY3x9ROgQ==", + "version": "3.0.34", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.34.tgz", + "integrity": "sha512-vN6aHfzW9dVVzkI0wcZoUXvfjkl4CSbM9nE//08lmUMyf00S75uuCpTrqF9uD4bD9eldIXlt53colrlwKAT8Gw==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.0.1", - "@smithy/credential-provider-imds": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.2", - "@smithy/types": "^4.1.0", + "@smithy/config-resolver": "^3.0.13", + "@smithy/credential-provider-imds": "^3.2.8", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/property-provider": "^3.1.11", + "@smithy/smithy-client": "^3.7.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">= 10.0.0" } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", - "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.7.tgz", + "integrity": "sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/node-config-provider": "^3.1.12", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", + "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz", - "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz", + "integrity": "sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-middleware/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz", - "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", + "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/service-error-classification": "^3.0.11", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-retry/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.0.2.tgz", - "integrity": "sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.4.tgz", + "integrity": "sha512-SGhGBG/KupieJvJSZp/rfHHka8BFgj56eek9px4pp7lZbOF+fRiVr4U7A3y3zJD8uGhxq32C5D96HxsTC9BckQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^4.1.3", + "@smithy/node-http-handler": "^3.3.3", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.3.tgz", + "integrity": "sha512-6SxNltSncI8s689nvnzZQc/dPXcpHQ34KUj6gR/HBroytKOd/isMG3gJF/zBE1TBmTT18TXyzhg3O3SOOqGEhA==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/node-http-handler": "^4.0.2", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/util-stream/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-stream/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", + "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.2.tgz", - "integrity": "sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.2.0.tgz", + "integrity": "sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/abort-controller": "^3.1.9", + "@smithy/types": "^3.7.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", - "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz", + "integrity": "sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, "node_modules/@socket.io/component-emitter": { @@ -14457,7 +16445,6 @@ "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "optional": true, "dependencies": { "strnum": "^1.0.5" }, diff --git a/package.json b/package.json index fa8733efb2..9acdf38385 100644 --- a/package.json +++ b/package.json @@ -147,8 +147,8 @@ } }, "dependencies": { - "@aws-sdk/client-s3": "^3.731.1", - "@aws-sdk/lib-storage": "^3.731.1", + "@aws-sdk/client-s3": "3.617.0", + "@aws-sdk/lib-storage": "3.617.0", "@feathersjs/adapter-commons": "^5.0.31", "@feathersjs/authentication": "^5.0.31", "@feathersjs/authentication-local": "^5.0.31", From 8c78cd28805a00eb1a5a30878cfec860b664510b Mon Sep 17 00:00:00 2001 From: Majed Mak <132336669+MajedAlaitwniCap@users.noreply.github.com> Date: Thu, 30 Jan 2025 10:11:48 +0100 Subject: [PATCH 2/6] EW-977 remove redundant title from cards after export and reimport(#5318) --- .../import/common-cartridge-import.types.ts | 3 +- .../common-cartridge-resource-factory.spec.ts | 2 - .../common-cartridge-resource-factory.ts | 4 +- .../service/common-cartridge.mapper.spec.ts | 6 +- .../service/common-cartridge.mapper.ts | 6 +- .../common-cartridge-import.mapper.spec.ts | 25 ++++--- .../mapper/common-cartridge-import.mapper.ts | 18 ++--- .../common-cartridge-import.service.spec.ts | 67 ++++++------------- .../common-cartridge-import.service.ts | 37 +++++----- 9 files changed, 67 insertions(+), 101 deletions(-) diff --git a/apps/server/src/modules/common-cartridge/import/common-cartridge-import.types.ts b/apps/server/src/modules/common-cartridge/import/common-cartridge-import.types.ts index ce86755bb6..75b3bda8f9 100644 --- a/apps/server/src/modules/common-cartridge/import/common-cartridge-import.types.ts +++ b/apps/server/src/modules/common-cartridge/import/common-cartridge-import.types.ts @@ -10,7 +10,7 @@ export type CommonCartridgeFileParserOptions = { export const DEFAULT_FILE_PARSER_OPTIONS: CommonCartridgeFileParserOptions = { maxSearchDepth: 5, pathSeparator: '/', - inputFormat: InputFormat.RICH_TEXT_CK5, + inputFormat: InputFormat.RICH_TEXT_CK4, }; export type CommonCartridgeOrganizationProps = { @@ -27,7 +27,6 @@ export type CommonCartridgeOrganizationProps = { export type CommonCartridgeWebContentResourceProps = { type: CommonCartridgeResourceTypeV1P1.WEB_CONTENT; - title: string; html: string; }; diff --git a/apps/server/src/modules/common-cartridge/import/common-cartridge-resource-factory.spec.ts b/apps/server/src/modules/common-cartridge/import/common-cartridge-resource-factory.spec.ts index 6f0d867681..8569df2a2b 100644 --- a/apps/server/src/modules/common-cartridge/import/common-cartridge-resource-factory.spec.ts +++ b/apps/server/src/modules/common-cartridge/import/common-cartridge-resource-factory.spec.ts @@ -168,7 +168,6 @@ describe('CommonCartridgeResourceFactory', () => { expect(result).toStrictEqual({ type: CommonCartridgeResourceTypeV1P1.WEB_CONTENT, - title: organizationProps.title, html: '

Content

', }); }); @@ -191,7 +190,6 @@ describe('CommonCartridgeResourceFactory', () => { expect(result).toStrictEqual({ type: CommonCartridgeResourceTypeV1P1.WEB_CONTENT, - title: organizationProps.title, html: '', }); }); diff --git a/apps/server/src/modules/common-cartridge/import/common-cartridge-resource-factory.ts b/apps/server/src/modules/common-cartridge/import/common-cartridge-resource-factory.ts index b80b9a80f3..a12842f2b9 100644 --- a/apps/server/src/modules/common-cartridge/import/common-cartridge-resource-factory.ts +++ b/apps/server/src/modules/common-cartridge/import/common-cartridge-resource-factory.ts @@ -28,7 +28,7 @@ export class CommonCartridgeResourceFactory { case CommonCartridgeResourceTypeV1P1.WEB_LINK: return this.createWebLinkResource(content, title); case CommonCartridgeResourceTypeV1P1.WEB_CONTENT: - return this.createWebContentResource(content, title, inputFormat); + return this.createWebContentResource(content, inputFormat); default: return undefined; } @@ -59,7 +59,6 @@ export class CommonCartridgeResourceFactory { private createWebContentResource( content: string, - title: string, inputFormat: InputFormat ): CommonCartridgeWebContentResourceProps | undefined { const document = this.tryCreateDocument(content, 'text/html'); @@ -72,7 +71,6 @@ export class CommonCartridgeResourceFactory { return { type: CommonCartridgeResourceTypeV1P1.WEB_CONTENT, - title, html, }; } diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge.mapper.spec.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge.mapper.spec.ts index aea5740c1f..6d042b975e 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge.mapper.spec.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge.mapper.spec.ts @@ -237,7 +237,7 @@ describe('CommonCartridgeExportMapper', () => { expect(result).toEqual({ identifier: `i${task.id}`, title: task.name, - html: `

${task.name}

${task.description ?? ''}

`, + html: `

${task.description ?? ''}

`, intendedUse: CommonCartridgeIntendedUseType.UNSPECIFIED, type: CommonCartridgeResourceType.WEB_CONTENT, }); @@ -252,7 +252,7 @@ describe('CommonCartridgeExportMapper', () => { expect(result).toEqual({ identifier: `i${task.id}`, title: task.name, - html: `

${task.name}

${task.description ?? ''}

`, + html: `

${task.description ?? ''}

`, intendedUse: CommonCartridgeIntendedUseType.ASSIGNMENT, type: CommonCartridgeResourceType.WEB_CONTENT, }); @@ -267,7 +267,7 @@ describe('CommonCartridgeExportMapper', () => { expect(result).toEqual({ identifier: `i${task.id}`, title: task.name, - html: `

${task.name}

${task.description ?? ''}

`, + html: `

${task.description ?? ''}

`, intendedUse: CommonCartridgeIntendedUseType.UNSPECIFIED, type: CommonCartridgeResourceType.WEB_CONTENT, }); diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge.mapper.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge.mapper.ts index 08bf79be0e..c5c793a8c5 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge.mapper.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge.mapper.ts @@ -64,9 +64,7 @@ export class CommonCartridgeExportMapper { type: CommonCartridgeResourceType.WEB_CONTENT, identifier: createIdentifier(lessonContent.id), title: lessonContent.title, - html: `

${lessonContent.title ?? ''}

${ - (lessonContent.content as ComponentTextPropsDto).text ?? '' - }

`, + html: `

${(lessonContent.content as ComponentTextPropsDto).text ?? ''}

`, intendedUse: CommonCartridgeIntendedUseType.UNSPECIFIED, }; case LessonContentDtoComponentValues.GEO_GEBRA: @@ -146,7 +144,7 @@ export class CommonCartridgeExportMapper { type: CommonCartridgeResourceType.WEB_CONTENT, identifier: createIdentifier(task.id), title: task.name, - html: `

${task.name}

${task.description ?? ''}

`, + html: `

${task.description ?? ''}

`, intendedUse, }; } diff --git a/apps/server/src/modules/learnroom/mapper/common-cartridge-import.mapper.spec.ts b/apps/server/src/modules/learnroom/mapper/common-cartridge-import.mapper.spec.ts index a2515c4d36..bce1e3668f 100644 --- a/apps/server/src/modules/learnroom/mapper/common-cartridge-import.mapper.spec.ts +++ b/apps/server/src/modules/learnroom/mapper/common-cartridge-import.mapper.spec.ts @@ -60,34 +60,34 @@ describe('CommonCartridgeImportMapper', () => { }); }); }); - }); - describe('mapOrganizationToCard', () => { - describe('when organization is provided', () => { + describe('when organization is provided and withTitle is false', () => { const setup = () => setupOrganization(); - it('should map organization to card', () => { + it('should set the title to an empty string', () => { const { organization } = setup(); - const result = sut.mapOrganizationToCard(organization); + const result = sut.mapOrganizationToCard(organization, false); expect(result).toEqual({ - title: organization.title, + title: '', height: 150, }); }); }); + }); - describe('when organization is provided and withTitle is false', () => { + describe('mapOrganizationToCard', () => { + describe('when organization is provided', () => { const setup = () => setupOrganization(); - it('should set the title to an empty string', () => { + it('should map organization to card', () => { const { organization } = setup(); - const result = sut.mapOrganizationToCard(organization, false); + const result = sut.mapOrganizationToCard(organization); expect(result).toEqual({ - title: '', + title: organization.title, height: 150, }); }); @@ -105,7 +105,7 @@ describe('CommonCartridgeImportMapper', () => { const result = sut.mapOrganizationToTextElement(organization); expect(result).toBeInstanceOf(RichTextContentBody); - expect(result).toEqual({ + expect(result).toEqual({ text: `${organization.title}`, inputFormat: InputFormat.RICH_TEXT_CK5_SIMPLE, }); @@ -156,7 +156,6 @@ describe('CommonCartridgeImportMapper', () => { it('should return rich text content element body', () => { const resource: CommonCartridgeImportResourceProps = { type: CommonCartridgeResourceTypeV1P1.WEB_CONTENT, - title: faker.lorem.words(3), html: faker.lorem.paragraph(), }; @@ -164,8 +163,8 @@ describe('CommonCartridgeImportMapper', () => { expect(result).toBeInstanceOf(RichTextContentBody); expect(result).toEqual({ + inputFormat: InputFormat.RICH_TEXT_CK4, text: resource.html, - inputFormat: InputFormat.RICH_TEXT_CK5_SIMPLE, }); }); }); diff --git a/apps/server/src/modules/learnroom/mapper/common-cartridge-import.mapper.ts b/apps/server/src/modules/learnroom/mapper/common-cartridge-import.mapper.ts index 826186cd4e..ac6d6ea27e 100644 --- a/apps/server/src/modules/learnroom/mapper/common-cartridge-import.mapper.ts +++ b/apps/server/src/modules/learnroom/mapper/common-cartridge-import.mapper.ts @@ -1,4 +1,5 @@ import { AnyElementContentBody, ContentElementType, LinkContentBody, RichTextContentBody } from '@modules/board'; +import { CardProps, ColumnProps } from '@modules/board/domain'; import { CommonCartridgeImportResourceProps, CommonCartridgeImportWebContentResourceProps, @@ -11,17 +12,18 @@ import { InputFormat } from '@shared/domain/types'; @Injectable() export class CommonCartridgeImportMapper { - public mapOrganizationToColumn(organization: CommonCartridgeOrganizationProps) { - return { + public mapOrganizationToColumn(organization: CommonCartridgeOrganizationProps): Partial { + const column = { title: organization.title, }; + + return column; } - public mapOrganizationToCard(organization: CommonCartridgeOrganizationProps, withTitle = true) { - return { - title: withTitle ? organization.title : '', - height: 150, - }; + public mapOrganizationToCard(organization: CommonCartridgeOrganizationProps, withTitle = true): Partial { + const card = { title: withTitle ? organization.title : '', height: 150 }; + + return card; } public mapOrganizationToTextElement(organization: CommonCartridgeOrganizationProps): AnyElementContentBody { @@ -69,7 +71,7 @@ export class CommonCartridgeImportMapper { const body = new RichTextContentBody(); body.text = resource.html; - body.inputFormat = InputFormat.RICH_TEXT_CK5_SIMPLE; + body.inputFormat = InputFormat.RICH_TEXT_CK4; return body; } diff --git a/apps/server/src/modules/learnroom/service/common-cartridge-import.service.spec.ts b/apps/server/src/modules/learnroom/service/common-cartridge-import.service.spec.ts index 39b1c20ad6..8d05a62cb8 100644 --- a/apps/server/src/modules/learnroom/service/common-cartridge-import.service.spec.ts +++ b/apps/server/src/modules/learnroom/service/common-cartridge-import.service.spec.ts @@ -25,19 +25,14 @@ describe('CommonCartridgeImportService', () => { const board2Title = ''; const board3Title = 'Spaltenboard 1'; - const column1ofBoard1Title = 'Test Text'; - const column1ofBoard2Title = 'Test Aufgabe'; - const column1ofBoard3Title = 'Spalte 1'; - const column2ofBoard3Title = 'Spalte 2'; - const column3ofBoard3Title = 'Spalte 3'; - const column4ofBoard3Title = 'Spalte 4'; - - const emptyCardTitle = ''; const card1Title = 'Karte 1'; const card2Title = 'Karte 2'; const card3Title = 'Karte 3'; const card4Title = 'Karte 4'; + const columnPlaceholderTitle1 = '1'; + const columnPlaceholderTitle2 = '2'; + // eslint-disable-next-line @typescript-eslint/no-unsafe-return const objectContainingTitle = (title: string) => expect.objectContaining({ title }); @@ -122,27 +117,15 @@ describe('CommonCartridgeImportService', () => { expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( objectContainingTitle(board1Title), - objectContainingTitle(column1ofBoard1Title) + objectContainingTitle(columnPlaceholderTitle1) ); expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( objectContainingTitle(board2Title), - objectContainingTitle(column1ofBoard2Title) - ); - expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(board3Title), - objectContainingTitle(column1ofBoard3Title) + objectContainingTitle(columnPlaceholderTitle1) ); expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( objectContainingTitle(board3Title), - objectContainingTitle(column2ofBoard3Title) - ); - expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(board3Title), - objectContainingTitle(column3ofBoard3Title) - ); - expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(board3Title), - objectContainingTitle(column4ofBoard3Title) + objectContainingTitle(columnPlaceholderTitle1) ); }); @@ -154,28 +137,20 @@ describe('CommonCartridgeImportService', () => { expect(spyBuildCard).toHaveBeenCalledTimes(6); expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(column1ofBoard1Title), - objectContainingTitle(emptyCardTitle) - ); - expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(column1ofBoard2Title), - objectContainingTitle(emptyCardTitle) - ); - expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(column1ofBoard3Title), - objectContainingTitle(card1Title) + objectContainingTitle(board1Title), + objectContainingTitle(columnPlaceholderTitle1) ); expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(column2ofBoard3Title), - objectContainingTitle(card2Title) + objectContainingTitle(board2Title), + objectContainingTitle(columnPlaceholderTitle1) ); expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(column3ofBoard3Title), - objectContainingTitle(card3Title) + objectContainingTitle(board3Title), + objectContainingTitle(columnPlaceholderTitle1) ); expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(column4ofBoard3Title), - objectContainingTitle(card4Title) + objectContainingTitle(board3Title), + objectContainingTitle(columnPlaceholderTitle2) ); }); @@ -186,10 +161,6 @@ describe('CommonCartridgeImportService', () => { expect(spyBuildContentElement).toHaveBeenCalledTimes(6); - expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( - objectContainingTitle(emptyCardTitle), - expect.any(RichTextElement) - ); expect(boardNodeServiceMock.addToParent).toHaveBeenCalledWith( objectContainingTitle(card1Title), expect.any(RichTextElement) @@ -209,16 +180,16 @@ describe('CommonCartridgeImportService', () => { expect(boardNodeServiceMock.updateContent).toHaveBeenCalledTimes(6); expect(boardNodeServiceMock.updateContent).toHaveBeenCalledWith(expect.any(RichTextElement), { - text: 'Test Text

Dies ist ein Textinhalt.

', - inputFormat: InputFormat.RICH_TEXT_CK5_SIMPLE, + text: '

Test Text

Dies ist ein Textinhalt.

', + inputFormat: InputFormat.RICH_TEXT_CK4, }); expect(boardNodeServiceMock.updateContent).toHaveBeenCalledWith(expect.any(RichTextElement), { - text: 'Test Aufgabe

', - inputFormat: InputFormat.RICH_TEXT_CK5_SIMPLE, + text: '

Test Aufgabe

', + inputFormat: InputFormat.RICH_TEXT_CK4, }); expect(boardNodeServiceMock.updateContent).toHaveBeenCalledWith(expect.any(RichTextElement), { text: '

Karteninhalt von Karte 1

', - inputFormat: InputFormat.RICH_TEXT_CK5_SIMPLE, + inputFormat: InputFormat.RICH_TEXT_CK4, }); expect(boardNodeServiceMock.updateContent).toHaveBeenCalledWith(expect.any(LinkElement), { title: 'Example Domain', diff --git a/apps/server/src/modules/learnroom/service/common-cartridge-import.service.ts b/apps/server/src/modules/learnroom/service/common-cartridge-import.service.ts index b73e90a5e9..c5b2ce786c 100644 --- a/apps/server/src/modules/learnroom/service/common-cartridge-import.service.ts +++ b/apps/server/src/modules/learnroom/service/common-cartridge-import.service.ts @@ -50,6 +50,7 @@ export class CommonCartridgeImportService { boardProps: CommonCartridgeImportOrganizationProps, organizations: CommonCartridgeImportOrganizationProps[] ): Promise { + const columnsTitleCounter = 0; const columnBoard = this.boardNodeFactory.buildColumnBoard({ context: { type: BoardExternalReferenceType.Course, @@ -60,14 +61,15 @@ export class CommonCartridgeImportService { }); await this.boardNodeService.addRoot(columnBoard); - await this.createColumns(parser, columnBoard, boardProps, organizations); + await this.createColumns(parser, columnBoard, boardProps, organizations, columnsTitleCounter); } private async createColumns( parser: CommonCartridgeFileParser, columnBoard: ColumnBoard, boardProps: CommonCartridgeImportOrganizationProps, - organizations: CommonCartridgeImportOrganizationProps[] + organizations: CommonCartridgeImportOrganizationProps[], + counter: number ): Promise { const columnsWithResource = organizations.filter( (organization) => @@ -75,7 +77,8 @@ export class CommonCartridgeImportService { ); for await (const columnWithResource of columnsWithResource) { - await this.createColumnWithResource(parser, columnBoard, columnWithResource); + counter += 1; + await this.createColumnWithResource(parser, columnBoard, columnWithResource, counter); } const columnsWithoutResource = organizations.filter( @@ -84,32 +87,33 @@ export class CommonCartridgeImportService { ); for await (const columnWithoutResource of columnsWithoutResource) { - await this.createColumn(parser, columnBoard, columnWithoutResource, organizations); + counter += 1; + await this.createColumn(parser, columnBoard, columnWithoutResource, organizations, counter); } } private async createColumnWithResource( parser: CommonCartridgeFileParser, columnBoard: ColumnBoard, - columnProps: CommonCartridgeImportOrganizationProps + columnProps: CommonCartridgeImportOrganizationProps, + counter: number ): Promise { const column = this.boardNodeFactory.buildColumn(); - const { title } = this.mapper.mapOrganizationToColumn(columnProps); - column.title = title; + column.title = `${counter}`; await this.boardNodeService.addToParent(columnBoard, column); - await this.createCardWithElement(parser, column, columnProps, false); + await this.createCardWithElement(parser, column, columnProps); } private async createColumn( parser: CommonCartridgeFileParser, columnBoard: ColumnBoard, columnProps: CommonCartridgeImportOrganizationProps, - organizations: CommonCartridgeImportOrganizationProps[] + organizations: CommonCartridgeImportOrganizationProps[], + counter: number ): Promise { const column = this.boardNodeFactory.buildColumn(); - const { title } = this.mapper.mapOrganizationToColumn(columnProps); - column.title = title; await this.boardNodeService.addToParent(columnBoard, column); + column.title = `${counter}`; const cards = organizations.filter( (organization) => organization.pathDepth === 2 && organization.path.startsWith(columnProps.path) @@ -118,7 +122,7 @@ export class CommonCartridgeImportService { const cardsWithResource = cards.filter((card) => card.isResource); for await (const card of cardsWithResource) { - await this.createCardWithElement(parser, column, card, true); + await this.createCardWithElement(parser, column, card); } const cardsWithoutResource = cards.filter((card) => !card.isResource); @@ -131,13 +135,11 @@ export class CommonCartridgeImportService { private async createCardWithElement( parser: CommonCartridgeFileParser, column: Column, - cardProps: CommonCartridgeImportOrganizationProps, - withTitle = true + cardProps: CommonCartridgeImportOrganizationProps ): Promise { const card = this.boardNodeFactory.buildCard(); - const { title, height } = this.mapper.mapOrganizationToCard(cardProps, withTitle); + const { title } = this.mapper.mapOrganizationToCard(cardProps); card.title = title; - card.height = height; await this.boardNodeService.addToParent(column, card); const resource = parser.getResource(cardProps); const contentElementType = this.mapper.mapResourceTypeToContentElementType(resource?.type); @@ -158,9 +160,8 @@ export class CommonCartridgeImportService { organizations: CommonCartridgeImportOrganizationProps[] ): Promise { const card = this.boardNodeFactory.buildCard(); - const { title, height } = this.mapper.mapOrganizationToCard(cardProps, true); + const { title } = this.mapper.mapOrganizationToCard(cardProps); card.title = title; - card.height = height; await this.boardNodeService.addToParent(column, card); const cardElements = organizations.filter( From 8f410ce977c69d78f37e9f811cda7bea7a1d2a0b Mon Sep 17 00:00:00 2001 From: mamutmk5 <3045922+mamutmk5@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:06:28 +0100 Subject: [PATCH 3/6] BC-8876 - set os filed for POD Templates from Deployments, CronJobs and Jobs (#5475) --- ansible/roles/common-cartridge/templates/deployment.yml.j2 | 2 ++ .../templates/api-h5p-library-management-cronjob.yml.j2 | 2 ++ .../roles/media-licenses/templates/vidis-sync-cronjob.yml.j2 | 2 ++ .../templates/media-metadata-sync-cronjob.yml.j2 | 2 ++ .../moin-schule-users-deletion-queueing-cronjob.yml.j2 | 2 ++ .../templates/moin-schule-users-sync-cronjob.yml.j2 | 2 ++ .../templates/admin-api-server-deployment.yml.j2 | 2 ++ .../templates/amqp-files-deployment.yml.j2 | 2 ++ .../templates/api-files-deployment.yml.j2 | 2 ++ .../schulcloud-server-core/templates/api-fwu-deployment.yml.j2 | 2 ++ .../templates/board-collaboration-deployment.yml.j2 | 2 ++ .../templates/data-deletion-trigger-cronjob.yml.j2 | 2 ++ .../roles/schulcloud-server-core/templates/migration-job.yml.j2 | 2 ++ .../templates/preview-generator-deployment.yml.j2 | 2 ++ .../schulcloud-server-h5p/templates/api-h5p-deployment.yml.j2 | 2 ++ ansible/roles/schulcloud-server-init/templates/job_init.yml.j2 | 2 ++ .../templates/management-deployment.yml.j2 | 2 ++ .../templates/api-ldap-sync-full-cronjob.yml.j2 | 2 ++ .../templates/api-ldap-worker-deployment.yml.j2 | 2 ++ .../templates/deployment.yml.j2 | 2 ++ .../templates/api-tsp-sync-base-cronjob.yml.j2 | 2 ++ .../templates/api-tsp-sync-cronjob.yml.j2 | 2 ++ .../templates/api-tsp-sync-deployment.yml.j2 | 2 ++ .../templates/api-tsp-sync-init.yml.j2 | 2 ++ .../templates/api-tsp-sync-school-cronjob.yml.j2 | 2 ++ 25 files changed, 50 insertions(+) diff --git a/ansible/roles/common-cartridge/templates/deployment.yml.j2 b/ansible/roles/common-cartridge/templates/deployment.yml.j2 index ff840ebd95..d9500a94d7 100644 --- a/ansible/roles/common-cartridge/templates/deployment.yml.j2 +++ b/ansible/roles/common-cartridge/templates/deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: common-cartridge image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/h5p-library-management/templates/api-h5p-library-management-cronjob.yml.j2 b/ansible/roles/h5p-library-management/templates/api-h5p-library-management-cronjob.yml.j2 index 4dc31a8418..bc987d63d7 100644 --- a/ansible/roles/h5p-library-management/templates/api-h5p-library-management-cronjob.yml.j2 +++ b/ansible/roles/h5p-library-management/templates/api-h5p-library-management-cronjob.yml.j2 @@ -35,6 +35,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux volumes: - name: libraries-list configMap: diff --git a/ansible/roles/media-licenses/templates/vidis-sync-cronjob.yml.j2 b/ansible/roles/media-licenses/templates/vidis-sync-cronjob.yml.j2 index 855bc85a85..ab338b8728 100644 --- a/ansible/roles/media-licenses/templates/vidis-sync-cronjob.yml.j2 +++ b/ansible/roles/media-licenses/templates/vidis-sync-cronjob.yml.j2 @@ -29,6 +29,8 @@ spec: git.branch: {{ SCHULCLOUD_SERVER_BRANCH_NAME }} git.repo: {{ SCHULCLOUD_SERVER_REPO_NAME }} spec: + os: + name: linux containers: - name: vidis-sync-cronjob image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/media-metadata-sync/templates/media-metadata-sync-cronjob.yml.j2 b/ansible/roles/media-metadata-sync/templates/media-metadata-sync-cronjob.yml.j2 index 99a5108779..b225b30c63 100644 --- a/ansible/roles/media-metadata-sync/templates/media-metadata-sync-cronjob.yml.j2 +++ b/ansible/roles/media-metadata-sync/templates/media-metadata-sync-cronjob.yml.j2 @@ -29,6 +29,8 @@ spec: git.branch: {{ SCHULCLOUD_SERVER_BRANCH_NAME }} git.repo: {{ SCHULCLOUD_SERVER_REPO_NAME }} spec: + os: + name: linux containers: - name: media-metadata-sync-cronjob image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/moin-schule-sync/templates/moin-schule-users-deletion-queueing-cronjob.yml.j2 b/ansible/roles/moin-schule-sync/templates/moin-schule-users-deletion-queueing-cronjob.yml.j2 index a336774e33..be9477f8f8 100644 --- a/ansible/roles/moin-schule-sync/templates/moin-schule-users-deletion-queueing-cronjob.yml.j2 +++ b/ansible/roles/moin-schule-sync/templates/moin-schule-users-deletion-queueing-cronjob.yml.j2 @@ -19,6 +19,8 @@ spec: spec: template: spec: + os: + name: linux containers: - name: moin-schule-users-deletion-queueing-cronjob image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/moin-schule-sync/templates/moin-schule-users-sync-cronjob.yml.j2 b/ansible/roles/moin-schule-sync/templates/moin-schule-users-sync-cronjob.yml.j2 index 30f78d5769..b8728902aa 100644 --- a/ansible/roles/moin-schule-sync/templates/moin-schule-users-sync-cronjob.yml.j2 +++ b/ansible/roles/moin-schule-sync/templates/moin-schule-users-sync-cronjob.yml.j2 @@ -19,6 +19,8 @@ spec: spec: template: spec: + os: + name: linux containers: - name: moin-schule-users-sync-cronjob image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-core/templates/admin-api-server-deployment.yml.j2 b/ansible/roles/schulcloud-server-core/templates/admin-api-server-deployment.yml.j2 index ae0ebe2fb6..5b770ad035 100644 --- a/ansible/roles/schulcloud-server-core/templates/admin-api-server-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-core/templates/admin-api-server-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-admin image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-core/templates/amqp-files-deployment.yml.j2 b/ansible/roles/schulcloud-server-core/templates/amqp-files-deployment.yml.j2 index 89bfe8d61c..8e357c0d26 100644 --- a/ansible/roles/schulcloud-server-core/templates/amqp-files-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-core/templates/amqp-files-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: amqp-files image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-core/templates/api-files-deployment.yml.j2 b/ansible/roles/schulcloud-server-core/templates/api-files-deployment.yml.j2 index d42d0af45b..acf98a0921 100644 --- a/ansible/roles/schulcloud-server-core/templates/api-files-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-core/templates/api-files-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-files image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-core/templates/api-fwu-deployment.yml.j2 b/ansible/roles/schulcloud-server-core/templates/api-fwu-deployment.yml.j2 index 340c939d0f..57d30efcde 100644 --- a/ansible/roles/schulcloud-server-core/templates/api-fwu-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-core/templates/api-fwu-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-fwu image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-core/templates/board-collaboration-deployment.yml.j2 b/ansible/roles/schulcloud-server-core/templates/board-collaboration-deployment.yml.j2 index dc0e0483c1..80da95e77d 100644 --- a/ansible/roles/schulcloud-server-core/templates/board-collaboration-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-core/templates/board-collaboration-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: board-collaboration image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-core/templates/data-deletion-trigger-cronjob.yml.j2 b/ansible/roles/schulcloud-server-core/templates/data-deletion-trigger-cronjob.yml.j2 index b8f4b9a9db..702793cb8e 100644 --- a/ansible/roles/schulcloud-server-core/templates/data-deletion-trigger-cronjob.yml.j2 +++ b/ansible/roles/schulcloud-server-core/templates/data-deletion-trigger-cronjob.yml.j2 @@ -34,6 +34,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: data-deletion-trigger-cronjob image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-core/templates/migration-job.yml.j2 b/ansible/roles/schulcloud-server-core/templates/migration-job.yml.j2 index 262aca5d07..3e4187176d 100644 --- a/ansible/roles/schulcloud-server-core/templates/migration-job.yml.j2 +++ b/ansible/roles/schulcloud-server-core/templates/migration-job.yml.j2 @@ -16,6 +16,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-migration-job image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-core/templates/preview-generator-deployment.yml.j2 b/ansible/roles/schulcloud-server-core/templates/preview-generator-deployment.yml.j2 index 4fdb651aa0..3bbbfa3982 100644 --- a/ansible/roles/schulcloud-server-core/templates/preview-generator-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-core/templates/preview-generator-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: preview-generator image: {{ SCHULCLOUD_SERVER_IMAGE }}:file-preview-{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-h5p/templates/api-h5p-deployment.yml.j2 b/ansible/roles/schulcloud-server-h5p/templates/api-h5p-deployment.yml.j2 index 0e52c547a1..a66cadd6cd 100644 --- a/ansible/roles/schulcloud-server-h5p/templates/api-h5p-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-h5p/templates/api-h5p-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-h5p image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-init/templates/job_init.yml.j2 b/ansible/roles/schulcloud-server-init/templates/job_init.yml.j2 index ffd8bc98ae..5ce8cf1ef9 100644 --- a/ansible/roles/schulcloud-server-init/templates/job_init.yml.j2 +++ b/ansible/roles/schulcloud-server-init/templates/job_init.yml.j2 @@ -7,6 +7,8 @@ metadata: spec: template: spec: + os: + name: linux containers: - name: api-init image: quay.io/schulcloudverbund/infra-tools:latest diff --git a/ansible/roles/schulcloud-server-init/templates/management-deployment.yml.j2 b/ansible/roles/schulcloud-server-init/templates/management-deployment.yml.j2 index 2b66bfe55a..6fafb3babb 100644 --- a/ansible/roles/schulcloud-server-init/templates/management-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-init/templates/management-deployment.yml.j2 @@ -46,6 +46,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-ldapsync/templates/api-ldap-sync-full-cronjob.yml.j2 b/ansible/roles/schulcloud-server-ldapsync/templates/api-ldap-sync-full-cronjob.yml.j2 index 51195209d2..9e882c0332 100644 --- a/ansible/roles/schulcloud-server-ldapsync/templates/api-ldap-sync-full-cronjob.yml.j2 +++ b/ansible/roles/schulcloud-server-ldapsync/templates/api-ldap-sync-full-cronjob.yml.j2 @@ -20,6 +20,8 @@ spec: activeDeadlineSeconds: {{ SERVER_LDAP_SYNC_FULL_CRONJOB_TIMEOUT|default("39600", true) }} template: spec: + os: + name: linux containers: - name: api-ldapsync-cronjob image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-ldapsync/templates/api-ldap-worker-deployment.yml.j2 b/ansible/roles/schulcloud-server-ldapsync/templates/api-ldap-worker-deployment.yml.j2 index 541310806f..8a87bbe8fe 100644 --- a/ansible/roles/schulcloud-server-ldapsync/templates/api-ldap-worker-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-ldapsync/templates/api-ldap-worker-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-worker image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-migration-system/templates/deployment.yml.j2 b/ansible/roles/schulcloud-server-migration-system/templates/deployment.yml.j2 index 6fefdfebfc..44283ec97d 100644 --- a/ansible/roles/schulcloud-server-migration-system/templates/deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-migration-system/templates/deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-migration-systems image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-base-cronjob.yml.j2 b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-base-cronjob.yml.j2 index 9626aaaf4f..87d65f701d 100644 --- a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-base-cronjob.yml.j2 +++ b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-base-cronjob.yml.j2 @@ -19,6 +19,8 @@ spec: spec: template: spec: + os: + name: linux containers: - name: api-tsp-sync-base-cronjob image: quay.io/schulcloudverbund/infra-tools:latest diff --git a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-cronjob.yml.j2 b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-cronjob.yml.j2 index 86d5d13eaa..0edcf8e47a 100644 --- a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-cronjob.yml.j2 +++ b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-cronjob.yml.j2 @@ -44,6 +44,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-tsp-sync-cronjob image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-deployment.yml.j2 b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-deployment.yml.j2 index f2ccf1a49c..05a3da0265 100644 --- a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-deployment.yml.j2 +++ b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-deployment.yml.j2 @@ -47,6 +47,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-tsp-sync image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-init.yml.j2 b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-init.yml.j2 index bac80cc915..7d3d51580c 100644 --- a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-init.yml.j2 +++ b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-init.yml.j2 @@ -30,6 +30,8 @@ spec: runAsGroup: 1000 fsGroup: 1000 runAsNonRoot: true + os: + name: linux containers: - name: api-tsp-sync-init image: {{ SCHULCLOUD_SERVER_IMAGE }}:{{ SCHULCLOUD_SERVER_IMAGE_TAG }} diff --git a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-school-cronjob.yml.j2 b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-school-cronjob.yml.j2 index 83fafbdc40..3d1b162ccf 100644 --- a/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-school-cronjob.yml.j2 +++ b/ansible/roles/schulcloud-server-tspsync/templates/api-tsp-sync-school-cronjob.yml.j2 @@ -19,6 +19,8 @@ spec: spec: template: spec: + os: + name: linux containers: - name: api-tsp-sync-school-cronjob image: quay.io/schulcloudverbund/infra-tools:latest From 48d0001172a0db0e2ae66d3ec05051d9445986e7 Mon Sep 17 00:00:00 2001 From: Phillip Date: Fri, 31 Jan 2025 10:52:07 +0100 Subject: [PATCH 4/6] BC-8877 change bbb checksum to sha512 (#5476) --- .../src/modules/video-conference/bbb/bbb.service.spec.ts | 4 ++-- apps/server/src/modules/video-conference/bbb/bbb.service.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/server/src/modules/video-conference/bbb/bbb.service.spec.ts b/apps/server/src/modules/video-conference/bbb/bbb.service.spec.ts index 98e6e1947e..fbfc9c96e1 100644 --- a/apps/server/src/modules/video-conference/bbb/bbb.service.spec.ts +++ b/apps/server/src/modules/video-conference/bbb/bbb.service.spec.ts @@ -399,13 +399,13 @@ describe(BBBService.name, () => { const { callName, createConfig, createHashMock } = setup(); const urlSearchParams = service.superToParams(createConfig); const queryString = urlSearchParams.toString(); - const sha = crypto.createHash('sha1'); + const sha = crypto.createHash('sha512'); const expectedChecksum = sha.update(callName + queryString + service.getSalt()).digest('hex'); const checksum = service.superGenerateChecksum(callName, urlSearchParams); expect(checksum).toEqual(expectedChecksum); - expect(createHashMock).toBeCalledWith('sha1'); + expect(createHashMock).toBeCalledWith('sha512'); }); it('getUrl: should return composed url', () => { diff --git a/apps/server/src/modules/video-conference/bbb/bbb.service.ts b/apps/server/src/modules/video-conference/bbb/bbb.service.ts index 5b3ace2f62..8ad48de76b 100644 --- a/apps/server/src/modules/video-conference/bbb/bbb.service.ts +++ b/apps/server/src/modules/video-conference/bbb/bbb.service.ts @@ -137,7 +137,7 @@ export class BBBService { */ protected generateChecksum(callName: string, queryParams: URLSearchParams): string { const queryString: string = queryParams.toString(); - const sha = crypto.createHash('sha1'); + const sha = crypto.createHash('sha512'); sha.update(callName + queryString + this.salt); const checksum: string = sha.digest('hex'); From 95465aee7bd609735e5f20aa32b2c9ffc319998e Mon Sep 17 00:00:00 2001 From: Patrick Sachmann <20001160+psachmann@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:47:25 +0100 Subject: [PATCH 5/6] EW-1071 Common Cartridge microservice creates boards during import (#5435) * creating new boards client * updating courses client * removing old boards client --- .../boards-client.adapter.spec.ts | 107 +++ .../boards-client/boards-client.adapter.ts | 19 + .../boards-client/boards-client.config.ts | 3 + .../boards-client.module.spec.ts | 60 ++ .../boards-client/boards-client.module.ts | 31 + .../boards-client/generated}/.gitignore | 0 .../boards-client/generated}/.npmignore | 0 .../generated}/.openapi-generator-ignore | 0 .../generated}/.openapi-generator/FILES | 43 +- .../boards-client/generated}/api.ts | 0 .../boards-client/generated/api/board-api.ts | 244 ++++++ .../boards-client/generated}/base.ts | 2 +- .../boards-client/generated}/common.ts | 0 .../boards-client/generated}/configuration.ts | 0 .../boards-client/generated}/git_push.sh | 0 .../boards-client/generated}/index.ts | 0 .../generated}/models/board-layout.ts | 0 .../generated}/models/board-parent-type.ts | 1 + .../generated}/models/board-response.ts | 0 .../models/card-skeleton-response.ts | 0 .../generated}/models/column-response.ts | 0 .../models/create-board-body-params.ts | 0 .../models/create-board-response.ts | 0 .../boards-client/generated}/models/index.ts | 6 - .../generated}/models/timestamps-response.ts | 0 apps/server/src/infra/boards-client/index.ts | 4 + .../courses-client/courses-client.adapter.ts | 13 +- .../generated/.openapi-generator/FILES | 1 + .../generated/api/courses-api.ts | 8 +- .../models/create-course-response.ts} | 10 +- .../courses-client/generated/models/index.ts | 1 + .../board/controller/board.controller.ts | 21 +- .../dto/board/create-board.body.params.ts | 8 +- .../service/column-board.service.spec.ts | 22 +- .../board/service/column-board.service.ts | 23 +- .../board-api-client/api/board-api.ts | 772 ------------------ .../models/api-validation-error.ts | 54 -- .../models/board-context-response.ts | 41 - .../models/board-external-reference-type.ts | 31 - .../models/copy-api-response.ts | 110 --- .../models/visibility-body-params.ts | 30 - .../board-client/board-client.adapter.spec.ts | 103 --- .../board-client/board-client.adapter.ts | 41 - .../board-client/board-client.config.ts | 5 - .../board-client/board-client.module.spec.ts | 28 - .../board-client/board-client.module.ts | 26 - .../board-client/dto/board-skeleton.dto.ts | 21 - .../board-client/dto/card-skeleton.dto.ts | 10 - .../board-client/dto/column-skeleton.dto.ts | 15 - .../board-client/dto/index.ts | 3 - .../board-client/index.ts | 4 - .../board-skeleton-response.mapper.spec.ts | 65 -- .../mapper/board-skeleton-response.mapper.ts | 29 - .../board-client/mapper/index.ts | 1 - .../common-cartridge.module.ts | 6 +- .../common-cartridge-export.service.spec.ts | 19 +- .../common-cartridge-export.service.ts | 17 +- .../common-cartridge-import.service.spec.ts | 37 +- .../common-cartridge-import.service.ts | 28 +- .../testing/common-cartridge-dtos.factory.ts | 20 +- .../learnroom/controller/course.controller.ts | 13 +- .../controller/dto/create-course.response.ts | 14 + .../modules/learnroom/controller/dto/index.ts | 1 + .../learnroom/mapper/course.mapper.spec.ts | 26 + .../modules/learnroom/mapper/course.mapper.ts | 12 +- .../learnroom/service/course.service.spec.ts | 21 +- .../learnroom/service/course.service.ts | 17 +- .../src/modules/learnroom/uc/course.uc.ts | 5 +- .../src/shared/repo/course/course.repo.ts | 19 +- openapitools.json | 36 +- package.json | 2 + 71 files changed, 791 insertions(+), 1518 deletions(-) create mode 100644 apps/server/src/infra/boards-client/boards-client.adapter.spec.ts create mode 100644 apps/server/src/infra/boards-client/boards-client.adapter.ts create mode 100644 apps/server/src/infra/boards-client/boards-client.config.ts create mode 100644 apps/server/src/infra/boards-client/boards-client.module.spec.ts create mode 100644 apps/server/src/infra/boards-client/boards-client.module.ts rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/.gitignore (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/.npmignore (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/.openapi-generator-ignore (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/.openapi-generator/FILES (63%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/api.ts (100%) create mode 100644 apps/server/src/infra/boards-client/generated/api/board-api.ts rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/base.ts (95%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/common.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/configuration.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/git_push.sh (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/index.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/board-layout.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/board-parent-type.ts (97%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/board-response.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/card-skeleton-response.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/column-response.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/create-board-body-params.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/create-board-response.ts (100%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/index.ts (54%) rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client => infra/boards-client/generated}/models/timestamps-response.ts (100%) create mode 100644 apps/server/src/infra/boards-client/index.ts rename apps/server/src/{modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/update-board-title-params.ts => infra/courses-client/generated/models/create-course-response.ts} (72%) delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api/board-api.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/api-validation-error.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-context-response.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-external-reference-type.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/copy-api-response.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/visibility-body-params.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.spec.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.config.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.spec.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/board-skeleton.dto.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/card-skeleton.dto.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/column-skeleton.dto.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/index.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/index.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.spec.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.ts delete mode 100644 apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/index.ts create mode 100644 apps/server/src/modules/learnroom/controller/dto/create-course.response.ts create mode 100644 apps/server/src/modules/learnroom/mapper/course.mapper.spec.ts diff --git a/apps/server/src/infra/boards-client/boards-client.adapter.spec.ts b/apps/server/src/infra/boards-client/boards-client.adapter.spec.ts new file mode 100644 index 0000000000..c5a8230fb8 --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.adapter.spec.ts @@ -0,0 +1,107 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { createMock } from '@golevelup/ts-jest'; +import { faker } from '@faker-js/faker'; +import { axiosResponseFactory } from '@testing/factory/axios-response.factory'; +import { BoardsClientAdapter } from './boards-client.adapter'; +import { BoardApi, BoardResponse, CreateBoardBodyParams, CreateBoardResponse } from './generated'; + +describe(BoardsClientAdapter.name, () => { + let module: TestingModule; + let sut: BoardsClientAdapter; + + const boardApiMock = createMock(); + + beforeAll(async () => { + module = await Test.createTestingModule({ + providers: [ + BoardsClientAdapter, + { + provide: BoardApi, + useValue: boardApiMock, + }, + ], + }).compile(); + sut = module.get(BoardsClientAdapter); + }); + + afterAll(async () => { + await module.close(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(sut).toBeDefined(); + }); + + describe('createBoard', () => { + describe('when creating a board', () => { + const setup = () => { + const params: CreateBoardBodyParams = { + title: faker.lorem.words(), + layout: 'columns', + parentId: faker.string.uuid(), + parentType: 'course', + }; + const responseData: CreateBoardResponse = { + id: faker.string.uuid(), + }; + + boardApiMock.boardControllerCreateBoard.mockResolvedValue(axiosResponseFactory.build({ data: responseData })); + + return { + params, + responseData, + }; + }; + + it('should call boardApi.boardControllerCreateBoard', async () => { + const { params, responseData } = setup(); + + const response = await sut.createBoard(params); + + expect(response).toEqual(responseData); + expect(boardApiMock.boardControllerCreateBoard).toHaveBeenCalledWith(params); + }); + }); + }); + + describe('getBoardSkeletonById', () => { + describe('when reading a board', () => { + const setup = () => { + const boardId = faker.string.uuid(); + const responseData: BoardResponse = { + id: boardId, + title: faker.lorem.words(), + layout: 'columns', + columns: [], + isVisible: true, + timestamps: { + createdAt: faker.date.recent().toISOString(), + lastUpdatedAt: faker.date.recent().toISOString(), + }, + }; + + boardApiMock.boardControllerGetBoardSkeleton.mockResolvedValue( + axiosResponseFactory.build({ data: responseData }) + ); + + return { + boardId, + responseData, + }; + }; + + it('should call boardApi.boardControllerGetBoardSkeleton', async () => { + const { boardId, responseData } = setup(); + + const response = await sut.getBoardSkeletonById(boardId); + + expect(response).toEqual(responseData); + expect(boardApiMock.boardControllerGetBoardSkeleton).toHaveBeenCalledWith(boardId); + }); + }); + }); +}); diff --git a/apps/server/src/infra/boards-client/boards-client.adapter.ts b/apps/server/src/infra/boards-client/boards-client.adapter.ts new file mode 100644 index 0000000000..3665f9b0bc --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.adapter.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@nestjs/common'; +import { BoardApi, BoardResponse, CreateBoardBodyParams, CreateBoardResponse } from './generated'; + +@Injectable() +export class BoardsClientAdapter { + constructor(private readonly boardApi: BoardApi) {} + + public async createBoard(params: CreateBoardBodyParams): Promise { + const response = await this.boardApi.boardControllerCreateBoard(params); + + return response.data; + } + + public async getBoardSkeletonById(boardId: string): Promise { + const response = await this.boardApi.boardControllerGetBoardSkeleton(boardId); + + return response.data; + } +} diff --git a/apps/server/src/infra/boards-client/boards-client.config.ts b/apps/server/src/infra/boards-client/boards-client.config.ts new file mode 100644 index 0000000000..60de28e988 --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.config.ts @@ -0,0 +1,3 @@ +export interface BoardsClientConfig { + API_HOST: string; +} diff --git a/apps/server/src/infra/boards-client/boards-client.module.spec.ts b/apps/server/src/infra/boards-client/boards-client.module.spec.ts new file mode 100644 index 0000000000..996eda0434 --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.module.spec.ts @@ -0,0 +1,60 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigModule } from '@nestjs/config'; +import { faker } from '@faker-js/faker'; +import { Request } from 'express'; +import { createMock } from '@golevelup/ts-jest'; +import { REQUEST } from '@nestjs/core'; +import { BoardsClientAdapter } from './boards-client.adapter'; +import { BoardsClientConfig } from './boards-client.config'; +import { BoardsClientModule } from './boards-client.module'; + +describe(BoardsClientModule.name, () => { + let module: TestingModule; + + const requestMock = createMock({ + headers: { + authorization: `Bearer ${faker.string.alphanumeric(42)}`, + }, + }); + + beforeEach(async () => { + module = await Test.createTestingModule({ + imports: [ + BoardsClientModule, + ConfigModule.forRoot({ + isGlobal: true, + load: [ + (): BoardsClientConfig => { + return { + API_HOST: faker.internet.url(), + }; + }, + ], + }), + ], + }) + .overrideProvider(REQUEST) + .useValue(requestMock) + .compile(); + }); + + afterAll(async () => { + await module.close(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(module).toBeDefined(); + }); + + describe('when resolving dependencies', () => { + it('should resolve BoardsClientAdapter', async () => { + const adapter = await module.resolve(BoardsClientAdapter); + + expect(adapter).toBeInstanceOf(BoardsClientAdapter); + }); + }); +}); diff --git a/apps/server/src/infra/boards-client/boards-client.module.ts b/apps/server/src/infra/boards-client/boards-client.module.ts new file mode 100644 index 0000000000..c373b5160f --- /dev/null +++ b/apps/server/src/infra/boards-client/boards-client.module.ts @@ -0,0 +1,31 @@ +import { Module, Scope } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { REQUEST } from '@nestjs/core'; +import { Request } from 'express'; +import { JwtExtractor } from '@shared/common/utils'; +import { BoardsClientAdapter } from './boards-client.adapter'; +import { BoardsClientConfig } from './boards-client.config'; +import { Configuration, BoardApi } from './generated'; + +@Module({ + providers: [ + BoardsClientAdapter, + { + provide: BoardApi, + scope: Scope.REQUEST, + useFactory: (configService: ConfigService, request: Request): BoardApi => { + const basePath = configService.getOrThrow('API_HOST'); + const accessToken = JwtExtractor.extractJwtFromRequest(request); + const configuration = new Configuration({ + basePath: `${basePath}/v3`, + accessToken, + }); + + return new BoardApi(configuration); + }, + inject: [ConfigService, REQUEST], + }, + ], + exports: [BoardsClientAdapter], +}) +export class BoardsClientModule {} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.gitignore b/apps/server/src/infra/boards-client/generated/.gitignore similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.gitignore rename to apps/server/src/infra/boards-client/generated/.gitignore diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.npmignore b/apps/server/src/infra/boards-client/generated/.npmignore similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.npmignore rename to apps/server/src/infra/boards-client/generated/.npmignore diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator-ignore b/apps/server/src/infra/boards-client/generated/.openapi-generator-ignore similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator-ignore rename to apps/server/src/infra/boards-client/generated/.openapi-generator-ignore diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator/FILES b/apps/server/src/infra/boards-client/generated/.openapi-generator/FILES similarity index 63% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator/FILES rename to apps/server/src/infra/boards-client/generated/.openapi-generator/FILES index dcd8a9a93e..172bae4ab4 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/.openapi-generator/FILES +++ b/apps/server/src/infra/boards-client/generated/.openapi-generator/FILES @@ -1,24 +1,19 @@ -.gitignore -.npmignore -api.ts -api/board-api.ts -base.ts -common.ts -configuration.ts -git_push.sh -index.ts -models/api-validation-error.ts -models/board-context-response.ts -models/board-external-reference-type.ts -models/board-layout.ts -models/board-parent-type.ts -models/board-response.ts -models/card-skeleton-response.ts -models/column-response.ts -models/copy-api-response.ts -models/create-board-body-params.ts -models/create-board-response.ts -models/index.ts -models/timestamps-response.ts -models/update-board-title-params.ts -models/visibility-body-params.ts +.gitignore +.npmignore +.openapi-generator-ignore +api.ts +api/board-api.ts +base.ts +common.ts +configuration.ts +git_push.sh +index.ts +models/board-layout.ts +models/board-parent-type.ts +models/board-response.ts +models/card-skeleton-response.ts +models/column-response.ts +models/create-board-body-params.ts +models/create-board-response.ts +models/index.ts +models/timestamps-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api.ts b/apps/server/src/infra/boards-client/generated/api.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api.ts rename to apps/server/src/infra/boards-client/generated/api.ts diff --git a/apps/server/src/infra/boards-client/generated/api/board-api.ts b/apps/server/src/infra/boards-client/generated/api/board-api.ts new file mode 100644 index 0000000000..68d76b8a45 --- /dev/null +++ b/apps/server/src/infra/boards-client/generated/api/board-api.ts @@ -0,0 +1,244 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Schulcloud-Verbund-Software Server API + * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. + * + * The version of the OpenAPI document: 3.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import type { Configuration } from '../configuration'; +import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; +import globalAxios from 'axios'; +// Some imports not used depending on template conditions +// @ts-ignore +import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base'; +// @ts-ignore +import type { ApiValidationError } from '../models'; +// @ts-ignore +import type { BoardResponse } from '../models'; +// @ts-ignore +import type { CreateBoardBodyParams } from '../models'; +// @ts-ignore +import type { CreateBoardResponse } from '../models'; +/** + * BoardApi - axios parameter creator + * @export + */ +export const BoardApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + boardControllerCreateBoard: async (createBoardBodyParams: CreateBoardBodyParams, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'createBoardBodyParams' is not null or undefined + assertParamExists('boardControllerCreateBoard', 'createBoardBodyParams', createBoardBodyParams) + const localVarPath = `/boards`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(createBoardBodyParams, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + boardControllerGetBoardSkeleton: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'boardId' is not null or undefined + assertParamExists('boardControllerGetBoardSkeleton', 'boardId', boardId) + const localVarPath = `/boards/{boardId}` + .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * BoardApi - functional programming interface + * @export + */ +export const BoardApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = BoardApiAxiosParamCreator(configuration) + return { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerCreateBoard(createBoardBodyParams, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerCreateBoard']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerGetBoardSkeleton(boardId, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerGetBoardSkeleton']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + } +}; + +/** + * BoardApi - factory interface + * @export + */ +export const BoardApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = BoardApiFp(configuration) + return { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: any): AxiosPromise { + return localVarFp.boardControllerCreateBoard(createBoardBodyParams, options).then((request) => request(axios, basePath)); + }, + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + boardControllerGetBoardSkeleton(boardId: string, options?: any): AxiosPromise { + return localVarFp.boardControllerGetBoardSkeleton(boardId, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * BoardApi - interface + * @export + * @interface BoardApi + */ +export interface BoardApiInterface { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof BoardApiInterface + */ + boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof BoardApiInterface + */ + boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; + +} + +/** + * BoardApi - object-oriented interface + * @export + * @class BoardApi + * @extends {BaseAPI} + */ +export class BoardApi extends BaseAPI implements BoardApiInterface { + /** + * + * @summary Create a new board. + * @param {CreateBoardBodyParams} createBoardBodyParams + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof BoardApi + */ + public boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig) { + return BoardApiFp(this.configuration).boardControllerCreateBoard(createBoardBodyParams, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * + * @summary Get the skeleton of a a board. + * @param {string} boardId The id of the board. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof BoardApi + */ + public boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig) { + return BoardApiFp(this.configuration).boardControllerGetBoardSkeleton(boardId, options).then((request) => request(this.axios, this.basePath)); + } +} + diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/base.ts b/apps/server/src/infra/boards-client/generated/base.ts similarity index 95% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/base.ts rename to apps/server/src/infra/boards-client/generated/base.ts index 82686c7b81..5bcf014a72 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/base.ts +++ b/apps/server/src/infra/boards-client/generated/base.ts @@ -19,7 +19,7 @@ import type { Configuration } from './configuration'; import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; import globalAxios from 'axios'; -export const BASE_PATH = "http://localhost/api/v3".replace(/\/+$/, ""); +export const BASE_PATH = "http://localhost:3030/api/v3".replace(/\/+$/, ""); /** * diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/common.ts b/apps/server/src/infra/boards-client/generated/common.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/common.ts rename to apps/server/src/infra/boards-client/generated/common.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/configuration.ts b/apps/server/src/infra/boards-client/generated/configuration.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/configuration.ts rename to apps/server/src/infra/boards-client/generated/configuration.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/git_push.sh b/apps/server/src/infra/boards-client/generated/git_push.sh similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/git_push.sh rename to apps/server/src/infra/boards-client/generated/git_push.sh diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/index.ts b/apps/server/src/infra/boards-client/generated/index.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/index.ts rename to apps/server/src/infra/boards-client/generated/index.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-layout.ts b/apps/server/src/infra/boards-client/generated/models/board-layout.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-layout.ts rename to apps/server/src/infra/boards-client/generated/models/board-layout.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-parent-type.ts b/apps/server/src/infra/boards-client/generated/models/board-parent-type.ts similarity index 97% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-parent-type.ts rename to apps/server/src/infra/boards-client/generated/models/board-parent-type.ts index 3c8d64356b..6193dd4737 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-parent-type.ts +++ b/apps/server/src/infra/boards-client/generated/models/board-parent-type.ts @@ -22,6 +22,7 @@ export const BoardParentType = { COURSE: 'course', + ROOM: 'room', USER: 'user' } as const; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-response.ts b/apps/server/src/infra/boards-client/generated/models/board-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-response.ts rename to apps/server/src/infra/boards-client/generated/models/board-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/card-skeleton-response.ts b/apps/server/src/infra/boards-client/generated/models/card-skeleton-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/card-skeleton-response.ts rename to apps/server/src/infra/boards-client/generated/models/card-skeleton-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/column-response.ts b/apps/server/src/infra/boards-client/generated/models/column-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/column-response.ts rename to apps/server/src/infra/boards-client/generated/models/column-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/create-board-body-params.ts b/apps/server/src/infra/boards-client/generated/models/create-board-body-params.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/create-board-body-params.ts rename to apps/server/src/infra/boards-client/generated/models/create-board-body-params.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/create-board-response.ts b/apps/server/src/infra/boards-client/generated/models/create-board-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/create-board-response.ts rename to apps/server/src/infra/boards-client/generated/models/create-board-response.ts diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/index.ts b/apps/server/src/infra/boards-client/generated/models/index.ts similarity index 54% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/index.ts rename to apps/server/src/infra/boards-client/generated/models/index.ts index 32513649ae..0354f94654 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/index.ts +++ b/apps/server/src/infra/boards-client/generated/models/index.ts @@ -1,14 +1,8 @@ -export * from './api-validation-error'; -export * from './board-context-response'; -export * from './board-external-reference-type'; export * from './board-layout'; export * from './board-parent-type'; export * from './board-response'; export * from './card-skeleton-response'; export * from './column-response'; -export * from './copy-api-response'; export * from './create-board-body-params'; export * from './create-board-response'; export * from './timestamps-response'; -export * from './update-board-title-params'; -export * from './visibility-body-params'; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/timestamps-response.ts b/apps/server/src/infra/boards-client/generated/models/timestamps-response.ts similarity index 100% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/timestamps-response.ts rename to apps/server/src/infra/boards-client/generated/models/timestamps-response.ts diff --git a/apps/server/src/infra/boards-client/index.ts b/apps/server/src/infra/boards-client/index.ts new file mode 100644 index 0000000000..d98df00e1e --- /dev/null +++ b/apps/server/src/infra/boards-client/index.ts @@ -0,0 +1,4 @@ +export { BoardsClientAdapter } from './boards-client.adapter'; +export { BoardsClientConfig } from './boards-client.config'; +export { BoardsClientModule } from './boards-client.module'; +export type * from './generated/models'; diff --git a/apps/server/src/infra/courses-client/courses-client.adapter.ts b/apps/server/src/infra/courses-client/courses-client.adapter.ts index 4628d93f2d..b862675fa7 100644 --- a/apps/server/src/infra/courses-client/courses-client.adapter.ts +++ b/apps/server/src/infra/courses-client/courses-client.adapter.ts @@ -1,5 +1,10 @@ import { Injectable } from '@nestjs/common'; -import { CourseCommonCartridgeMetadataResponse, CoursesApi, CreateCourseBodyParams } from './generated'; +import { + CourseCommonCartridgeMetadataResponse, + CoursesApi, + CreateCourseBodyParams, + CreateCourseResponse, +} from './generated'; @Injectable() export class CoursesClientAdapter { @@ -11,7 +16,9 @@ export class CoursesClientAdapter { return response.data; } - public async createCourse(params: CreateCourseBodyParams): Promise { - await this.coursesApi.courseControllerCreateCourse(params); + public async createCourse(params: CreateCourseBodyParams): Promise { + const response = await this.coursesApi.courseControllerCreateCourse(params); + + return response.data; } } diff --git a/apps/server/src/infra/courses-client/generated/.openapi-generator/FILES b/apps/server/src/infra/courses-client/generated/.openapi-generator/FILES index e10dec0e56..6d8aa5a56d 100644 --- a/apps/server/src/infra/courses-client/generated/.openapi-generator/FILES +++ b/apps/server/src/infra/courses-client/generated/.openapi-generator/FILES @@ -10,4 +10,5 @@ git_push.sh index.ts models/course-common-cartridge-metadata-response.ts models/create-course-body-params.ts +models/create-course-response.ts models/index.ts diff --git a/apps/server/src/infra/courses-client/generated/api/courses-api.ts b/apps/server/src/infra/courses-client/generated/api/courses-api.ts index 9be58d522b..50ca3d7637 100644 --- a/apps/server/src/infra/courses-client/generated/api/courses-api.ts +++ b/apps/server/src/infra/courses-client/generated/api/courses-api.ts @@ -25,6 +25,8 @@ import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError import type { CourseCommonCartridgeMetadataResponse } from '../models'; // @ts-ignore import type { CreateCourseBodyParams } from '../models'; +// @ts-ignore +import type { CreateCourseResponse } from '../models'; /** * CoursesApi - axios parameter creator * @export @@ -126,7 +128,7 @@ export const CoursesApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.courseControllerCreateCourse(createCourseBodyParams, options); const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerBasePath = operationServerMap['CoursesApi.courseControllerCreateCourse']?.[localVarOperationServerIndex]?.url; @@ -162,7 +164,7 @@ export const CoursesApiFactory = function (configuration?: Configuration, basePa * @param {*} [options] Override http request option. * @throws {RequiredError} */ - courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: any): AxiosPromise { + courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: any): AxiosPromise { return localVarFp.courseControllerCreateCourse(createCourseBodyParams, options).then((request) => request(axios, basePath)); }, /** @@ -192,7 +194,7 @@ export interface CoursesApiInterface { * @throws {RequiredError} * @memberof CoursesApiInterface */ - courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; + courseControllerCreateCourse(createCourseBodyParams: CreateCourseBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; /** * diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/update-board-title-params.ts b/apps/server/src/infra/courses-client/generated/models/create-course-response.ts similarity index 72% rename from apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/update-board-title-params.ts rename to apps/server/src/infra/courses-client/generated/models/create-course-response.ts index d5d90955c3..bbffda3237 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/update-board-title-params.ts +++ b/apps/server/src/infra/courses-client/generated/models/create-course-response.ts @@ -17,14 +17,14 @@ /** * * @export - * @interface UpdateBoardTitleParams + * @interface CreateCourseResponse */ -export interface UpdateBoardTitleParams { +export interface CreateCourseResponse { /** - * + * The id of the created course * @type {string} - * @memberof UpdateBoardTitleParams + * @memberof CreateCourseResponse */ - 'title': string; + 'courseId': string; } diff --git a/apps/server/src/infra/courses-client/generated/models/index.ts b/apps/server/src/infra/courses-client/generated/models/index.ts index 3a4d2661a7..0cc02a2c36 100644 --- a/apps/server/src/infra/courses-client/generated/models/index.ts +++ b/apps/server/src/infra/courses-client/generated/models/index.ts @@ -1,2 +1,3 @@ export * from './course-common-cartridge-metadata-response'; export * from './create-course-body-params'; +export * from './create-course-response'; diff --git a/apps/server/src/modules/board/controller/board.controller.ts b/apps/server/src/modules/board/controller/board.controller.ts index 8b40226a40..3ed6fdf9c8 100644 --- a/apps/server/src/modules/board/controller/board.controller.ts +++ b/apps/server/src/modules/board/controller/board.controller.ts @@ -41,7 +41,7 @@ export class BoardController { @ApiResponse({ status: 403, type: ForbiddenException }) @ApiResponse({ status: 404, type: NotFoundException }) @Post() - async createBoard( + public async createBoard( @Body() bodyParams: CreateBoardBodyParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -58,7 +58,7 @@ export class BoardController { @ApiResponse({ status: 403, type: ForbiddenException }) @ApiResponse({ status: 404, type: NotFoundException }) @Get(':boardId') - async getBoardSkeleton( + public async getBoardSkeleton( @Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -75,7 +75,7 @@ export class BoardController { @ApiResponse({ status: 403, type: ForbiddenException }) @ApiResponse({ status: 404, type: NotFoundException }) @Get(':boardId/context') - async getBoardContext( + public async getBoardContext( @Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -93,7 +93,7 @@ export class BoardController { @ApiResponse({ status: 404, type: NotFoundException }) @HttpCode(204) @Patch(':boardId/title') - async updateBoardTitle( + public async updateBoardTitle( @Param() urlParams: BoardUrlParams, @Body() bodyParams: UpdateBoardTitleParams, @CurrentUser() currentUser: ICurrentUser @@ -108,7 +108,10 @@ export class BoardController { @ApiResponse({ status: 404, type: NotFoundException }) @HttpCode(204) @Delete(':boardId') - async deleteBoard(@Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser): Promise { + public async deleteBoard( + @Param() urlParams: BoardUrlParams, + @CurrentUser() currentUser: ICurrentUser + ): Promise { await this.boardUc.deleteBoard(currentUser.userId, urlParams.boardId); } @@ -118,7 +121,7 @@ export class BoardController { @ApiResponse({ status: 403, type: ForbiddenException }) @ApiResponse({ status: 404, type: NotFoundException }) @Post(':boardId/columns') - async createColumn( + public async createColumn( @Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -136,7 +139,7 @@ export class BoardController { @ApiResponse({ status: 404, type: NotFoundException }) @Post(':boardId/copy') @RequestTimeout('INCOMING_REQUEST_TIMEOUT_COPY_API') - async copyBoard( + public async copyBoard( @Param() urlParams: BoardUrlParams, @CurrentUser() currentUser: ICurrentUser ): Promise { @@ -152,11 +155,11 @@ export class BoardController { @ApiResponse({ status: 404, type: NotFoundException }) @HttpCode(204) @Patch(':boardId/visibility') - async updateVisibility( + public async updateVisibility( @Param() urlParams: BoardUrlParams, @Body() bodyParams: VisibilityBodyParams, @CurrentUser() currentUser: ICurrentUser - ) { + ): Promise { await this.boardUc.updateVisibility(currentUser.userId, urlParams.boardId, bodyParams.isVisible); } diff --git a/apps/server/src/modules/board/controller/dto/board/create-board.body.params.ts b/apps/server/src/modules/board/controller/dto/board/create-board.body.params.ts index 8c59f934c4..546e69a64f 100644 --- a/apps/server/src/modules/board/controller/dto/board/create-board.body.params.ts +++ b/apps/server/src/modules/board/controller/dto/board/create-board.body.params.ts @@ -11,14 +11,14 @@ export class CreateBoardBodyParams { @MinLength(1) @MaxLength(100) @SanitizeHtml() - title!: string; + public title!: string; @IsMongoId() @ApiProperty({ description: 'The id of the parent', required: true, }) - parentId!: string; + public parentId!: string; @ApiProperty({ description: 'The type of the parent', @@ -27,7 +27,7 @@ export class CreateBoardBodyParams { enumName: 'BoardParentType', }) @IsEnum(BoardExternalReferenceType) - parentType!: BoardExternalReferenceType; + public parentType!: BoardExternalReferenceType; @ApiProperty({ description: 'The layout of the board', @@ -37,5 +37,5 @@ export class CreateBoardBodyParams { }) @IsEnum(BoardLayout, {}) @NotEquals(BoardLayout[BoardLayout.GRID]) - layout!: BoardLayout; + public layout!: BoardLayout; } diff --git a/apps/server/src/modules/board/service/column-board.service.spec.ts b/apps/server/src/modules/board/service/column-board.service.spec.ts index 64d59057a7..5a7e49021c 100644 --- a/apps/server/src/modules/board/service/column-board.service.spec.ts +++ b/apps/server/src/modules/board/service/column-board.service.spec.ts @@ -4,7 +4,7 @@ import { StorageLocation } from '@modules/files-storage/interface'; import { Test, TestingModule } from '@nestjs/testing'; import { EntityId } from '@shared/domain/types'; import { CopyElementType, CopyStatus, CopyStatusEnum } from '../../copy-helper'; -import { BoardExternalReference, BoardExternalReferenceType, ColumnBoard } from '../domain'; +import { BoardExternalReference, BoardExternalReferenceType, ColumnBoard, ColumnBoardProps } from '../domain'; import { BoardNodeRepo } from '../repo'; import { columnBoardFactory } from '../testing'; import { BoardNodeService } from './board-node.service'; @@ -131,4 +131,24 @@ describe('ColumnBoardService', () => { expect(result).toEqual(columnBoard); }); + + describe('createColumnBoard', () => { + describe('when creating new ColumnBoard', () => { + const setup = () => { + const columnBoard = columnBoardFactory.build() as unknown as ColumnBoardProps; + + repo.save.mockResolvedValue(); + + return { columnBoard }; + }; + + it('should call BoardNodeRepo', async () => { + const { columnBoard } = setup(); + + await service.createColumnBoard(columnBoard); + + expect(repo.save).toHaveBeenCalledTimes(1); + }); + }); + }); }); diff --git a/apps/server/src/modules/board/service/column-board.service.ts b/apps/server/src/modules/board/service/column-board.service.ts index d468adf595..18803c5151 100644 --- a/apps/server/src/modules/board/service/column-board.service.ts +++ b/apps/server/src/modules/board/service/column-board.service.ts @@ -6,6 +6,7 @@ import { BoardExternalReference, BoardExternalReferenceType, ColumnBoard, + ColumnBoardProps, isColumnBoard, } from '../domain'; import { BoardNodeRepo } from '../repo'; @@ -21,13 +22,13 @@ export class ColumnBoardService { private readonly columnBoardLinkService: ColumnBoardLinkService ) {} - async findById(id: EntityId, depth?: number): Promise { - const columnBoard = this.boardNodeService.findByClassAndId(ColumnBoard, id, depth); + public async findById(id: EntityId, depth?: number): Promise { + const columnBoard = await this.boardNodeService.findByClassAndId(ColumnBoard, id, depth); return columnBoard; } - async findByExternalReference(reference: BoardExternalReference, depth?: number): Promise { + public async findByExternalReference(reference: BoardExternalReference, depth?: number): Promise { const boardNodes: AnyBoardNode[] = await this.boardNodeRepo.findByExternalReference(reference, depth); const boards: ColumnBoard[] = boardNodes.filter((bn: AnyBoardNode): bn is ColumnBoard => isColumnBoard(bn)); @@ -35,13 +36,13 @@ export class ColumnBoardService { return boards; } - async updateVisibility(columnBoard: ColumnBoard, visibility: boolean): Promise { + public async updateVisibility(columnBoard: ColumnBoard, visibility: boolean): Promise { await this.boardNodeService.updateVisibility(columnBoard, visibility); } // called from feathers // TODO remove when not needed anymore - async deleteByCourseId(courseId: EntityId): Promise { + public async deleteByCourseId(courseId: EntityId): Promise { const boardNodes = await this.findByExternalReference({ type: BoardExternalReferenceType.Course, id: courseId, @@ -50,15 +51,23 @@ export class ColumnBoardService { await this.boardNodeRepo.delete(boardNodes); } - async copyColumnBoard(params: CopyColumnBoardParams): Promise { + public async copyColumnBoard(params: CopyColumnBoardParams): Promise { const copyStatus = await this.columnBoardCopyService.copyColumnBoard(params); return copyStatus; } - async swapLinkedIds(boardId: EntityId, idMap: Map): Promise { + public async swapLinkedIds(boardId: EntityId, idMap: Map): Promise { const board = await this.columnBoardLinkService.swapLinkedIds(boardId, idMap); return board; } + + public async createColumnBoard(props: ColumnBoardProps): Promise { + const columnBoard = new ColumnBoard(props); + + await this.boardNodeRepo.save(columnBoard); + + return columnBoard; + } } diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api/board-api.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api/board-api.ts deleted file mode 100644 index 72900986b5..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/api/board-api.ts +++ /dev/null @@ -1,772 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -import type { Configuration } from '../configuration'; -import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; -import globalAxios from 'axios'; -// Some imports not used depending on template conditions -// @ts-ignore -import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; -// @ts-ignore -import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base'; -// @ts-ignore -import type { ApiValidationError } from '../models'; -// @ts-ignore -import type { BoardContextResponse } from '../models'; -// @ts-ignore -import type { BoardResponse } from '../models'; -// @ts-ignore -import type { ColumnResponse } from '../models'; -// @ts-ignore -import type { CopyApiResponse } from '../models'; -// @ts-ignore -import type { CreateBoardBodyParams } from '../models'; -// @ts-ignore -import type { CreateBoardResponse } from '../models'; -// @ts-ignore -import type { UpdateBoardTitleParams } from '../models'; -// @ts-ignore -import type { VisibilityBodyParams } from '../models'; -/** - * BoardApi - axios parameter creator - * @export - */ -export const BoardApiAxiosParamCreator = function (configuration?: Configuration) { - return { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCopyBoard: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerCopyBoard', 'boardId', boardId) - const localVarPath = `/boards/{boardId}/copy` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCreateBoard: async (createBoardBodyParams: CreateBoardBodyParams, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'createBoardBodyParams' is not null or undefined - assertParamExists('boardControllerCreateBoard', 'createBoardBodyParams', createBoardBodyParams) - const localVarPath = `/boards`; - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(createBoardBodyParams, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCreateColumn: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerCreateColumn', 'boardId', boardId) - const localVarPath = `/boards/{boardId}/columns` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerDeleteBoard: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerDeleteBoard', 'boardId', boardId) - const localVarPath = `/boards/{boardId}` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerGetBoardContext: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerGetBoardContext', 'boardId', boardId) - const localVarPath = `/boards/{boardId}/context` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerGetBoardSkeleton: async (boardId: string, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerGetBoardSkeleton', 'boardId', boardId) - const localVarPath = `/boards/{boardId}` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerUpdateBoardTitle: async (boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerUpdateBoardTitle', 'boardId', boardId) - // verify required parameter 'updateBoardTitleParams' is not null or undefined - assertParamExists('boardControllerUpdateBoardTitle', 'updateBoardTitleParams', updateBoardTitleParams) - const localVarPath = `/boards/{boardId}/title` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(updateBoardTitleParams, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerUpdateVisibility: async (boardId: string, visibilityBodyParams: VisibilityBodyParams, options: RawAxiosRequestConfig = {}): Promise => { - // verify required parameter 'boardId' is not null or undefined - assertParamExists('boardControllerUpdateVisibility', 'boardId', boardId) - // verify required parameter 'visibilityBodyParams' is not null or undefined - assertParamExists('boardControllerUpdateVisibility', 'visibilityBodyParams', visibilityBodyParams) - const localVarPath = `/boards/{boardId}/visibility` - .replace(`{${"boardId"}}`, encodeURIComponent(String(boardId))); - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - - const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any; - - // authentication bearer required - // http bearer authentication required - await setBearerAuthToObject(localVarHeaderParameter, configuration) - - - - localVarHeaderParameter['Content-Type'] = 'application/json'; - - setSearchParams(localVarUrlObj, localVarQueryParameter); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - localVarRequestOptions.data = serializeDataIfNeeded(visibilityBodyParams, localVarRequestOptions, configuration) - - return { - url: toPathString(localVarUrlObj), - options: localVarRequestOptions, - }; - }, - } -}; - -/** - * BoardApi - functional programming interface - * @export - */ -export const BoardApiFp = function(configuration?: Configuration) { - const localVarAxiosParamCreator = BoardApiAxiosParamCreator(configuration) - return { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerCopyBoard(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerCopyBoard(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerCopyBoard']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerCreateBoard(createBoardBodyParams, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerCreateBoard']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerCreateColumn(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerCreateColumn(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerCreateColumn']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerDeleteBoard(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerDeleteBoard(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerDeleteBoard']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerGetBoardContext(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerGetBoardContext(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerGetBoardContext']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerGetBoardSkeleton(boardId, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerGetBoardSkeleton']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerUpdateBoardTitle(boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerUpdateBoardTitle(boardId, updateBoardTitleParams, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerUpdateBoardTitle']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async boardControllerUpdateVisibility(boardId: string, visibilityBodyParams: VisibilityBodyParams, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.boardControllerUpdateVisibility(boardId, visibilityBodyParams, options); - const localVarOperationServerIndex = configuration?.serverIndex ?? 0; - const localVarOperationServerBasePath = operationServerMap['BoardApi.boardControllerUpdateVisibility']?.[localVarOperationServerIndex]?.url; - return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); - }, - } -}; - -/** - * BoardApi - factory interface - * @export - */ -export const BoardApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { - const localVarFp = BoardApiFp(configuration) - return { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCopyBoard(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerCopyBoard(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: any): AxiosPromise { - return localVarFp.boardControllerCreateBoard(createBoardBodyParams, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerCreateColumn(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerCreateColumn(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerDeleteBoard(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerDeleteBoard(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerGetBoardContext(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerGetBoardContext(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerGetBoardSkeleton(boardId: string, options?: any): AxiosPromise { - return localVarFp.boardControllerGetBoardSkeleton(boardId, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerUpdateBoardTitle(boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options?: any): AxiosPromise { - return localVarFp.boardControllerUpdateBoardTitle(boardId, updateBoardTitleParams, options).then((request) => request(axios, basePath)); - }, - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - boardControllerUpdateVisibility(boardId: string, visibilityBodyParams: VisibilityBodyParams, options?: any): AxiosPromise { - return localVarFp.boardControllerUpdateVisibility(boardId, visibilityBodyParams, options).then((request) => request(axios, basePath)); - }, - }; -}; - -/** - * BoardApi - interface - * @export - * @interface BoardApi - */ -export interface BoardApiInterface { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerCopyBoard(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerCreateColumn(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerDeleteBoard(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerGetBoardContext(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerUpdateBoardTitle(boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options?: RawAxiosRequestConfig): AxiosPromise; - - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApiInterface - */ - boardControllerUpdateVisibility(boardId: string, visibilityBodyParams: VisibilityBodyParams, options?: RawAxiosRequestConfig): AxiosPromise; - -} - -/** - * BoardApi - object-oriented interface - * @export - * @class BoardApi - * @extends {BaseAPI} - */ -export class BoardApi extends BaseAPI implements BoardApiInterface { - /** - * - * @summary Create a board copy. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerCopyBoard(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerCopyBoard(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Create a new board. - * @param {CreateBoardBodyParams} createBoardBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerCreateBoard(createBoardBodyParams: CreateBoardBodyParams, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerCreateBoard(createBoardBodyParams, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Create a new column on a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerCreateColumn(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerCreateColumn(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Delete a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerDeleteBoard(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerDeleteBoard(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Get the context of a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerGetBoardContext(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerGetBoardContext(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Get the skeleton of a a board. - * @param {string} boardId The id of the board. - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerGetBoardSkeleton(boardId: string, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerGetBoardSkeleton(boardId, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Update the title of a board. - * @param {string} boardId The id of the board. - * @param {UpdateBoardTitleParams} updateBoardTitleParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerUpdateBoardTitle(boardId: string, updateBoardTitleParams: UpdateBoardTitleParams, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerUpdateBoardTitle(boardId, updateBoardTitleParams, options).then((request) => request(this.axios, this.basePath)); - } - - /** - * - * @summary Update the visibility of a board. - * @param {string} boardId The id of the board. - * @param {VisibilityBodyParams} visibilityBodyParams - * @param {*} [options] Override http request option. - * @throws {RequiredError} - * @memberof BoardApi - */ - public boardControllerUpdateVisibility(boardId: string, visibilityBodyParams: VisibilityBodyParams, options?: RawAxiosRequestConfig) { - return BoardApiFp(this.configuration).boardControllerUpdateVisibility(boardId, visibilityBodyParams, options).then((request) => request(this.axios, this.basePath)); - } -} - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/api-validation-error.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/api-validation-error.ts deleted file mode 100644 index 3f49cf86f0..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/api-validation-error.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * - * @export - * @interface ApiValidationError - */ -export interface ApiValidationError { - /** - * The response status code. - * @type {number} - * @memberof ApiValidationError - */ - 'code': number; - /** - * The error type. - * @type {string} - * @memberof ApiValidationError - */ - 'type': string; - /** - * The error title. - * @type {string} - * @memberof ApiValidationError - */ - 'title': string; - /** - * The error message. - * @type {string} - * @memberof ApiValidationError - */ - 'message': string; - /** - * The error details. - * @type {object} - * @memberof ApiValidationError - */ - 'details'?: object; -} - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-context-response.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-context-response.ts deleted file mode 100644 index e2c9b1b0a1..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-context-response.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - -// May contain unused imports in some cases -// @ts-ignore -import type { BoardExternalReferenceType } from './board-external-reference-type'; - -/** - * - * @export - * @interface BoardContextResponse - */ -export interface BoardContextResponse { - /** - * - * @type {string} - * @memberof BoardContextResponse - */ - 'id': string; - /** - * - * @type {BoardExternalReferenceType} - * @memberof BoardContextResponse - */ - 'type': BoardExternalReferenceType; -} - - - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-external-reference-type.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-external-reference-type.ts deleted file mode 100644 index 5510db52c1..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/board-external-reference-type.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * - * @export - * @enum {string} - */ - -export const BoardExternalReferenceType = { - COURSE: 'course', - USER: 'user' -} as const; - -export type BoardExternalReferenceType = typeof BoardExternalReferenceType[keyof typeof BoardExternalReferenceType]; - - - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/copy-api-response.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/copy-api-response.ts deleted file mode 100644 index 3c78d846ed..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/copy-api-response.ts +++ /dev/null @@ -1,110 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - -/** - * - * @export - * @interface CopyApiResponse - */ -export interface CopyApiResponse { - /** - * Id of copied element - * @type {string} - * @memberof CopyApiResponse - */ - id?: string; - /** - * Title of copied element - * @type {string} - * @memberof CopyApiResponse - */ - title?: string; - /** - * Type of copied element - * @type {string} - * @memberof CopyApiResponse - */ - type: CopyApiResponseType; - /** - * Id of destination parent reference - * @type {string} - * @memberof CopyApiResponse - */ - destinationId?: string; - /** - * Copy progress status of copied element - * @type {string} - * @memberof CopyApiResponse - */ - status: CopyApiResponseStatus; - /** - * List of included sub elements with recursive type structure - * @type {Array} - * @memberof CopyApiResponse - */ - elements?: Array; -} - -export const CopyApiResponseType = { - BOARD: 'BOARD', - CARD: 'CARD', - COLLABORATIVE_TEXT_EDITOR_ELEMENT: 'COLLABORATIVE_TEXT_EDITOR_ELEMENT', - COLUMN: 'COLUMN', - COLUMNBOARD: 'COLUMNBOARD', - CONTENT: 'CONTENT', - COURSE: 'COURSE', - COURSEGROUP_GROUP: 'COURSEGROUP_GROUP', - EXTERNAL_TOOL: 'EXTERNAL_TOOL', - EXTERNAL_TOOL_ELEMENT: 'EXTERNAL_TOOL_ELEMENT', - FILE: 'FILE', - FILE_ELEMENT: 'FILE_ELEMENT', - DRAWING_ELEMENT: 'DRAWING_ELEMENT', - FILE_GROUP: 'FILE_GROUP', - LEAF: 'LEAF', - LESSON: 'LESSON', - LESSON_CONTENT_ETHERPAD: 'LESSON_CONTENT_ETHERPAD', - LESSON_CONTENT_GEOGEBRA: 'LESSON_CONTENT_GEOGEBRA', - LESSON_CONTENT_GROUP: 'LESSON_CONTENT_GROUP', - LESSON_CONTENT_LERNSTORE: 'LESSON_CONTENT_LERNSTORE', - LESSON_CONTENT_NEXBOARD: 'LESSON_CONTENT_NEXBOARD', - LESSON_CONTENT_TASK: 'LESSON_CONTENT_TASK', - LESSON_CONTENT_TEXT: 'LESSON_CONTENT_TEXT', - LERNSTORE_MATERIAL: 'LERNSTORE_MATERIAL', - LERNSTORE_MATERIAL_GROUP: 'LERNSTORE_MATERIAL_GROUP', - LINK_ELEMENT: 'LINK_ELEMENT', - LTITOOL_GROUP: 'LTITOOL_GROUP', - MEDIA_BOARD: 'MEDIA_BOARD', - MEDIA_LINE: 'MEDIA_LINE', - MEDIA_EXTERNAL_TOOL_ELEMENT: 'MEDIA_EXTERNAL_TOOL_ELEMENT', - METADATA: 'METADATA', - RICHTEXT_ELEMENT: 'RICHTEXT_ELEMENT', - SUBMISSION_CONTAINER_ELEMENT: 'SUBMISSION_CONTAINER_ELEMENT', - SUBMISSION_ITEM: 'SUBMISSION_ITEM', - SUBMISSION_GROUP: 'SUBMISSION_GROUP', - TASK: 'TASK', - TASK_GROUP: 'TASK_GROUP', - TIME_GROUP: 'TIME_GROUP', - USER_GROUP: 'USER_GROUP', -} as const; - -export type CopyApiResponseType = typeof CopyApiResponseType[keyof typeof CopyApiResponseType]; -export const CopyApiResponseStatus = { - SUCCESS: 'success', - FAILURE: 'failure', - NOT_DOING: 'not-doing', - NOT_IMPLEMENTED: 'not-implemented', - PARTIAL: 'partial', -} as const; - -export type CopyApiResponseStatus = typeof CopyApiResponseStatus[keyof typeof CopyApiResponseStatus]; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/visibility-body-params.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/visibility-body-params.ts deleted file mode 100644 index 46cf830623..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-api-client/models/visibility-body-params.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** - * Schulcloud-Verbund-Software Server API - * This is v3 of Schulcloud-Verbund-Software Server. Checkout /docs for v1. - * - * The version of the OpenAPI document: 3.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ - - - -/** - * - * @export - * @interface VisibilityBodyParams - */ -export interface VisibilityBodyParams { - /** - * - * @type {boolean} - * @memberof VisibilityBodyParams - */ - 'isVisible': boolean; -} - diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.spec.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.spec.ts deleted file mode 100644 index 8dacf504e4..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.spec.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { faker } from '@faker-js/faker'; -import { createMock, DeepMocked } from '@golevelup/ts-jest'; -import { UnauthorizedException } from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; -import { Test, TestingModule } from '@nestjs/testing'; -import { AxiosResponse } from 'axios'; -import { Request } from 'express'; -import { BoardApi, BoardResponse } from './board-api-client'; -import { BoardClientAdapter } from './board-client.adapter'; - -const jwtToken = 'someJwtToken'; - -describe(BoardClientAdapter.name, () => { - let module: TestingModule; - let sut: BoardClientAdapter; - let boardApiMock: DeepMocked; - - beforeAll(async () => { - module = await Test.createTestingModule({ - providers: [ - BoardClientAdapter, - { - provide: BoardApi, - useValue: createMock(), - }, - { - provide: REQUEST, - useValue: createMock({ - headers: { - authorization: `Bearer ${jwtToken}`, - }, - }), - }, - ], - }).compile(); - - sut = module.get(BoardClientAdapter); - boardApiMock = module.get(BoardApi); - }); - - afterAll(async () => { - await module.close(); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - it('should be defined', () => { - expect(sut).toBeDefined(); - }); - - describe('getBoardSkeletonById', () => { - describe('When getBoardSkeletonById is called', () => { - const setup = () => { - const response = createMock>({ - data: { - id: faker.string.uuid(), - title: faker.lorem.sentence(), - columns: [], - isVisible: true, - layout: 'layout', - timestamps: { - createdAt: faker.date.past().toString(), - lastUpdatedAt: faker.date.recent().toString(), - }, - }, - }); - - boardApiMock.boardControllerGetBoardSkeleton.mockResolvedValue(response); - - return { boardId: response.data.id }; - }; - - it('it should return a board skeleton dto', async () => { - const { boardId } = setup(); - - await sut.getBoardSkeletonById(boardId); - - expect(boardApiMock.boardControllerGetBoardSkeleton).toHaveBeenCalled(); - }); - }); - - describe('When no JWT token is found', () => { - const setup = () => { - const boardId = faker.string.uuid(); - const request = createMock({ - headers: {}, - }); - - const adapter: BoardClientAdapter = new BoardClientAdapter(boardApiMock, request); - - return { boardId, adapter }; - }; - - it('should throw an UnauthorizedError', async () => { - const { boardId, adapter } = setup(); - - await expect(adapter.getBoardSkeletonById(boardId)).rejects.toThrowError(UnauthorizedException); - }); - }); - }); -}); diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.ts deleted file mode 100644 index b2b48e2d33..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.adapter.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Inject, Injectable, UnauthorizedException } from '@nestjs/common'; -import { REQUEST } from '@nestjs/core'; -import { extractJwtFromHeader } from '@shared/common/utils'; -import { RawAxiosRequestConfig } from 'axios'; -import { Request } from 'express'; -import { BoardApi } from './board-api-client'; -import { BoardSkeletonDto } from './dto'; -import { BoardSkeletonDtoMapper } from './mapper'; - -@Injectable() -export class BoardClientAdapter { - constructor(private readonly boardApi: BoardApi, @Inject(REQUEST) private request: Request) {} - - public async getBoardSkeletonById(boardId: string): Promise { - const options = this.createOptionParams(); - const boardResponse = await this.boardApi - .boardControllerGetBoardSkeleton(boardId, options) - .then((response) => response.data); - - const boardSkeletonDto = BoardSkeletonDtoMapper.mapToBoardSkeletonDto(boardResponse); - - return boardSkeletonDto; - } - - private createOptionParams(): RawAxiosRequestConfig { - const jwt = this.getJwt(); - const options: RawAxiosRequestConfig = { headers: { authorization: `Bearer ${jwt}` } }; - - return options; - } - - private getJwt(): string { - const jwt = extractJwtFromHeader(this.request) ?? this.request.headers.authorization; - - if (!jwt) { - throw new UnauthorizedException('No JWT found in request'); - } - - return jwt; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.config.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.config.ts deleted file mode 100644 index ba6d1e4ad5..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ConfigurationParameters } from './board-api-client'; - -export interface BoardClientConfig extends ConfigurationParameters { - basePath: string; -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.spec.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.spec.ts deleted file mode 100644 index b46d574e0f..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { BoardClientModule } from './board-client.module'; -import { BoardClientAdapter } from './board-client.adapter'; - -describe('BoardClientModule', () => { - let module: TestingModule; - - beforeAll(async () => { - module = await Test.createTestingModule({ - imports: [ - BoardClientModule.register({ - basePath: 'http://localhost:3030/api/v3', - }), - ], - }).compile(); - }); - - afterAll(async () => { - await module.close(); - }); - - describe('when module is initialized', () => { - it('should have the BoardClientAdapter defined', () => { - const boardClientAdapter = module.get(BoardClientAdapter); - expect(boardClientAdapter).toBeDefined(); - }); - }); -}); diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.ts deleted file mode 100644 index 3ad0125843..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/board-client.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { DynamicModule, Module } from '@nestjs/common'; -import { BoardClientAdapter } from './board-client.adapter'; -import { BoardApi, Configuration } from './board-api-client'; -import { BoardClientConfig } from './board-client.config'; - -@Module({}) -export class BoardClientModule { - static register(config: BoardClientConfig): DynamicModule { - const providers = [ - BoardClientAdapter, - { - provide: BoardApi, - useFactory: () => { - const configuration = new Configuration(config); - return new BoardApi(configuration); - }, - }, - ]; - - return { - module: BoardClientModule, - providers, - exports: [BoardClientAdapter], - }; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/board-skeleton.dto.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/board-skeleton.dto.ts deleted file mode 100644 index 144ac8e478..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/board-skeleton.dto.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ColumnSkeletonDto } from './column-skeleton.dto'; - -export class BoardSkeletonDto { - boardId: string; - - title: string; - - columns: ColumnSkeletonDto[]; - - isVisible: boolean; - - layout: string; - - constructor(props: BoardSkeletonDto) { - this.boardId = props.boardId; - this.title = props.title; - this.columns = props.columns; - this.isVisible = props.isVisible; - this.layout = props.layout; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/card-skeleton.dto.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/card-skeleton.dto.ts deleted file mode 100644 index fe50f01386..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/card-skeleton.dto.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class CardSkeletonDto { - cardId: string; - - height: number; - - constructor(props: CardSkeletonDto) { - this.cardId = props.cardId; - this.height = props.height; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/column-skeleton.dto.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/column-skeleton.dto.ts deleted file mode 100644 index 01aeb8a9d2..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/column-skeleton.dto.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CardSkeletonDto } from './card-skeleton.dto'; - -export class ColumnSkeletonDto { - public columnId: string; - - public title: string; - - public cards: CardSkeletonDto[]; - - constructor(props: ColumnSkeletonDto) { - this.columnId = props.columnId; - this.title = props.title; - this.cards = props.cards; - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/index.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/index.ts deleted file mode 100644 index 58a91c50d6..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/dto/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { BoardSkeletonDto } from './board-skeleton.dto'; -export { ColumnSkeletonDto } from './column-skeleton.dto'; -export { CardSkeletonDto } from './card-skeleton.dto'; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/index.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/index.ts deleted file mode 100644 index 4347b12992..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { BoardClientModule } from './board-client.module'; -export { BoardClientConfig } from './board-client.config'; -export { BoardClientAdapter } from './board-client.adapter'; -export * from './dto'; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.spec.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.spec.ts deleted file mode 100644 index ee1d26fa58..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { faker } from '@faker-js/faker'; -import { BoardResponse, CardSkeletonResponse, ColumnResponse } from '../board-api-client'; -import { BoardSkeletonDtoMapper } from './board-skeleton-response.mapper'; - -describe('BoardSkeletonDtoMapper', () => { - describe('mapToBoardSkeletonDto', () => { - describe('when mapping to BoardResponse', () => { - const setup = () => { - const cardResponse: CardSkeletonResponse = { - cardId: faker.string.uuid(), - height: faker.number.int(), - }; - - const columnResponse: ColumnResponse = { - id: faker.string.uuid(), - title: faker.lorem.sentence(), - cards: [cardResponse], - timestamps: { - createdAt: faker.date.past().toString(), - lastUpdatedAt: faker.date.recent().toString(), - }, - }; - - const boardResponse: BoardResponse = { - id: faker.string.uuid(), - title: faker.lorem.sentence(), - columns: [columnResponse], - isVisible: true, - layout: 'layout', - timestamps: { - createdAt: faker.date.past().toString(), - lastUpdatedAt: faker.date.recent().toString(), - }, - }; - - return { boardResponse }; - }; - it('should return BoardSkeletonDto', () => { - const { boardResponse } = setup(); - - const result = BoardSkeletonDtoMapper.mapToBoardSkeletonDto(boardResponse); - - expect(result).toEqual({ - // AI next 16 lines - boardId: boardResponse.id, - title: boardResponse.title, - isVisible: boardResponse.isVisible, - layout: boardResponse.layout, - columns: [ - { - columnId: boardResponse.columns[0].id, - title: boardResponse.columns[0].title, - cards: [ - { - cardId: boardResponse.columns[0].cards[0].cardId, - height: boardResponse.columns[0].cards[0].height, - }, - ], - }, - ], - }); - }); - }); - }); -}); diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.ts deleted file mode 100644 index 15e12d3b2a..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/board-skeleton-response.mapper.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { BoardResponse, ColumnResponse, CardSkeletonResponse } from '../board-api-client'; -import { BoardSkeletonDto, ColumnSkeletonDto, CardSkeletonDto } from '../dto'; - -export class BoardSkeletonDtoMapper { - public static mapToBoardSkeletonDto(boardResponse: BoardResponse): BoardSkeletonDto { - return new BoardSkeletonDto({ - boardId: boardResponse.id, - title: boardResponse.title, - columns: boardResponse.columns.map((column) => this.mapToColumnSkeletonDto(column)), - isVisible: boardResponse.isVisible, - layout: boardResponse.layout, - }); - } - - private static mapToColumnSkeletonDto(columnResponse: ColumnResponse): ColumnSkeletonDto { - return new ColumnSkeletonDto({ - columnId: columnResponse.id, - title: columnResponse.title, - cards: columnResponse.cards.map((card) => this.mapToCardSkeletonDto(card)), - }); - } - - private static mapToCardSkeletonDto(cardResponse: CardSkeletonResponse): CardSkeletonDto { - return new CardSkeletonDto({ - cardId: cardResponse.cardId, - height: cardResponse.height, - }); - } -} diff --git a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/index.ts b/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/index.ts deleted file mode 100644 index 0213105c0d..0000000000 --- a/apps/server/src/modules/common-cartridge/common-cartridge-client/board-client/mapper/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BoardSkeletonDtoMapper } from './board-skeleton-response.mapper'; diff --git a/apps/server/src/modules/common-cartridge/common-cartridge.module.ts b/apps/server/src/modules/common-cartridge/common-cartridge.module.ts index 676972ac54..dab66351de 100644 --- a/apps/server/src/modules/common-cartridge/common-cartridge.module.ts +++ b/apps/server/src/modules/common-cartridge/common-cartridge.module.ts @@ -8,7 +8,7 @@ import { Module } from '@nestjs/common'; import { defaultMikroOrmOptions } from '@shared/common/defaultMikroOrmOptions'; import { ALL_ENTITIES } from '@shared/domain/entity'; import { LoggerModule } from '@core/logger'; -import { BoardClientModule } from './common-cartridge-client/board-client'; +import { BoardsClientModule } from '@infra/boards-client'; import { CardClientModule } from './common-cartridge-client/card-client/card-client.module'; import { LessonClientModule } from './common-cartridge-client/lesson-client/lesson-client.module'; import { CourseRoomsModule } from './common-cartridge-client/room-client'; @@ -24,6 +24,7 @@ import { CommonCartridgeUc } from './uc/common-cartridge.uc'; FilesStorageClientModule, LoggerModule, CoursesClientModule, + BoardsClientModule, MikroOrmModule.forRoot({ ...defaultMikroOrmOptions, type: 'mongo', @@ -32,9 +33,6 @@ import { CommonCartridgeUc } from './uc/common-cartridge.uc'; user: DB_USERNAME, entities: ALL_ENTITIES, }), - BoardClientModule.register({ - basePath: `${Configuration.get('API_HOST') as string}/v3/`, - }), CourseRoomsModule.register({ basePath: `${Configuration.get('API_HOST') as string}/v3/`, }), diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.spec.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.spec.ts index 1aca822b17..d185576c01 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.spec.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.spec.ts @@ -2,12 +2,13 @@ import { DeepMocked, createMock } from '@golevelup/ts-jest'; import { FileDto, FilesStorageClientAdapterService } from '@modules/files-storage-client'; import { Test, TestingModule } from '@nestjs/testing'; import AdmZip from 'adm-zip'; +import { BoardsClientAdapter, BoardResponse } from '@infra/boards-client'; import { CoursesClientAdapter } from '@infra/courses-client'; -import { CourseCommonCartridgeMetadataDto } from '@infra/courses-client/dto'; import { FilesStorageClientAdapter } from '@infra/files-storage-client'; import { faker } from '@faker-js/faker'; import { FileRecordParentType } from '@modules/files-storage/interface'; -import { BoardClientAdapter, BoardSkeletonDto } from '../common-cartridge-client/board-client'; +import { CourseRoomsClientAdapter } from '../common-cartridge-client/room-client'; +import { CommonCartridgeExportService } from './common-cartridge-export.service'; import { CardClientAdapter } from '../common-cartridge-client/card-client/card-client.adapter'; import { CardListResponseDto, @@ -15,7 +16,6 @@ import { RichTextElementContentDto, } from '../common-cartridge-client/card-client/dto'; import { LessonClientAdapter } from '../common-cartridge-client/lesson-client/lesson-client.adapter'; -import { CourseRoomsClientAdapter } from '../common-cartridge-client/room-client'; import { BoardColumnBoardDto, BoardLessonDto, @@ -33,7 +33,6 @@ import { listOfCardResponseFactory, roomFactory, } from '../testing/common-cartridge-dtos.factory'; -import { CommonCartridgeExportService } from './common-cartridge-export.service'; import { CommonCartridgeExportMapper } from './common-cartridge.mapper'; describe('CommonCartridgeExportService', () => { @@ -42,7 +41,7 @@ describe('CommonCartridgeExportService', () => { let coursesClientAdapterMock: DeepMocked; let courseRoomsClientAdapterMock: DeepMocked; let cardClientAdapterMock: DeepMocked; - let boardClientAdapterMock: DeepMocked; + let boardClientAdapterMock: DeepMocked; let lessonClientAdapterMock: DeepMocked; let filesMetadataClientAdapterMock: DeepMocked; let filesStorageClientAdapterMock: DeepMocked; @@ -57,12 +56,12 @@ describe('CommonCartridgeExportService', () => { exportTasks: boolean, exportColumnBoards: boolean ) => { - const courseMetadata: CourseCommonCartridgeMetadataDto = courseMetadataFactory.build(); + const courseMetadata = courseMetadataFactory.build(); const lessons = lessonFactory.buildList(2); const [lesson] = lessons; lesson.courseId = courseMetadata.id; - const boardSkeleton: BoardSkeletonDto = columnBoardFactory.build(); + const boardSkeleton: BoardResponse = columnBoardFactory.build(); const listOfCardsResponse: CardListResponseDto = listOfCardResponseFactory.build(); const boardTask: BoardTaskDto = boardTaskFactory.build(); boardTask.courseName = courseMetadata.title; @@ -133,8 +132,8 @@ describe('CommonCartridgeExportService', () => { useValue: createMock(), }, { - provide: BoardClientAdapter, - useValue: createMock(), + provide: BoardsClientAdapter, + useValue: createMock(), }, { provide: CoursesClientAdapter, @@ -167,7 +166,7 @@ describe('CommonCartridgeExportService', () => { coursesClientAdapterMock = module.get(CoursesClientAdapter); courseRoomsClientAdapterMock = module.get(CourseRoomsClientAdapter); cardClientAdapterMock = module.get(CardClientAdapter); - boardClientAdapterMock = module.get(BoardClientAdapter); + boardClientAdapterMock = module.get(BoardsClientAdapter); lessonClientAdapterMock = module.get(LessonClientAdapter); filesMetadataClientAdapterMock = module.get(FilesStorageClientAdapterService); filesStorageClientAdapterMock = module.get(FilesStorageClientAdapter); diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.ts index d87b0cda93..68e811fe68 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge-export.service.ts @@ -1,9 +1,8 @@ import { Injectable } from '@nestjs/common'; import { CoursesClientAdapter } from '@infra/courses-client'; -import { CourseCommonCartridgeMetadataDto } from '@infra/courses-client/dto'; import { FilesStorageClientAdapter } from '@infra/files-storage-client'; import { FilesStorageClientAdapterService } from '@modules/files-storage-client'; -import { BoardClientAdapter, BoardSkeletonDto, ColumnSkeletonDto } from '../common-cartridge-client/board-client'; +import { BoardResponse, BoardsClientAdapter, ColumnResponse } from '@infra/boards-client'; import { CardClientAdapter } from '../common-cartridge-client/card-client'; import { CourseRoomsClientAdapter } from '../common-cartridge-client/room-client'; import { LessonClientAdapter } from '../common-cartridge-client/lesson-client'; @@ -32,7 +31,7 @@ import { @Injectable() export class CommonCartridgeExportService { constructor( - private readonly boardClientAdapter: BoardClientAdapter, + private readonly boardClientAdapter: BoardsClientAdapter, private readonly cardClientAdapter: CardClientAdapter, private readonly coursesClientAdapter: CoursesClientAdapter, private readonly courseRoomsClientAdapter: CourseRoomsClientAdapter, @@ -51,8 +50,7 @@ export class CommonCartridgeExportService { ): Promise { const builder = new CommonCartridgeFileBuilder(this.mapper.mapCourseToManifest(version, courseId)); - const courseCommonCartridgeMetadata: CourseCommonCartridgeMetadataDto = - await this.coursesClientAdapter.getCourseCommonCartridgeMetadata(courseId); + const courseCommonCartridgeMetadata = await this.coursesClientAdapter.getCourseCommonCartridgeMetadata(courseId); builder.addMetadata(this.mapper.mapCourseToMetadata(courseCommonCartridgeMetadata)); @@ -160,7 +158,7 @@ export class CommonCartridgeExportService { const columnBoardsIds = columnBoards .filter((columnBoard) => exportedColumnBoards.includes(columnBoard.id)) .map((columBoard) => columBoard.columnBoardId); - const boardSkeletons: BoardSkeletonDto[] = await Promise.all( + const boardSkeletons: BoardResponse[] = await Promise.all( columnBoardsIds.map((columnBoardId) => this.boardClientAdapter.getBoardSkeletonById(columnBoardId)) ); @@ -168,7 +166,7 @@ export class CommonCartridgeExportService { boardSkeletons.map(async (boardSkeleton) => { const columnBoardOrganization = builder.createOrganization({ title: boardSkeleton.title, - identifier: createIdentifier(boardSkeleton.boardId), + identifier: createIdentifier(boardSkeleton.id), }); await Promise.all( @@ -179,13 +177,12 @@ export class CommonCartridgeExportService { } private async addColumnToOrganization( - column: ColumnSkeletonDto, + column: ColumnResponse, columnBoardOrganization: CommonCartridgeOrganizationNode ): Promise { - const { columnId } = column; const columnOrganization = columnBoardOrganization.createChild({ title: column.title ?? '', - identifier: createIdentifier(columnId), + identifier: createIdentifier(column.id), }); if (column.cards.length) { diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.spec.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.spec.ts index fb771065cc..144199a70c 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.spec.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.spec.ts @@ -2,6 +2,7 @@ import { faker } from '@faker-js/faker'; import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { CoursesClientAdapter } from '@infra/courses-client'; import { Test, TestingModule } from '@nestjs/testing'; +import { BoardsClientAdapter } from '@infra/boards-client'; import type { CommonCartridgeFileParser } from '../import/common-cartridge-file-parser'; import { CommonCartridgeImportService } from './common-cartridge-import.service'; @@ -9,6 +10,18 @@ jest.mock('../import/common-cartridge-file-parser', () => { const fileParserMock = createMock(); fileParserMock.getTitle.mockReturnValue(faker.lorem.words()); + fileParserMock.getOrganizations.mockReturnValue([ + { + pathDepth: 0, + title: faker.lorem.words(), + path: faker.system.filePath(), + identifier: faker.string.uuid(), + isInlined: true, + isResource: false, + resourcePath: faker.system.filePath(), + resourceType: faker.lorem.word(), + }, + ]); return { CommonCartridgeFileParser: jest.fn(() => fileParserMock), @@ -19,6 +32,7 @@ describe(CommonCartridgeImportService.name, () => { let module: TestingModule; let sut: CommonCartridgeImportService; let coursesClientAdapterMock: DeepMocked; + let boardsClientAdapterMock: DeepMocked; beforeEach(async () => { module = await Test.createTestingModule({ @@ -28,11 +42,16 @@ describe(CommonCartridgeImportService.name, () => { provide: CoursesClientAdapter, useValue: createMock(), }, + { + provide: BoardsClientAdapter, + useValue: createMock(), + }, ], }).compile(); sut = module.get(CommonCartridgeImportService); coursesClientAdapterMock = module.get(CoursesClientAdapter); + boardsClientAdapterMock = module.get(BoardsClientAdapter); }); afterEach(async () => { @@ -49,11 +68,27 @@ describe(CommonCartridgeImportService.name, () => { describe('importFile', () => { describe('when importing a file', () => { + const setup = () => { + const file = Buffer.from(''); + + return { file }; + }; + it('should create a course', async () => { - await sut.importFile(Buffer.from('')); + const { file } = setup(); + + await sut.importFile(file); expect(coursesClientAdapterMock.createCourse).toHaveBeenCalledWith({ title: expect.any(String) }); }); + + it('should create boards', async () => { + const { file } = setup(); + + await sut.importFile(file); + + expect(boardsClientAdapterMock.createBoard).toHaveBeenCalledTimes(1); + }); }); }); }); diff --git a/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.ts b/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.ts index 0580f260cb..6d51255348 100644 --- a/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.ts +++ b/apps/server/src/modules/common-cartridge/service/common-cartridge-import.service.ts @@ -1,11 +1,12 @@ import { CoursesClientAdapter } from '@infra/courses-client'; import { Injectable } from '@nestjs/common'; +import { BoardsClientAdapter } from '@infra/boards-client'; import { CommonCartridgeFileParser } from '../import/common-cartridge-file-parser'; import { DEFAULT_FILE_PARSER_OPTIONS } from '../import/common-cartridge-import.types'; @Injectable() export class CommonCartridgeImportService { - constructor(private readonly coursesClient: CoursesClientAdapter) {} + constructor(private readonly coursesClient: CoursesClientAdapter, private boardsClient: BoardsClientAdapter) {} public async importFile(file: Buffer): Promise { const parser = new CommonCartridgeFileParser(file, DEFAULT_FILE_PARSER_OPTIONS); @@ -16,6 +17,29 @@ export class CommonCartridgeImportService { private async createCourse(parser: CommonCartridgeFileParser): Promise { const courseName = parser.getTitle() ?? 'Untitled Course'; - await this.coursesClient.createCourse({ title: courseName }); + const course = await this.coursesClient.createCourse({ title: courseName }); + + await this.createBoards(course.courseId, parser); + } + + private async createBoards(parentId: string, parser: CommonCartridgeFileParser): Promise { + const titles = parser + .getOrganizations() + .filter((organization) => organization.pathDepth === 0) + .map((organization) => organization.title); + const ids = new Array(); + + for await (const title of titles) { + const response = await this.boardsClient.createBoard({ + title, + layout: 'columns', + parentId, + parentType: 'course', + }); + + ids.push(response.id); + } + + return ids; } } diff --git a/apps/server/src/modules/common-cartridge/testing/common-cartridge-dtos.factory.ts b/apps/server/src/modules/common-cartridge/testing/common-cartridge-dtos.factory.ts index c08ee658be..2f16371a96 100644 --- a/apps/server/src/modules/common-cartridge/testing/common-cartridge-dtos.factory.ts +++ b/apps/server/src/modules/common-cartridge/testing/common-cartridge-dtos.factory.ts @@ -1,8 +1,8 @@ import { faker } from '@faker-js/faker'; import { Factory } from 'fishery'; import { CourseCommonCartridgeMetadataDto } from '@infra/courses-client/dto'; +import { BoardResponse, ColumnResponse, CardSkeletonResponse } from '@infra/boards-client'; import { LessonContentDto, LessonDto, LessonLinkedTaskDto } from '../common-cartridge-client/lesson-client/dto'; -import { BoardSkeletonDto, CardSkeletonDto, ColumnSkeletonDto } from '../common-cartridge-client/board-client'; import { CardListResponseDto } from '../common-cartridge-client/card-client/dto/card-list-response.dto'; import { CardResponseDto } from '../common-cartridge-client/card-client/dto/card-response.dto'; import { @@ -27,28 +27,36 @@ export const courseMetadataFactory = Factory.define(({ sequence }) => { +export const cardFactory = Factory.define(({ sequence }) => { return { cardId: sequence.toString(), height: faker.number.int(), }; }); -export const columnFactory = Factory.define(({ sequence }) => { +export const columnFactory = Factory.define(({ sequence }) => { return { - columnId: sequence.toString(), + id: sequence.toString(), title: faker.lorem.sentence(), cards: [cardFactory.build(), cardFactory.build()], + timestamps: { + createdAt: faker.date.recent().toISOString(), + lastUpdatedAt: faker.date.recent().toISOString(), + }, }; }); -export const columnBoardFactory = Factory.define(({ sequence }) => { +export const columnBoardFactory = Factory.define(({ sequence }) => { return { - boardId: sequence.toString(), + id: sequence.toString(), title: faker.lorem.sentence(), columns: [columnFactory.build(), columnFactory.build()], isVisible: faker.datatype.boolean(), layout: faker.lorem.word(), + timestamps: { + createdAt: faker.date.recent().toISOString(), + lastUpdatedAt: faker.date.recent().toISOString(), + }, }; }); diff --git a/apps/server/src/modules/learnroom/controller/course.controller.ts b/apps/server/src/modules/learnroom/controller/course.controller.ts index 488cc69108..ddd49dd315 100644 --- a/apps/server/src/modules/learnroom/controller/course.controller.ts +++ b/apps/server/src/modules/learnroom/controller/course.controller.ts @@ -34,6 +34,7 @@ import { CourseSyncBodyParams, CourseUrlParams, CreateCourseBodyParams, + CreateCourseResponse, } from './dto'; import { CourseCommonCartridgeMetadataResponse } from './dto/course-cc-metadata.response'; @@ -64,11 +65,17 @@ export class CourseController { @ApiOperation({ summary: 'Create a new course.' }) @ApiConsumes('application/json') @ApiProduces('application/json') - @ApiCreatedResponse({ description: 'Course was successfully created.' }) + @ApiCreatedResponse({ description: 'Course was successfully created.', type: CreateCourseResponse }) @ApiBadRequestResponse({ description: 'Request data has invalid format.' }) @ApiInternalServerErrorResponse({ description: 'Internal server error.' }) - public async createCourse(@CurrentUser() user: ICurrentUser, @Body() body: CreateCourseBodyParams): Promise { - await this.courseUc.createCourse(user, body.title); + public async createCourse( + @CurrentUser() user: ICurrentUser, + @Body() body: CreateCourseBodyParams + ): Promise { + const course = await this.courseUc.createCourse(user, body.title); + const response = CourseMapper.mapToCreateCourseResponse(course); + + return response; } @Post('import') diff --git a/apps/server/src/modules/learnroom/controller/dto/create-course.response.ts b/apps/server/src/modules/learnroom/controller/dto/create-course.response.ts new file mode 100644 index 0000000000..97a04d3902 --- /dev/null +++ b/apps/server/src/modules/learnroom/controller/dto/create-course.response.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class CreateCourseResponse { + @ApiProperty({ + description: 'The id of the created course', + type: () => String, + readOnly: true, + }) + public courseId: string; + + constructor(props: Readonly) { + this.courseId = props.courseId; + } +} diff --git a/apps/server/src/modules/learnroom/controller/dto/index.ts b/apps/server/src/modules/learnroom/controller/dto/index.ts index 79a0302dde..da750e75e4 100644 --- a/apps/server/src/modules/learnroom/controller/dto/index.ts +++ b/apps/server/src/modules/learnroom/controller/dto/index.ts @@ -21,3 +21,4 @@ export { BoardTaskStatusResponse, SingleColumnBoardResponse, } from './single-column-board'; +export { CreateCourseResponse } from './create-course.response'; diff --git a/apps/server/src/modules/learnroom/mapper/course.mapper.spec.ts b/apps/server/src/modules/learnroom/mapper/course.mapper.spec.ts new file mode 100644 index 0000000000..b6b7a7354f --- /dev/null +++ b/apps/server/src/modules/learnroom/mapper/course.mapper.spec.ts @@ -0,0 +1,26 @@ +import { courseFactory } from '@testing/factory/course.factory'; +import { setupEntities } from '@testing/setup-entities'; +import { CourseMapper } from './course.mapper'; +import { CreateCourseResponse } from '../controller/dto'; + +describe(CourseMapper.name, () => { + beforeAll(async () => { + await setupEntities(); + }); + + describe('mapToCreateCourseResponse', () => { + const setup = () => { + const course = courseFactory.build(); + + return { course }; + }; + + it('should return CreateCourseResponse', () => { + const { course } = setup(); + + const result = CourseMapper.mapToCreateCourseResponse(course); + + expect(result).toEqual(new CreateCourseResponse({ courseId: course.id })); + }); + }); +}); diff --git a/apps/server/src/modules/learnroom/mapper/course.mapper.ts b/apps/server/src/modules/learnroom/mapper/course.mapper.ts index b87bcbff71..4f9992e998 100644 --- a/apps/server/src/modules/learnroom/mapper/course.mapper.ts +++ b/apps/server/src/modules/learnroom/mapper/course.mapper.ts @@ -1,9 +1,9 @@ import { Course } from '@shared/domain/entity'; -import { CourseMetadataResponse } from '../controller/dto'; +import { CourseMetadataResponse, CreateCourseResponse } from '../controller/dto'; import { CourseCommonCartridgeMetadataResponse } from '../controller/dto/course-cc-metadata.response'; export class CourseMapper { - static mapToMetadataResponse(course: Course): CourseMetadataResponse { + public static mapToMetadataResponse(course: Course): CourseMetadataResponse { const courseMetadata = course.getMetadata(); const dto = new CourseMetadataResponse( courseMetadata.id, @@ -17,7 +17,7 @@ export class CourseMapper { return dto; } - static mapToCommonCartridgeMetadataResponse(course: Course): CourseCommonCartridgeMetadataResponse { + public static mapToCommonCartridgeMetadataResponse(course: Course): CourseCommonCartridgeMetadataResponse { const courseMetadata = course.getMetadata(); const teachers = course.teachers.toArray().map((teacher) => `${teacher.firstName} ${teacher.lastName}`); const courseCCMetadataResopne: CourseCommonCartridgeMetadataResponse = new CourseCommonCartridgeMetadataResponse( @@ -29,4 +29,10 @@ export class CourseMapper { return courseCCMetadataResopne; } + + public static mapToCreateCourseResponse(course: Course): CreateCourseResponse { + const response = new CreateCourseResponse({ courseId: course.id }); + + return response; + } } diff --git a/apps/server/src/modules/learnroom/service/course.service.spec.ts b/apps/server/src/modules/learnroom/service/course.service.spec.ts index e7d71d0d95..8962d78131 100644 --- a/apps/server/src/modules/learnroom/service/course.service.spec.ts +++ b/apps/server/src/modules/learnroom/service/course.service.spec.ts @@ -177,19 +177,22 @@ describe('CourseService', () => { }); describe('create', () => { - const setup = () => { - const course = courseFactory.buildWithId(); - legacyCourseRepo.createCourse.mockResolvedValueOnce(); + describe('when creating new Course', () => { + const setup = () => { + const course = courseFactory.buildWithId(); - return { course }; - }; + legacyCourseRepo.createCourse.mockResolvedValueOnce(course); - it('should call createCourse from course repository', async () => { - const { course } = setup(); + return { course }; + }; + + it('should call createCourse from course repository', async () => { + const { course } = setup(); - await expect(courseService.create(course)).resolves.not.toThrow(); + await expect(courseService.create(course)).resolves.not.toThrow(); - expect(legacyCourseRepo.createCourse).toBeCalledWith(course); + expect(legacyCourseRepo.createCourse).toBeCalledWith(course); + }); }); }); diff --git a/apps/server/src/modules/learnroom/service/course.service.ts b/apps/server/src/modules/learnroom/service/course.service.ts index b298849131..550b04b136 100644 --- a/apps/server/src/modules/learnroom/service/course.service.ts +++ b/apps/server/src/modules/learnroom/service/course.service.ts @@ -36,8 +36,10 @@ export class CourseService implements DeletionService, IEventHandler { - return this.repo.findById(courseId); + public findById(courseId: EntityId): Promise { + const course = this.repo.findById(courseId); + + return course; } public async findAllCoursesByUserId(userId: EntityId): Promise> { @@ -79,22 +81,25 @@ export class CourseService implements DeletionService, IEventHandler { + public async findAllByUserId(userId: EntityId): Promise { const [courses] = await this.repo.findAllByUserId(userId); return courses; } - async create(course: CourseEntity): Promise { - await this.repo.createCourse(course); + public async create(course: CourseEntity): Promise { + const result = await this.repo.createCourse(course); + + return result; } private getCoursesId(courses: CourseEntity[]): EntityId[] { return courses.map((course) => course.id); } - async findOneForUser(courseId: EntityId, userId: EntityId): Promise { + public async findOneForUser(courseId: EntityId, userId: EntityId): Promise { const course = await this.repo.findOne(courseId, userId); + return course; } } diff --git a/apps/server/src/modules/learnroom/uc/course.uc.ts b/apps/server/src/modules/learnroom/uc/course.uc.ts index 8547261576..71df5cfd8e 100644 --- a/apps/server/src/modules/learnroom/uc/course.uc.ts +++ b/apps/server/src/modules/learnroom/uc/course.uc.ts @@ -38,13 +38,14 @@ export class CourseUc { return course; } - public async createCourse(currentUser: ICurrentUser, name: string): Promise { + public async createCourse(currentUser: ICurrentUser, name: string): Promise { const user = await this.authService.getUserWithPermissions(currentUser.userId); this.authService.checkAllPermissions(user, [Permission.COURSE_CREATE]); const course = new Course({ teachers: [user], school: user.school, name }); + const savedCourse = await this.courseService.create(course); - await this.courseService.create(course); + return savedCourse; } } diff --git a/apps/server/src/shared/repo/course/course.repo.ts b/apps/server/src/shared/repo/course/course.repo.ts index ebe1074db0..a62a2c4411 100644 --- a/apps/server/src/shared/repo/course/course.repo.ts +++ b/apps/server/src/shared/repo/course/course.repo.ts @@ -1,6 +1,5 @@ import { QueryOrderMap } from '@mikro-orm/core'; import { Injectable } from '@nestjs/common'; - import { Course } from '@shared/domain/entity'; import { IFindOptions } from '@shared/domain/interface'; import { Counted, EntityId } from '@shared/domain/types'; @@ -9,15 +8,17 @@ import { CourseScope } from './course.scope'; @Injectable() export class CourseRepo extends BaseRepo { - get entityName() { + get entityName(): typeof Course { return Course; } - async createCourse(course: Course): Promise { - return this.save(this.create(course)); + public async createCourse(course: Course): Promise { + await this.save(this.create(course)); + + return course; } - async findById(id: EntityId, populate = true): Promise { + public async findById(id: EntityId, populate = true): Promise { const course = await super.findById(id); if (populate) { await this._em.populate(course, ['courseGroups', 'teachers', 'substitutionTeachers', 'students']); @@ -25,7 +26,7 @@ export class CourseRepo extends BaseRepo { return course; } - async findAllByUserId( + public async findAllByUserId( userId: EntityId, filters?: { onlyActiveCourses?: boolean }, options?: IFindOptions @@ -49,7 +50,7 @@ export class CourseRepo extends BaseRepo { return [courses, count]; } - async findAllForTeacher( + public async findAllForTeacher( userId: EntityId, filters?: { onlyActiveCourses?: boolean }, options?: IFindOptions @@ -74,7 +75,7 @@ export class CourseRepo extends BaseRepo { } // not tested in repo.integration.spec - async findAllForTeacherOrSubstituteTeacher(userId: EntityId): Promise> { + public async findAllForTeacherOrSubstituteTeacher(userId: EntityId): Promise> { const scope = new CourseScope(); scope.forTeacherOrSubstituteTeacher(userId); @@ -83,7 +84,7 @@ export class CourseRepo extends BaseRepo { return [courses, count]; } - async findOne(courseId: EntityId, userId?: EntityId): Promise { + public async findOne(courseId: EntityId, userId?: EntityId): Promise { const scope = new CourseScope(); scope.forCourseId(courseId); if (userId) scope.forAllGroupTypes(userId); diff --git a/openapitools.json b/openapitools.json index 194e1096fa..d55223b9aa 100644 --- a/openapitools.json +++ b/openapitools.json @@ -28,6 +28,31 @@ "withSeparateModelsAndApi": true } }, + "boards-api": { + "generatorName": "typescript-axios", + "inputSpec": "http://localhost:3030/api/v3/docs-json", + "output": "./apps/server/src/infra/boards-client/generated", + "skipValidateSpec": true, + "enablePostProcessFile": true, + "openapiNormalizer": { + "FILTER": "operationId:BoardController_createBoard|BoardController_getBoardSkeleton" + }, + "globalProperty": { + "models": "CreateBoardBodyParams:CreateBoardResponse:BoardParentType:BoardLayout:BoardResponse:ColumnResponse:CardSkeletonResponse:TimestampsResponse", + + "apis": "", + "supportingFiles": "" + }, + "additionalProperties": { + "apiPackage": "api", + "enumNameSuffix": "", + "enumPropertyNaming": "UPPERCASE", + "modelPackage": "models", + "supportsES6": true, + "withInterfaces": true, + "withSeparateModelsAndApi": true + } + }, "files-storage-api": { "generatorName": "typescript-axios", "inputSpec": "http://localhost:4444/api/v3/docs-json", @@ -62,9 +87,18 @@ "FILTER": "operationId:CourseController_getCourseCcMetadataById|CourseController_createCourse" }, "globalProperty": { - "models": "CourseCommonCartridgeMetadataResponse:CreateCourseBodyParams", + "models": "CourseCommonCartridgeMetadataResponse:CreateCourseBodyParams:CreateCourseResponse", "apis": "", "supportingFiles": "" + }, + "additionalProperties": { + "apiPackage": "api", + "enumNameSuffix": "", + "enumPropertyNaming": "UPPERCASE", + "modelPackage": "models", + "supportsES6": true, + "withInterfaces": true, + "withSeparateModelsAndApi": true } }, "svs-lesson-api": { diff --git a/package.json b/package.json index 9acdf38385..fadfb01bef 100644 --- a/package.json +++ b/package.json @@ -136,6 +136,8 @@ "generate-client:courses-api": "openapi-generator-cli generate -c ./openapitools.json --generator-key courses-api", "pregenerate-client:tldraw-api": "rimraf ./apps/server/src/infra/tldraw-client/generated", "generate-client:tldraw-api": "openapi-generator-cli generate -c ./openapitools.json --generator-key tldraw-api", + "pregenerate-client:boards-api": "rimraf ./apps/server/src/infra/boards-client/generated", + "generate-client:boards-api": "openapi-generator-cli generate -c ./openapitools.json --generator-key boards-api", "generate-client:vidis-api": "openapi-generator-cli generate -c ./openapitools.json --generator-key vidis-api" }, "overrides": { From f8f3e1ea42dfa599a482973c4e2e709d23596388 Mon Sep 17 00:00:00 2001 From: mrikallab <93978883+mrikallab@users.noreply.github.com> Date: Fri, 31 Jan 2025 13:32:48 +0100 Subject: [PATCH 6/6] N21-2058 Admin updates school licenses from VIDIS (#5451) --- .../generated/.openapi-generator/FILES | 2 + .../src/infra/vidis-client/generated/api.ts | 2 + .../vidis-client/generated/api/default-api.ts | 142 ++++ .../generated/api/education-provider-api.ts | 676 ++++++++++++++++++ .../generated/api/idmbetreiber-api.ts | 176 +++++ .../mikro-orm/Migration20250121203707.ts | 37 + .../api/api-test/school-license.api.spec.ts | 182 +++++ .../api/school-license.controller.ts | 19 + ...dia-school-license-failed.loggable.spec.ts | 23 + ...ld-media-school-license-failed.loggable.ts | 9 + ...chool-not-found.loggable-exception.spec.ts | 27 + ...-of-school-not-found.loggable-exception.ts | 18 + .../modules/school-license/loggable/index.ts | 4 + ...ource-not-found.loggable-exception.spec.ts | 26 + ...dia-source-not-found.loggable-exception.ts | 17 + ...umber-not-found.loggable-exception.spec.ts | 26 + ...ool-number-not-found.loggable-exception.ts | 17 + .../media-school-license-repo.interface.ts | 2 + ...ia-school-license.repo.integration.spec.ts | 34 + .../mikro-orm/media-school-license.repo.ts | 9 + .../school-license-api.module.ts | 12 + .../school-license/school-license.module.ts | 14 +- .../modules/school-license/service/index.ts | 2 + ...media-school-license-fetch.service.spec.ts | 243 +++++++ .../media-school-license-fetch.service.ts | 48 ++ .../media-school-license.service.spec.ts | 314 +++++++- .../service/media-school-license.service.ts | 99 ++- .../modules/school-license/testing/index.ts | 1 + .../testing/vidis-offer.factory.ts | 12 + .../src/modules/school-license/uc/index.ts | 1 + .../uc/media-school-license.uc.spec.ts | 98 +++ .../uc/media-school-license.uc.ts | 22 + .../modules/school/domain/do/federal-state.ts | 6 +- .../src/modules/school/domain/do/school.ts | 4 + .../src/modules/server/server.app.module.ts | 4 +- .../domain/interface/permission.enum.ts | 1 + backup/setup/migrations.json | 9 + backup/setup/roles.json | 3 +- openapitools.json | 2 +- 39 files changed, 2330 insertions(+), 13 deletions(-) create mode 100644 apps/server/src/infra/vidis-client/generated/api/default-api.ts create mode 100644 apps/server/src/infra/vidis-client/generated/api/education-provider-api.ts create mode 100644 apps/server/src/migrations/mikro-orm/Migration20250121203707.ts create mode 100644 apps/server/src/modules/school-license/api/api-test/school-license.api.spec.ts create mode 100644 apps/server/src/modules/school-license/api/school-license.controller.ts create mode 100644 apps/server/src/modules/school-license/loggable/build-media-school-license-failed.loggable.spec.ts create mode 100644 apps/server/src/modules/school-license/loggable/build-media-school-license-failed.loggable.ts create mode 100644 apps/server/src/modules/school-license/loggable/federal-state-abbreviation-of-school-not-found.loggable-exception.spec.ts create mode 100644 apps/server/src/modules/school-license/loggable/federal-state-abbreviation-of-school-not-found.loggable-exception.ts create mode 100644 apps/server/src/modules/school-license/loggable/index.ts create mode 100644 apps/server/src/modules/school-license/loggable/media-source-not-found.loggable-exception.spec.ts create mode 100644 apps/server/src/modules/school-license/loggable/media-source-not-found.loggable-exception.ts create mode 100644 apps/server/src/modules/school-license/loggable/school-number-not-found.loggable-exception.spec.ts create mode 100644 apps/server/src/modules/school-license/loggable/school-number-not-found.loggable-exception.ts create mode 100644 apps/server/src/modules/school-license/school-license-api.module.ts create mode 100644 apps/server/src/modules/school-license/service/index.ts create mode 100644 apps/server/src/modules/school-license/service/media-school-license-fetch.service.spec.ts create mode 100644 apps/server/src/modules/school-license/service/media-school-license-fetch.service.ts create mode 100644 apps/server/src/modules/school-license/testing/vidis-offer.factory.ts create mode 100644 apps/server/src/modules/school-license/uc/index.ts create mode 100644 apps/server/src/modules/school-license/uc/media-school-license.uc.spec.ts create mode 100644 apps/server/src/modules/school-license/uc/media-school-license.uc.ts diff --git a/apps/server/src/infra/vidis-client/generated/.openapi-generator/FILES b/apps/server/src/infra/vidis-client/generated/.openapi-generator/FILES index d1183e6e2b..3d1040f30c 100644 --- a/apps/server/src/infra/vidis-client/generated/.openapi-generator/FILES +++ b/apps/server/src/infra/vidis-client/generated/.openapi-generator/FILES @@ -1,6 +1,8 @@ .gitignore .npmignore api.ts +api/default-api.ts +api/education-provider-api.ts api/idmbetreiber-api.ts base.ts common.ts diff --git a/apps/server/src/infra/vidis-client/generated/api.ts b/apps/server/src/infra/vidis-client/generated/api.ts index 72a37fe6fe..cb84e88496 100644 --- a/apps/server/src/infra/vidis-client/generated/api.ts +++ b/apps/server/src/infra/vidis-client/generated/api.ts @@ -14,5 +14,7 @@ +export * from './api/default-api'; +export * from './api/education-provider-api'; export * from './api/idmbetreiber-api'; diff --git a/apps/server/src/infra/vidis-client/generated/api/default-api.ts b/apps/server/src/infra/vidis-client/generated/api/default-api.ts new file mode 100644 index 0000000000..ad8d41cb9b --- /dev/null +++ b/apps/server/src/infra/vidis-client/generated/api/default-api.ts @@ -0,0 +1,142 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Vidis REST + * Vidis REST API + * + * The version of the OpenAPI document: v1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import type { Configuration } from '../configuration'; +import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; +import globalAxios from 'axios'; +// Some imports not used depending on template conditions +// @ts-ignore +import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base'; +/** + * DefaultApi - axios parameter creator + * @export + */ +export const DefaultApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * + * @param {string} type + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getOpenAPI: async (type: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'type' is not null or undefined + assertParamExists('getOpenAPI', 'type', type) + const localVarPath = `/v1.0/openapi.{type}` + .replace(`{${"type"}}`, encodeURIComponent(String(type))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * DefaultApi - functional programming interface + * @export + */ +export const DefaultApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = DefaultApiAxiosParamCreator(configuration) + return { + /** + * + * @param {string} type + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getOpenAPI(type: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getOpenAPI(type, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['DefaultApi.getOpenAPI']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + } +}; + +/** + * DefaultApi - factory interface + * @export + */ +export const DefaultApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = DefaultApiFp(configuration) + return { + /** + * + * @param {string} type + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getOpenAPI(type: string, options?: any): AxiosPromise { + return localVarFp.getOpenAPI(type, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * DefaultApi - interface + * @export + * @interface DefaultApi + */ +export interface DefaultApiInterface { + /** + * + * @param {string} type + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof DefaultApiInterface + */ + getOpenAPI(type: string, options?: RawAxiosRequestConfig): AxiosPromise; + +} + +/** + * DefaultApi - object-oriented interface + * @export + * @class DefaultApi + * @extends {BaseAPI} + */ +export class DefaultApi extends BaseAPI implements DefaultApiInterface { + /** + * + * @param {string} type + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof DefaultApi + */ + public getOpenAPI(type: string, options?: RawAxiosRequestConfig) { + return DefaultApiFp(this.configuration).getOpenAPI(type, options).then((request) => request(this.axios, this.basePath)); + } +} + diff --git a/apps/server/src/infra/vidis-client/generated/api/education-provider-api.ts b/apps/server/src/infra/vidis-client/generated/api/education-provider-api.ts new file mode 100644 index 0000000000..e1d5c94cd4 --- /dev/null +++ b/apps/server/src/infra/vidis-client/generated/api/education-provider-api.ts @@ -0,0 +1,676 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * Vidis REST + * Vidis REST API + * + * The version of the OpenAPI document: v1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +import type { Configuration } from '../configuration'; +import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; +import globalAxios from 'axios'; +// Some imports not used depending on template conditions +// @ts-ignore +import { DUMMY_BASE_URL, assertParamExists, setApiKeyToObject, setBasicAuthToObject, setBearerAuthToObject, setOAuthToObject, setSearchParams, serializeDataIfNeeded, toPathString, createRequestFunction } from '../common'; +// @ts-ignore +import { BASE_PATH, COLLECTION_FORMATS, type RequestArgs, BaseAPI, RequiredError, operationServerMap } from '../base'; +// @ts-ignore +import type { ActivationDTO } from '../models'; +// @ts-ignore +import type { PageActivationDTO } from '../models'; +// @ts-ignore +import type { PageOfferDTO } from '../models'; +// @ts-ignore +import type { PageSchoolDTO } from '../models'; +/** + * EducationProviderApi - axios parameter creator + * @export + */ +export const EducationProviderApiAxiosParamCreator = function (configuration?: Configuration) { + return { + /** + * List the activation details for a selected owned offer, that has activated by the selected school. + * @param {string} offerId + * @param {string} organizationId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getActivationByOfferAndSchool: async (offerId: string, organizationId: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'offerId' is not null or undefined + assertParamExists('getActivationByOfferAndSchool', 'offerId', offerId) + // verify required parameter 'organizationId' is not null or undefined + assertParamExists('getActivationByOfferAndSchool', 'organizationId', organizationId) + const localVarPath = `/v1.0/activation/offers/{offerId}/schools/{organizationId}/details` + .replace(`{${"offerId"}}`, encodeURIComponent(String(offerId))) + .replace(`{${"organizationId"}}`, encodeURIComponent(String(organizationId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List the activation details for a selected school, that has activated the selected owned offer. + * @param {string} organizationId + * @param {string} offerId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getActivationBySchoolAndOffer: async (organizationId: string, offerId: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'organizationId' is not null or undefined + assertParamExists('getActivationBySchoolAndOffer', 'organizationId', organizationId) + // verify required parameter 'offerId' is not null or undefined + assertParamExists('getActivationBySchoolAndOffer', 'offerId', offerId) + const localVarPath = `/v1.0/activation/schools/{organizationId}/offers/{offerId}/details` + .replace(`{${"organizationId"}}`, encodeURIComponent(String(organizationId))) + .replace(`{${"offerId"}}`, encodeURIComponent(String(offerId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List all the activation details for all owned offer. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getActivations: async (page?: string, pageSize?: string, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/v1.0/activation/details`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (pageSize !== undefined) { + localVarQueryParameter['pageSize'] = pageSize; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List all owned offers, that has activated by any schools. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getOffers: async (page?: string, pageSize?: string, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/v1.0/activation/offers`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (pageSize !== undefined) { + localVarQueryParameter['pageSize'] = pageSize; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List all owned offers, that has activated by the selected school. + * @param {string} organizationId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getOffersBySchool: async (organizationId: string, page?: string, pageSize?: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'organizationId' is not null or undefined + assertParamExists('getOffersBySchool', 'organizationId', organizationId) + const localVarPath = `/v1.0/activation/schools/{organizationId}/offers` + .replace(`{${"organizationId"}}`, encodeURIComponent(String(organizationId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (pageSize !== undefined) { + localVarQueryParameter['pageSize'] = pageSize; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List all schools, that has activated any of the owned offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getSchools: async (page?: string, pageSize?: string, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/v1.0/activation/schools`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (pageSize !== undefined) { + localVarQueryParameter['pageSize'] = pageSize; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List all schools, that has activated the selected owned offer. + * @param {string} offerId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getSchoolsByOffer: async (offerId: string, page?: string, pageSize?: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'offerId' is not null or undefined + assertParamExists('getSchoolsByOffer', 'offerId', offerId) + const localVarPath = `/v1.0/activation/offers/{offerId}/schools` + .replace(`{${"offerId"}}`, encodeURIComponent(String(offerId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (pageSize !== undefined) { + localVarQueryParameter['pageSize'] = pageSize; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + } +}; + +/** + * EducationProviderApi - functional programming interface + * @export + */ +export const EducationProviderApiFp = function(configuration?: Configuration) { + const localVarAxiosParamCreator = EducationProviderApiAxiosParamCreator(configuration) + return { + /** + * List the activation details for a selected owned offer, that has activated by the selected school. + * @param {string} offerId + * @param {string} organizationId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getActivationByOfferAndSchool(offerId: string, organizationId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getActivationByOfferAndSchool(offerId, organizationId, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['EducationProviderApi.getActivationByOfferAndSchool']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * List the activation details for a selected school, that has activated the selected owned offer. + * @param {string} organizationId + * @param {string} offerId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getActivationBySchoolAndOffer(organizationId: string, offerId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getActivationBySchoolAndOffer(organizationId, offerId, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['EducationProviderApi.getActivationBySchoolAndOffer']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * List all the activation details for all owned offer. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getActivations(page?: string, pageSize?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getActivations(page, pageSize, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['EducationProviderApi.getActivations']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * List all owned offers, that has activated by any schools. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getOffers(page?: string, pageSize?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getOffers(page, pageSize, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['EducationProviderApi.getOffers']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * List all owned offers, that has activated by the selected school. + * @param {string} organizationId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getOffersBySchool(organizationId: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getOffersBySchool(organizationId, page, pageSize, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['EducationProviderApi.getOffersBySchool']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * List all schools, that has activated any of the owned offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getSchools(page?: string, pageSize?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getSchools(page, pageSize, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['EducationProviderApi.getSchools']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * List all schools, that has activated the selected owned offer. + * @param {string} offerId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getSchoolsByOffer(offerId: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getSchoolsByOffer(offerId, page, pageSize, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['EducationProviderApi.getSchoolsByOffer']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + } +}; + +/** + * EducationProviderApi - factory interface + * @export + */ +export const EducationProviderApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { + const localVarFp = EducationProviderApiFp(configuration) + return { + /** + * List the activation details for a selected owned offer, that has activated by the selected school. + * @param {string} offerId + * @param {string} organizationId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getActivationByOfferAndSchool(offerId: string, organizationId: string, options?: any): AxiosPromise { + return localVarFp.getActivationByOfferAndSchool(offerId, organizationId, options).then((request) => request(axios, basePath)); + }, + /** + * List the activation details for a selected school, that has activated the selected owned offer. + * @param {string} organizationId + * @param {string} offerId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getActivationBySchoolAndOffer(organizationId: string, offerId: string, options?: any): AxiosPromise { + return localVarFp.getActivationBySchoolAndOffer(organizationId, offerId, options).then((request) => request(axios, basePath)); + }, + /** + * List all the activation details for all owned offer. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getActivations(page?: string, pageSize?: string, options?: any): AxiosPromise { + return localVarFp.getActivations(page, pageSize, options).then((request) => request(axios, basePath)); + }, + /** + * List all owned offers, that has activated by any schools. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getOffers(page?: string, pageSize?: string, options?: any): AxiosPromise { + return localVarFp.getOffers(page, pageSize, options).then((request) => request(axios, basePath)); + }, + /** + * List all owned offers, that has activated by the selected school. + * @param {string} organizationId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getOffersBySchool(organizationId: string, page?: string, pageSize?: string, options?: any): AxiosPromise { + return localVarFp.getOffersBySchool(organizationId, page, pageSize, options).then((request) => request(axios, basePath)); + }, + /** + * List all schools, that has activated any of the owned offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getSchools(page?: string, pageSize?: string, options?: any): AxiosPromise { + return localVarFp.getSchools(page, pageSize, options).then((request) => request(axios, basePath)); + }, + /** + * List all schools, that has activated the selected owned offer. + * @param {string} offerId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getSchoolsByOffer(offerId: string, page?: string, pageSize?: string, options?: any): AxiosPromise { + return localVarFp.getSchoolsByOffer(offerId, page, pageSize, options).then((request) => request(axios, basePath)); + }, + }; +}; + +/** + * EducationProviderApi - interface + * @export + * @interface EducationProviderApi + */ +export interface EducationProviderApiInterface { + /** + * List the activation details for a selected owned offer, that has activated by the selected school. + * @param {string} offerId + * @param {string} organizationId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApiInterface + */ + getActivationByOfferAndSchool(offerId: string, organizationId: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * List the activation details for a selected school, that has activated the selected owned offer. + * @param {string} organizationId + * @param {string} offerId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApiInterface + */ + getActivationBySchoolAndOffer(organizationId: string, offerId: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * List all the activation details for all owned offer. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApiInterface + */ + getActivations(page?: string, pageSize?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * List all owned offers, that has activated by any schools. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApiInterface + */ + getOffers(page?: string, pageSize?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * List all owned offers, that has activated by the selected school. + * @param {string} organizationId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApiInterface + */ + getOffersBySchool(organizationId: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * List all schools, that has activated any of the owned offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApiInterface + */ + getSchools(page?: string, pageSize?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * List all schools, that has activated the selected owned offer. + * @param {string} offerId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApiInterface + */ + getSchoolsByOffer(offerId: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig): AxiosPromise; + +} + +/** + * EducationProviderApi - object-oriented interface + * @export + * @class EducationProviderApi + * @extends {BaseAPI} + */ +export class EducationProviderApi extends BaseAPI implements EducationProviderApiInterface { + /** + * List the activation details for a selected owned offer, that has activated by the selected school. + * @param {string} offerId + * @param {string} organizationId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApi + */ + public getActivationByOfferAndSchool(offerId: string, organizationId: string, options?: RawAxiosRequestConfig) { + return EducationProviderApiFp(this.configuration).getActivationByOfferAndSchool(offerId, organizationId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * List the activation details for a selected school, that has activated the selected owned offer. + * @param {string} organizationId + * @param {string} offerId + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApi + */ + public getActivationBySchoolAndOffer(organizationId: string, offerId: string, options?: RawAxiosRequestConfig) { + return EducationProviderApiFp(this.configuration).getActivationBySchoolAndOffer(organizationId, offerId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * List all the activation details for all owned offer. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApi + */ + public getActivations(page?: string, pageSize?: string, options?: RawAxiosRequestConfig) { + return EducationProviderApiFp(this.configuration).getActivations(page, pageSize, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * List all owned offers, that has activated by any schools. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApi + */ + public getOffers(page?: string, pageSize?: string, options?: RawAxiosRequestConfig) { + return EducationProviderApiFp(this.configuration).getOffers(page, pageSize, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * List all owned offers, that has activated by the selected school. + * @param {string} organizationId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApi + */ + public getOffersBySchool(organizationId: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig) { + return EducationProviderApiFp(this.configuration).getOffersBySchool(organizationId, page, pageSize, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * List all schools, that has activated any of the owned offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApi + */ + public getSchools(page?: string, pageSize?: string, options?: RawAxiosRequestConfig) { + return EducationProviderApiFp(this.configuration).getSchools(page, pageSize, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * List all schools, that has activated the selected owned offer. + * @param {string} offerId + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof EducationProviderApi + */ + public getSchoolsByOffer(offerId: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig) { + return EducationProviderApiFp(this.configuration).getSchoolsByOffer(offerId, page, pageSize, options).then((request) => request(this.axios, this.basePath)); + } +} + diff --git a/apps/server/src/infra/vidis-client/generated/api/idmbetreiber-api.ts b/apps/server/src/infra/vidis-client/generated/api/idmbetreiber-api.ts index 5b95bd1390..f41affcfc5 100644 --- a/apps/server/src/infra/vidis-client/generated/api/idmbetreiber-api.ts +++ b/apps/server/src/infra/vidis-client/generated/api/idmbetreiber-api.ts @@ -63,6 +63,88 @@ export const IDMBetreiberApiAxiosParamCreator = function (configuration?: Config + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List all offers, that has activated by the selected school. + * @param {string} schoolName + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getActivatedOffersBySchool: async (schoolName: string, page?: string, pageSize?: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'schoolName' is not null or undefined + assertParamExists('getActivatedOffersBySchool', 'schoolName', schoolName) + const localVarPath = `/v1.0/offers/activated/by-school/{schoolName}` + .replace(`{${"schoolName"}}`, encodeURIComponent(String(schoolName))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (pageSize !== undefined) { + localVarQueryParameter['pageSize'] = pageSize; + } + + + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * List all offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getAllOffers: async (page?: string, pageSize?: string, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/v1.0/offers/all`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (pageSize !== undefined) { + localVarQueryParameter['pageSize'] = pageSize; + } + + + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; @@ -96,6 +178,33 @@ export const IDMBetreiberApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['IDMBetreiberApi.getActivatedOffersByRegion']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * List all offers, that has activated by the selected school. + * @param {string} schoolName + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getActivatedOffersBySchool(schoolName: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getActivatedOffersBySchool(schoolName, page, pageSize, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['IDMBetreiberApi.getActivatedOffersBySchool']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * List all offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getAllOffers(page?: string, pageSize?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getAllOffers(page, pageSize, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['IDMBetreiberApi.getAllOffers']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, } }; @@ -117,6 +226,27 @@ export const IDMBetreiberApiFactory = function (configuration?: Configuration, b getActivatedOffersByRegion(regionName: string, page?: string, pageSize?: string, options?: any): AxiosPromise { return localVarFp.getActivatedOffersByRegion(regionName, page, pageSize, options).then((request) => request(axios, basePath)); }, + /** + * List all offers, that has activated by the selected school. + * @param {string} schoolName + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getActivatedOffersBySchool(schoolName: string, page?: string, pageSize?: string, options?: any): AxiosPromise { + return localVarFp.getActivatedOffersBySchool(schoolName, page, pageSize, options).then((request) => request(axios, basePath)); + }, + /** + * List all offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getAllOffers(page?: string, pageSize?: string, options?: any): AxiosPromise { + return localVarFp.getAllOffers(page, pageSize, options).then((request) => request(axios, basePath)); + }, }; }; @@ -137,6 +267,27 @@ export interface IDMBetreiberApiInterface { */ getActivatedOffersByRegion(regionName: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * List all offers, that has activated by the selected school. + * @param {string} schoolName + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof IDMBetreiberApiInterface + */ + getActivatedOffersBySchool(schoolName: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * List all offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof IDMBetreiberApiInterface + */ + getAllOffers(page?: string, pageSize?: string, options?: RawAxiosRequestConfig): AxiosPromise; + } /** @@ -158,5 +309,30 @@ export class IDMBetreiberApi extends BaseAPI implements IDMBetreiberApiInterface public getActivatedOffersByRegion(regionName: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig) { return IDMBetreiberApiFp(this.configuration).getActivatedOffersByRegion(regionName, page, pageSize, options).then((request) => request(this.axios, this.basePath)); } + + /** + * List all offers, that has activated by the selected school. + * @param {string} schoolName + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof IDMBetreiberApi + */ + public getActivatedOffersBySchool(schoolName: string, page?: string, pageSize?: string, options?: RawAxiosRequestConfig) { + return IDMBetreiberApiFp(this.configuration).getActivatedOffersBySchool(schoolName, page, pageSize, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * List all offers. + * @param {string} [page] + * @param {string} [pageSize] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof IDMBetreiberApi + */ + public getAllOffers(page?: string, pageSize?: string, options?: RawAxiosRequestConfig) { + return IDMBetreiberApiFp(this.configuration).getAllOffers(page, pageSize, options).then((request) => request(this.axios, this.basePath)); + } } diff --git a/apps/server/src/migrations/mikro-orm/Migration20250121203707.ts b/apps/server/src/migrations/mikro-orm/Migration20250121203707.ts new file mode 100644 index 0000000000..ec65dfa7e2 --- /dev/null +++ b/apps/server/src/migrations/mikro-orm/Migration20250121203707.ts @@ -0,0 +1,37 @@ +import { Migration } from '@mikro-orm/migrations-mongodb'; + +export class Migration20250121203707 extends Migration { + async up(): Promise { + const adminRoleUpdate = await this.getCollection('roles').updateOne( + { name: 'administrator' }, + { + $addToSet: { + permissions: { + $each: ['MEDIA_SCHOOL_LICENSE_ADMIN'], + }, + }, + } + ); + + if (adminRoleUpdate.modifiedCount > 0) { + console.info('Permission MEDIA_SCHOOL_LICENSE_ADMIN added to role administrator.'); + } + } + + async down(): Promise { + const adminRoleUpdate = await this.getCollection('roles').updateOne( + { name: 'administrator' }, + { + $pull: { + permissions: { + $in: ['MEDIA_SCHOOL_LICENSE_ADMIN'], + }, + }, + } + ); + + if (adminRoleUpdate.modifiedCount > 0) { + console.info('Rollback: Permission MEDIA_SCHOOL_LICENSE_ADMIN added to role administrator.'); + } + } +} diff --git a/apps/server/src/modules/school-license/api/api-test/school-license.api.spec.ts b/apps/server/src/modules/school-license/api/api-test/school-license.api.spec.ts new file mode 100644 index 0000000000..b948936616 --- /dev/null +++ b/apps/server/src/modules/school-license/api/api-test/school-license.api.spec.ts @@ -0,0 +1,182 @@ +import { vidisPageOfferFactory } from '@infra/sync/media-licenses/testing'; +import { PageOfferDTO } from '@infra/vidis-client'; +import { EntityManager } from '@mikro-orm/mongodb'; +import { HttpStatus, INestApplication } from '@nestjs/common'; +import { Test } from '@nestjs/testing'; +import { Permission } from '@shared/domain/interface'; +import { cleanupCollections } from '@testing/cleanup-collections'; +import { schoolEntityFactory } from '@testing/factory/school-entity.factory'; + +import { UserAndAccountTestFactory } from '@testing/factory/user-and-account.test.factory'; +import { TestApiClient } from '@testing/test-api-client'; +import { ServerTestModule } from '@modules/server'; +import axios from 'axios'; +import MockAdapter from 'axios-mock-adapter'; +import { federalStateFactory } from '@testing/factory/federal-state.factory'; +import { MediaSourceDataFormat } from '@modules/media-source'; +import { mediaSourceEntityFactory } from '@modules/media-source/testing'; + +describe('SchoolLicenseController (API)', () => { + let app: INestApplication; + let em: EntityManager; + let testApiClient: TestApiClient; + let axiosMock: MockAdapter; + + beforeAll(async () => { + const moduleFixture = await Test.createTestingModule({ + imports: [ServerTestModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + em = app.get(EntityManager); + + axiosMock = new MockAdapter(axios); + + testApiClient = new TestApiClient(app, 'school-licenses'); + }); + + beforeEach(async () => { + await cleanupCollections(em); + }); + + afterAll(async () => { + await app.close(); + }); + + describe('POST /school-licenses', () => { + describe('when the user is not authenticated', () => { + it('should return a 401 error', async () => { + const response = await testApiClient.post(); + + expect(response.status).toBe(HttpStatus.UNAUTHORIZED); + }); + }); + + describe('when update media school licenses was successful', () => { + const setup = async () => { + const federalState = federalStateFactory.build(); + const school = schoolEntityFactory.buildWithId({ + officialSchoolNumber: '00100', + federalState, + }); + const mediaSource = mediaSourceEntityFactory.build({ format: MediaSourceDataFormat.VIDIS }); + + const { adminUser, adminAccount } = UserAndAccountTestFactory.buildAdmin({ school }, [ + Permission.MEDIA_SCHOOL_LICENSE_ADMIN, + ]); + await em.persistAndFlush([adminUser, adminAccount, federalState, school, mediaSource]); + em.clear(); + + const loggedInClient = await testApiClient.login(adminAccount); + + const pageOfferDTO = vidisPageOfferFactory.build(); + + axiosMock.onGet(/\/offers\/activated\/by-school\/[^/]+$/).replyOnce(200, { + ...pageOfferDTO, + }); + + return { loggedInClient }; + }; + + it('should return status created', async () => { + const { loggedInClient } = await setup(); + + await loggedInClient.post('').send().expect(HttpStatus.CREATED); + }); + }); + + describe('when official school number was not found', () => { + const setup = async () => { + const school = schoolEntityFactory.buildWithId({}); + const mediaSource = mediaSourceEntityFactory.build({ format: MediaSourceDataFormat.VIDIS }); + + const { adminUser, adminAccount } = UserAndAccountTestFactory.buildAdmin({ school }, [ + Permission.MEDIA_SCHOOL_LICENSE_ADMIN, + ]); + + await em.persistAndFlush([adminUser, adminAccount, school, mediaSource]); + em.clear(); + + const loggedInClient = await testApiClient.login(adminAccount); + + const pageOfferDTO = vidisPageOfferFactory.build(); + + axiosMock.onGet(/\/offers\/activated\/by-school\/[^/]+$/).replyOnce(200, { + ...pageOfferDTO, + }); + + return { loggedInClient }; + }; + + it('should return status not found', async () => { + const { loggedInClient } = await setup(); + + const response = await loggedInClient.post('').send(); + + expect(response.status).toBe(HttpStatus.NOT_FOUND); + }); + }); + + describe('when media source not found', () => { + const setup = async () => { + const school = schoolEntityFactory.buildWithId({ + officialSchoolNumber: '00100', + }); + + const { adminUser, adminAccount } = UserAndAccountTestFactory.buildAdmin({ school }, [ + Permission.MEDIA_SCHOOL_LICENSE_ADMIN, + ]); + await em.persistAndFlush([adminUser, adminAccount, school]); + em.clear(); + + const loggedInClient = await testApiClient.login(adminAccount); + + const pageOfferDTO = vidisPageOfferFactory.build(); + + axiosMock.onGet(/\/offers\/activated\/by-school\/[^/]+$/).replyOnce(200, { + ...pageOfferDTO, + }); + + return { loggedInClient }; + }; + + it('should return status not found', async () => { + const { loggedInClient } = await setup(); + + const response = await loggedInClient.post('').send(); + + expect(response.status).toBe(HttpStatus.NOT_FOUND); + }); + }); + + describe('when user has no permission', () => { + const setup = async () => { + const school = schoolEntityFactory.buildWithId({ officialSchoolNumber: '00100' }); + const mediaSource = mediaSourceEntityFactory.build({ format: MediaSourceDataFormat.VIDIS }); + + const { adminUser, adminAccount } = UserAndAccountTestFactory.buildAdmin({ school }); + await em.persistAndFlush([adminUser, adminAccount, school, mediaSource]); + em.clear(); + + const loggedInClient = await testApiClient.login(adminAccount); + + const pageOfferDTO = vidisPageOfferFactory.build(); + + axiosMock.onGet(/\/offers\/activated\/by-school\/[^/]+$/).replyOnce(200, { + ...pageOfferDTO, + }); + + return { loggedInClient }; + }; + + it('should return status unauthorized', async () => { + const { loggedInClient } = await setup(); + + const response = await loggedInClient.post('').send(); + + expect(response.status).toBe(HttpStatus.UNAUTHORIZED); + }); + }); + }); +}); diff --git a/apps/server/src/modules/school-license/api/school-license.controller.ts b/apps/server/src/modules/school-license/api/school-license.controller.ts new file mode 100644 index 0000000000..b8ce885530 --- /dev/null +++ b/apps/server/src/modules/school-license/api/school-license.controller.ts @@ -0,0 +1,19 @@ +import { CurrentUser, ICurrentUser, JwtAuthentication } from '@infra/auth-guard'; +import { Controller, Post } from '@nestjs/common'; +import { ApiCreatedResponse, ApiOperation, ApiTags, ApiUnauthorizedResponse } from '@nestjs/swagger'; +import { MediaSchoolLicenseUc } from '../uc'; + +@ApiTags('School License') +@JwtAuthentication() +@Controller('school-licenses') +export class SchoolLicenseController { + constructor(private readonly mediaSchoolLicenseUc: MediaSchoolLicenseUc) {} + + @ApiOperation({ summary: 'Update media school licenses' }) + @ApiCreatedResponse() + @ApiUnauthorizedResponse() + @Post() + async updateMediaSchoolLicenses(@CurrentUser() currentUser: ICurrentUser): Promise { + await this.mediaSchoolLicenseUc.updateMediaSchoolLicenses(currentUser.userId, currentUser.schoolId); + } +} diff --git a/apps/server/src/modules/school-license/loggable/build-media-school-license-failed.loggable.spec.ts b/apps/server/src/modules/school-license/loggable/build-media-school-license-failed.loggable.spec.ts new file mode 100644 index 0000000000..1d51ce1c0d --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/build-media-school-license-failed.loggable.spec.ts @@ -0,0 +1,23 @@ +import { BuildMediaSchoolLicenseFailedLoggable } from './build-media-school-license-failed.loggable'; + +describe(BuildMediaSchoolLicenseFailedLoggable.name, () => { + describe('getLogMessage', () => { + const setup = () => { + const loggable = new BuildMediaSchoolLicenseFailedLoggable(); + + return { + loggable, + }; + }; + + it('should return the correct log message', () => { + const { loggable } = setup(); + + const logMessage = loggable.getLogMessage(); + + expect(logMessage).toEqual({ + message: 'Unable to build media school license, because mediumId is missing.', + }); + }); + }); +}); diff --git a/apps/server/src/modules/school-license/loggable/build-media-school-license-failed.loggable.ts b/apps/server/src/modules/school-license/loggable/build-media-school-license-failed.loggable.ts new file mode 100644 index 0000000000..2efd391a6c --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/build-media-school-license-failed.loggable.ts @@ -0,0 +1,9 @@ +import { ErrorLogMessage, Loggable, LogMessage, ValidationErrorLogMessage } from '@core/logger'; + +export class BuildMediaSchoolLicenseFailedLoggable implements Loggable { + getLogMessage(): LogMessage | ErrorLogMessage | ValidationErrorLogMessage { + return { + message: 'Unable to build media school license, because mediumId is missing.', + }; + } +} diff --git a/apps/server/src/modules/school-license/loggable/federal-state-abbreviation-of-school-not-found.loggable-exception.spec.ts b/apps/server/src/modules/school-license/loggable/federal-state-abbreviation-of-school-not-found.loggable-exception.spec.ts new file mode 100644 index 0000000000..e28b6cbd71 --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/federal-state-abbreviation-of-school-not-found.loggable-exception.spec.ts @@ -0,0 +1,27 @@ +import { FederalStateAbbreviationOfSchoolNotFoundLoggableException } from './federal-state-abbreviation-of-school-not-found.loggable-exception'; + +describe(FederalStateAbbreviationOfSchoolNotFoundLoggableException.name, () => { + describe('getLogMessage', () => { + const setup = () => { + const exception = new FederalStateAbbreviationOfSchoolNotFoundLoggableException('testSchoolId'); + + return { + exception, + }; + }; + + it('should return the correct log message', () => { + const { exception } = setup(); + + const logMessage = exception.getLogMessage(); + + expect(logMessage).toEqual({ + message: + 'Unable to fetch media school licenses from media source, because federal state abbreviation of school cannot be found.', + data: { + schoolId: 'testSchoolId', + }, + }); + }); + }); +}); diff --git a/apps/server/src/modules/school-license/loggable/federal-state-abbreviation-of-school-not-found.loggable-exception.ts b/apps/server/src/modules/school-license/loggable/federal-state-abbreviation-of-school-not-found.loggable-exception.ts new file mode 100644 index 0000000000..77c3b01665 --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/federal-state-abbreviation-of-school-not-found.loggable-exception.ts @@ -0,0 +1,18 @@ +import { NotFoundException } from '@nestjs/common'; +import { ErrorLogMessage, LogMessage, ValidationErrorLogMessage } from '@core/logger'; + +export class FederalStateAbbreviationOfSchoolNotFoundLoggableException extends NotFoundException { + constructor(private readonly schoolId: string) { + super(); + } + + public getLogMessage(): LogMessage | ErrorLogMessage | ValidationErrorLogMessage { + return { + message: + 'Unable to fetch media school licenses from media source, because federal state abbreviation of school cannot be found.', + data: { + schoolId: this.schoolId, + }, + }; + } +} diff --git a/apps/server/src/modules/school-license/loggable/index.ts b/apps/server/src/modules/school-license/loggable/index.ts new file mode 100644 index 0000000000..a0fc6918d3 --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/index.ts @@ -0,0 +1,4 @@ +export { BuildMediaSchoolLicenseFailedLoggable } from './build-media-school-license-failed.loggable'; +export { SchoolNumberNotFoundLoggableException } from './school-number-not-found.loggable-exception'; +export { MediaSourceNotFoundLoggableException } from './media-source-not-found.loggable-exception'; +export { FederalStateAbbreviationOfSchoolNotFoundLoggableException } from './federal-state-abbreviation-of-school-not-found.loggable-exception'; diff --git a/apps/server/src/modules/school-license/loggable/media-source-not-found.loggable-exception.spec.ts b/apps/server/src/modules/school-license/loggable/media-source-not-found.loggable-exception.spec.ts new file mode 100644 index 0000000000..8d406a97a1 --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/media-source-not-found.loggable-exception.spec.ts @@ -0,0 +1,26 @@ +import { MediaSourceNotFoundLoggableException } from './media-source-not-found.loggable-exception'; + +describe(MediaSourceNotFoundLoggableException.name, () => { + const setup = () => { + const mediaSourceName = 'TestMediaSource'; + const exception = new MediaSourceNotFoundLoggableException(mediaSourceName); + + return { + exception, + mediaSourceName, + }; + }; + + it('should return the correct log message', () => { + const { exception, mediaSourceName } = setup(); + + const logMessage = exception.getLogMessage(); + + expect(logMessage).toEqual({ + message: 'Unable to fetch media school licenses, because media source cannot be found.', + data: { + mediaSourceName, + }, + }); + }); +}); diff --git a/apps/server/src/modules/school-license/loggable/media-source-not-found.loggable-exception.ts b/apps/server/src/modules/school-license/loggable/media-source-not-found.loggable-exception.ts new file mode 100644 index 0000000000..b6b0e439cf --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/media-source-not-found.loggable-exception.ts @@ -0,0 +1,17 @@ +import { NotFoundException } from '@nestjs/common'; +import { ErrorLogMessage, Loggable, LogMessage, ValidationErrorLogMessage } from '@core/logger'; + +export class MediaSourceNotFoundLoggableException extends NotFoundException implements Loggable { + constructor(private readonly mediaSourceName: string) { + super(); + } + + getLogMessage(): LogMessage | ErrorLogMessage | ValidationErrorLogMessage { + return { + message: 'Unable to fetch media school licenses, because media source cannot be found.', + data: { + mediaSourceName: this.mediaSourceName, + }, + }; + } +} diff --git a/apps/server/src/modules/school-license/loggable/school-number-not-found.loggable-exception.spec.ts b/apps/server/src/modules/school-license/loggable/school-number-not-found.loggable-exception.spec.ts new file mode 100644 index 0000000000..7895837b82 --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/school-number-not-found.loggable-exception.spec.ts @@ -0,0 +1,26 @@ +import { SchoolNumberNotFoundLoggableException } from './school-number-not-found.loggable-exception'; + +describe(SchoolNumberNotFoundLoggableException.name, () => { + const setup = () => { + const schoolId = 'testSchoolId'; + const exception = new SchoolNumberNotFoundLoggableException(schoolId); + + return { + exception, + schoolId, + }; + }; + + it('should return the correct log message', () => { + const { exception, schoolId } = setup(); + + const logMessage = exception.getLogMessage(); + + expect(logMessage).toEqual({ + message: 'Required school number for media school licenses request is missing.', + data: { + schoolId, + }, + }); + }); +}); diff --git a/apps/server/src/modules/school-license/loggable/school-number-not-found.loggable-exception.ts b/apps/server/src/modules/school-license/loggable/school-number-not-found.loggable-exception.ts new file mode 100644 index 0000000000..c70b71f6e7 --- /dev/null +++ b/apps/server/src/modules/school-license/loggable/school-number-not-found.loggable-exception.ts @@ -0,0 +1,17 @@ +import { NotFoundException } from '@nestjs/common'; +import { ErrorLogMessage, LogMessage, ValidationErrorLogMessage } from '@core/logger'; + +export class SchoolNumberNotFoundLoggableException extends NotFoundException { + constructor(private readonly schoolId: string) { + super(); + } + + public getLogMessage(): LogMessage | ErrorLogMessage | ValidationErrorLogMessage { + return { + message: 'Required school number for media school licenses request is missing.', + data: { + schoolId: this.schoolId, + }, + }; + } +} diff --git a/apps/server/src/modules/school-license/repo/media-school-license-repo.interface.ts b/apps/server/src/modules/school-license/repo/media-school-license-repo.interface.ts index 98b43ef0f3..99abd920de 100644 --- a/apps/server/src/modules/school-license/repo/media-school-license-repo.interface.ts +++ b/apps/server/src/modules/school-license/repo/media-school-license-repo.interface.ts @@ -7,6 +7,8 @@ export interface MediaSchoolLicenseRepo { deleteAllByMediaSource(mediaSourceId: EntityId): Promise; findMediaSchoolLicensesBySchoolId(schoolId: string): Promise; + + deleteAllBySchoolAndMediaSource(schoolId: EntityId, mediaSourceId: EntityId): Promise; } export const MEDIA_SCHOOL_LICENSE_REPO = 'MEDIA_SCHOOL_LICENSE_REPO'; diff --git a/apps/server/src/modules/school-license/repo/mikro-orm/media-school-license.repo.integration.spec.ts b/apps/server/src/modules/school-license/repo/mikro-orm/media-school-license.repo.integration.spec.ts index 87a912ecd4..798288d2f4 100644 --- a/apps/server/src/modules/school-license/repo/mikro-orm/media-school-license.repo.integration.spec.ts +++ b/apps/server/src/modules/school-license/repo/mikro-orm/media-school-license.repo.integration.spec.ts @@ -141,4 +141,38 @@ describe(MediaSchoolLicenseMikroOrmRepo.name, () => { }); }); }); + + describe('deleteAllBySchoolAndMediaSource', () => { + describe('when a school id and media source id is provided', () => { + const setup = async () => { + const school = schoolEntityFactory.buildWithId(); + const mediaSource = mediaSourceEntityFactory.build(); + const mediaSchoolLicenseEntities: MediaSchoolLicenseEntity[] = mediaSchoolLicenseEntityFactory.buildList(3, { + mediaSource, + school, + }); + + const otherMediaSource = mediaSourceEntityFactory.build(); + const otherEntity = mediaSchoolLicenseEntityFactory.build({ + mediaSource: otherMediaSource, + school, + }); + + await em.persistAndFlush([...mediaSchoolLicenseEntities, otherEntity, school]); + em.clear(); + + return { mediaSource, otherEntity, school }; + }; + + it('should delete the media school license', async () => { + const { mediaSource, otherEntity, school } = await setup(); + + await repo.deleteAllBySchoolAndMediaSource(school.id, mediaSource.id); + + const savedMediaSchoolLicenses: MediaSchoolLicenseEntity[] = await em.find(MediaSchoolLicenseEntity, {}); + expect(savedMediaSchoolLicenses.length).toEqual(1); + expect(savedMediaSchoolLicenses[0]._id.toHexString()).toEqual(otherEntity._id.toHexString()); + }); + }); + }); }); diff --git a/apps/server/src/modules/school-license/repo/mikro-orm/media-school-license.repo.ts b/apps/server/src/modules/school-license/repo/mikro-orm/media-school-license.repo.ts index 81b1be94ef..3031ed65bc 100644 --- a/apps/server/src/modules/school-license/repo/mikro-orm/media-school-license.repo.ts +++ b/apps/server/src/modules/school-license/repo/mikro-orm/media-school-license.repo.ts @@ -38,6 +38,15 @@ export class MediaSchoolLicenseMikroOrmRepo return deleteCount; } + public async deleteAllBySchoolAndMediaSource(schoolId: EntityId, mediaSourceId: EntityId): Promise { + const deleteCount = await this.em.nativeDelete(this.entityName, { + school: new ObjectId(schoolId), + mediaSource: new ObjectId(mediaSourceId), + }); + + return deleteCount; + } + public async findMediaSchoolLicensesBySchoolId(schoolId: EntityId): Promise { const scope: MediaSchoolLicenseScope = new MediaSchoolLicenseScope(); scope.bySchoolId(schoolId); diff --git a/apps/server/src/modules/school-license/school-license-api.module.ts b/apps/server/src/modules/school-license/school-license-api.module.ts new file mode 100644 index 0000000000..f42cbf51d7 --- /dev/null +++ b/apps/server/src/modules/school-license/school-license-api.module.ts @@ -0,0 +1,12 @@ +import { AuthorizationModule } from '@modules/authorization'; +import { Module } from '@nestjs/common'; +import { SchoolLicenseController } from './api/school-license.controller'; +import { SchoolLicenseModule } from './school-license.module'; +import { MediaSchoolLicenseUc } from './uc'; + +@Module({ + imports: [SchoolLicenseModule, AuthorizationModule], + controllers: [SchoolLicenseController], + providers: [MediaSchoolLicenseUc], +}) +export class SchoolLicenseApiModule {} diff --git a/apps/server/src/modules/school-license/school-license.module.ts b/apps/server/src/modules/school-license/school-license.module.ts index 2461c9a5ea..cc1dfb53e9 100644 --- a/apps/server/src/modules/school-license/school-license.module.ts +++ b/apps/server/src/modules/school-license/school-license.module.ts @@ -1,16 +1,18 @@ -import { Module } from '@nestjs/common'; import { LoggerModule } from '@core/logger'; -import { MediaSourceModule } from '../media-source/media-source.module'; -import { SchoolModule } from '../school'; +import { EncryptionModule } from '@infra/encryption'; +import { MediaSourceModule } from '@modules/media-source/media-source.module'; +import { SchoolModule } from '@modules/school'; +import { Module } from '@nestjs/common'; import { MEDIA_SCHOOL_LICENSE_REPO } from './repo'; import { MediaSchoolLicenseMikroOrmRepo } from './repo/mikro-orm/media-school-license.repo'; -import { MediaSchoolLicenseService } from './service/media-school-license.service'; +import { MediaSchoolLicenseFetchService, MediaSchoolLicenseService } from './service'; @Module({ - imports: [MediaSourceModule, SchoolModule, LoggerModule], + imports: [MediaSourceModule, SchoolModule, LoggerModule, EncryptionModule], providers: [ - MediaSchoolLicenseService, { provide: MEDIA_SCHOOL_LICENSE_REPO, useClass: MediaSchoolLicenseMikroOrmRepo }, + MediaSchoolLicenseService, + MediaSchoolLicenseFetchService, ], exports: [MediaSchoolLicenseService], }) diff --git a/apps/server/src/modules/school-license/service/index.ts b/apps/server/src/modules/school-license/service/index.ts new file mode 100644 index 0000000000..67287a15af --- /dev/null +++ b/apps/server/src/modules/school-license/service/index.ts @@ -0,0 +1,2 @@ +export { MediaSchoolLicenseService } from './media-school-license.service'; +export { MediaSchoolLicenseFetchService } from './media-school-license-fetch.service'; diff --git a/apps/server/src/modules/school-license/service/media-school-license-fetch.service.spec.ts b/apps/server/src/modules/school-license/service/media-school-license-fetch.service.spec.ts new file mode 100644 index 0000000000..2081040caf --- /dev/null +++ b/apps/server/src/modules/school-license/service/media-school-license-fetch.service.spec.ts @@ -0,0 +1,243 @@ +import { AxiosErrorLoggable } from '@core/error/loggable'; +import { createMock, DeepMocked } from '@golevelup/ts-jest'; +import { DefaultEncryptionService, EncryptionService, SymmetricKeyEncryptionService } from '@infra/encryption'; +import { vidisPageOfferFactory } from '@infra/sync/media-licenses/testing'; +import { Configuration, IDMBetreiberApiFactory, IDMBetreiberApiInterface, PageOfferDTO } from '@infra/vidis-client'; +import { MediaSourceDataFormat } from '@modules/media-source'; +import { mediaSourceFactory } from '@modules/media-source/testing'; +import { Test, TestingModule } from '@nestjs/testing'; +import { axiosErrorFactory } from '@testing/factory/axios-error.factory'; +import { axiosResponseFactory } from '@testing/factory/axios-response.factory'; +import { AxiosResponse, RawAxiosRequestConfig } from 'axios'; +import { MediaSourceVidisConfigNotFoundLoggableException } from '../../media-source/loggable'; +import { MediaSchoolLicenseFetchService } from './media-school-license-fetch.service'; + +jest.mock('@infra/vidis-client/generated/api'); + +describe(MediaSchoolLicenseFetchService.name, () => { + let module: TestingModule; + let service: MediaSchoolLicenseFetchService; + + let encryptionService: DeepMocked; + + let vidisApi: DeepMocked; + let apiFactoryMock: jest.Mocked; + + beforeAll(async () => { + module = await Test.createTestingModule({ + providers: [ + MediaSchoolLicenseFetchService, + { + provide: DefaultEncryptionService, + useValue: createMock(), + }, + ], + }).compile(); + + service = module.get(MediaSchoolLicenseFetchService); + encryptionService = module.get(DefaultEncryptionService); + + vidisApi = createMock(); + apiFactoryMock = jest.mocked(IDMBetreiberApiFactory).mockReturnValue(vidisApi); + }); + + afterAll(async () => { + await module.close(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('fetchOffersForSchoolFromVidis', () => { + describe('when the media source has basic auth config', () => { + describe('when vidis returns the offer items successfully', () => { + const setup = () => { + const mediaSource = mediaSourceFactory.withVidis().build(); + + const axiosResponse = axiosResponseFactory.build({ + data: vidisPageOfferFactory.build(), + }) as AxiosResponse; + + vidisApi.getActivatedOffersBySchool.mockResolvedValueOnce(axiosResponse); + + const decryptedUsername = 'un-decrypted'; + const decryptedPassword = 'pw-decrypted'; + encryptionService.decrypt.mockReturnValueOnce(decryptedUsername); + encryptionService.decrypt.mockReturnValueOnce(decryptedPassword); + + const schoolName = 'NI_12345'; + + return { + mediaSource, + vidisOfferItems: axiosResponse.data.items, + decryptedUsername, + decryptedPassword, + schoolName, + }; + }; + + it('should return the vidis offer items', async () => { + const { mediaSource, vidisOfferItems, schoolName } = setup(); + + const result = await service.fetchOffersForSchoolFromVidis(mediaSource, schoolName); + + expect(result).toEqual(vidisOfferItems); + }); + + it('should decrypt the credentials from basic auth config', async () => { + const { mediaSource, schoolName } = setup(); + + await service.fetchOffersForSchoolFromVidis(mediaSource, schoolName); + + expect(encryptionService.decrypt).toBeCalledTimes(2); + expect(encryptionService.decrypt).toBeCalledWith(mediaSource.vidisConfig?.username); + expect(encryptionService.decrypt).toBeCalledWith(mediaSource.vidisConfig?.password); + }); + + it('should create a vidis api client', async () => { + const { mediaSource, schoolName } = setup(); + + await service.fetchOffersForSchoolFromVidis(mediaSource, schoolName); + + expect(apiFactoryMock).toHaveBeenCalledWith( + new Configuration({ + basePath: mediaSource.vidisConfig?.baseUrl, + }) + ); + }); + + it('should call the vidis endpoint for activated offer items with basic auth', async () => { + const { mediaSource, decryptedUsername, decryptedPassword, schoolName } = setup(); + + await service.fetchOffersForSchoolFromVidis(mediaSource, schoolName); + + const encodedBasicAuth = btoa(`${decryptedUsername}:${decryptedPassword}`); + const expectedAxiosOptions: RawAxiosRequestConfig = { + headers: { Authorization: expect.stringMatching(`Basic ${encodedBasicAuth}`) as string }, + }; + + expect(vidisApi.getActivatedOffersBySchool).toBeCalledWith( + 'NI_12345', + undefined, + undefined, + expectedAxiosOptions + ); + }); + }); + + describe('when vidis returns the no offer items', () => { + const setup = () => { + const mediaSource = mediaSourceFactory.withVidis().build(); + + const axiosResponse = axiosResponseFactory.build({ + data: vidisPageOfferFactory.build({ items: undefined }), + }) as AxiosResponse; + + vidisApi.getActivatedOffersBySchool.mockResolvedValueOnce(axiosResponse); + + encryptionService.decrypt.mockReturnValueOnce('un-decrypted'); + encryptionService.decrypt.mockReturnValueOnce('pw-decrypted'); + + const schoolName = 'NI_12345'; + + return { + mediaSource, + schoolName, + }; + }; + + it('should return an empty array', async () => { + const { mediaSource, schoolName } = setup(); + + const result = await service.fetchOffersForSchoolFromVidis(mediaSource, schoolName); + + expect(result.length).toEqual(0); + }); + }); + + describe('when an axios error is thrown', () => { + const setup = () => { + const mediaSource = mediaSourceFactory.withVidis().build(); + + const axiosError = axiosErrorFactory.build(); + + vidisApi.getActivatedOffersBySchool.mockRejectedValueOnce(axiosError); + + encryptionService.decrypt.mockReturnValueOnce('un-decrypted'); + encryptionService.decrypt.mockReturnValueOnce('pw-decrypted'); + + const schoolName = 'NI_12345'; + + return { + mediaSource, + axiosError, + schoolName, + }; + }; + + it('should throw a AxiosErrorLoggable', async () => { + const { mediaSource, axiosError, schoolName } = setup(); + + const promise = service.fetchOffersForSchoolFromVidis(mediaSource, schoolName); + + await expect(promise).rejects.toThrow( + new AxiosErrorLoggable(axiosError, 'VIDIS_GET_OFFER_ITEMS_FOR_SCHOOL_FAILED') + ); + }); + }); + + describe('when an unknown error is thrown', () => { + const setup = () => { + const mediaSource = mediaSourceFactory.withVidis().build(); + + const unknownError = new Error(); + + vidisApi.getActivatedOffersBySchool.mockRejectedValueOnce(unknownError); + + encryptionService.decrypt.mockReturnValueOnce('un-decrypted'); + encryptionService.decrypt.mockReturnValueOnce('pw-decrypted'); + + const schoolName = 'NI_12345'; + + return { + mediaSource, + unknownError, + schoolName, + }; + }; + + it('should throw the unknown error', async () => { + const { mediaSource, unknownError, schoolName } = setup(); + + const promise = service.fetchOffersForSchoolFromVidis(mediaSource, schoolName); + + await expect(promise).rejects.toThrow(unknownError); + }); + }); + }); + + describe('when the media source has no basic auth config ', () => { + const setup = () => { + const mediaSource = mediaSourceFactory.build({ format: MediaSourceDataFormat.VIDIS, vidisConfig: undefined }); + + const schoolName = 'NI_12345'; + + return { + mediaSource, + schoolName, + }; + }; + + it('should throw an MediaSourceBasicAuthConfigNotFoundLoggableException', async () => { + const { mediaSource, schoolName } = setup(); + + const promise = service.fetchOffersForSchoolFromVidis(mediaSource, schoolName); + + await expect(promise).rejects.toThrow( + new MediaSourceVidisConfigNotFoundLoggableException(mediaSource.id, MediaSourceDataFormat.VIDIS) + ); + }); + }); + }); +}); diff --git a/apps/server/src/modules/school-license/service/media-school-license-fetch.service.ts b/apps/server/src/modules/school-license/service/media-school-license-fetch.service.ts new file mode 100644 index 0000000000..a1ccdc47e7 --- /dev/null +++ b/apps/server/src/modules/school-license/service/media-school-license-fetch.service.ts @@ -0,0 +1,48 @@ +import { AxiosErrorLoggable } from '@core/error/loggable'; +import { DefaultEncryptionService, EncryptionService } from '@infra/encryption'; +import { Configuration, IDMBetreiberApiFactory, OfferDTO, PageOfferDTO } from '@infra/vidis-client'; +import { MediaSource, MediaSourceDataFormat } from '@modules/media-source'; +import { MediaSourceVidisConfigNotFoundLoggableException } from '@modules/media-source/loggable'; +import { Inject } from '@nestjs/common'; +import { AxiosResponse, isAxiosError } from 'axios'; + +export class MediaSchoolLicenseFetchService { + constructor(@Inject(DefaultEncryptionService) private readonly encryptionService: EncryptionService) {} + + public async fetchOffersForSchoolFromVidis(mediaSource: MediaSource, schoolName: string): Promise { + if (!mediaSource.vidisConfig) { + throw new MediaSourceVidisConfigNotFoundLoggableException(mediaSource.id, MediaSourceDataFormat.VIDIS); + } + + const { vidisConfig } = mediaSource; + const api = IDMBetreiberApiFactory( + new Configuration({ + basePath: vidisConfig.baseUrl, + }) + ); + + const decryptedUsername = this.encryptionService.decrypt(vidisConfig.username); + const decryptedPassword = this.encryptionService.decrypt(vidisConfig.password); + const basicAuthEncoded = btoa(`${decryptedUsername}:${decryptedPassword}`); + + try { + const axiosResponse: AxiosResponse = await api.getActivatedOffersBySchool( + schoolName, + undefined, + undefined, + { + headers: { Authorization: `Basic ${basicAuthEncoded}` }, + } + ); + const offerItems: OfferDTO[] = axiosResponse.data.items ?? []; + + return offerItems; + } catch (error: unknown) { + if (isAxiosError(error)) { + throw new AxiosErrorLoggable(error, 'VIDIS_GET_OFFER_ITEMS_FOR_SCHOOL_FAILED'); + } else { + throw error; + } + } + } +} diff --git a/apps/server/src/modules/school-license/service/media-school-license.service.spec.ts b/apps/server/src/modules/school-license/service/media-school-license.service.spec.ts index 8d3670120c..c5adf5990c 100644 --- a/apps/server/src/modules/school-license/service/media-school-license.service.spec.ts +++ b/apps/server/src/modules/school-license/service/media-school-license.service.spec.ts @@ -1,17 +1,34 @@ +import { Logger } from '@core/logger'; import { createMock, DeepMocked } from '@golevelup/ts-jest'; import { ObjectId } from '@mikro-orm/mongodb'; +import { MediaSourceDataFormat, MediaSourceService } from '@modules/media-source'; import { mediaSourceFactory } from '@modules/media-source/testing'; +import { SchoolService } from '@modules/school'; +import { FederalStateEntityMapper } from '@modules/school/repo/mikro-orm/mapper'; +import { schoolFactory } from '@modules/school/testing'; import { ExternalToolMedium } from '@modules/tool/external-tool/domain'; import { Test, TestingModule } from '@nestjs/testing'; +import { federalStateFactory } from '@testing/factory/federal-state.factory'; import { MediaSchoolLicense } from '../domain'; +import { SchoolLicenseType } from '../enum'; +import { + BuildMediaSchoolLicenseFailedLoggable, + FederalStateAbbreviationOfSchoolNotFoundLoggableException, + SchoolNumberNotFoundLoggableException, +} from '../loggable'; import { MEDIA_SCHOOL_LICENSE_REPO, MediaSchoolLicenseRepo } from '../repo'; -import { mediaSchoolLicenseFactory } from '../testing'; +import { mediaSchoolLicenseFactory, vidisOfferFactory } from '../testing'; +import { MediaSchoolLicenseFetchService } from './media-school-license-fetch.service'; import { MediaSchoolLicenseService } from './media-school-license.service'; describe(MediaSchoolLicenseService.name, () => { let module: TestingModule; let mediaSchoolLicenseService: MediaSchoolLicenseService; let mediaSchoolLicenseRepo: DeepMocked; + let schoolService: DeepMocked; + let logger: DeepMocked; + let mediaSourceService: DeepMocked; + let mediaSchoolLicenseFetchService: DeepMocked; beforeAll(async () => { module = await Test.createTestingModule({ @@ -21,11 +38,31 @@ describe(MediaSchoolLicenseService.name, () => { provide: MEDIA_SCHOOL_LICENSE_REPO, useValue: createMock(), }, + { + provide: SchoolService, + useValue: createMock(), + }, + { + provide: Logger, + useValue: createMock(), + }, + { + provide: MediaSourceService, + useValue: createMock(), + }, + { + provide: MediaSchoolLicenseFetchService, + useValue: createMock(), + }, ], }).compile(); mediaSchoolLicenseService = module.get(MediaSchoolLicenseService); mediaSchoolLicenseRepo = module.get(MEDIA_SCHOOL_LICENSE_REPO); + schoolService = module.get(SchoolService); + logger = module.get(Logger); + mediaSourceService = module.get(MediaSourceService); + mediaSchoolLicenseFetchService = module.get(MediaSchoolLicenseFetchService); }); afterAll(async () => { @@ -238,4 +275,279 @@ describe(MediaSchoolLicenseService.name, () => { }); }); }); + + describe('deleteAllBySchoolAndMediaSource', () => { + describe('when school id and media source id is given', () => { + const setup = () => { + const mediaSource = mediaSourceFactory.build(); + const school = schoolFactory.build(); + + return { + mediaSource, + school, + }; + }; + + it('should delete the media school license by media source', async () => { + const { mediaSource, school } = setup(); + + await mediaSchoolLicenseService.deleteAllBySchoolAndMediaSource(school.id, mediaSource.id); + + expect(mediaSchoolLicenseRepo.deleteAllBySchoolAndMediaSource).toBeCalledWith(school.id, mediaSource.id); + }); + }); + }); + + describe('updateMediaSchoolLicenses', () => { + describe('when school id is given', () => { + const setup = () => { + const federalStateEntity = federalStateFactory.build(); + const federalState = FederalStateEntityMapper.mapToDo(federalStateEntity); + const schoolId = new ObjectId().toHexString(); + const school = schoolFactory.build({ id: schoolId, federalState, officialSchoolNumber: '00100' }); + const mediaSource = mediaSourceFactory.build(); + const offersFromMediaSource = vidisOfferFactory.buildList(3); + + schoolService.getSchoolById.mockResolvedValue(school); + mediaSourceService.findByFormat.mockResolvedValue(mediaSource); + mediaSchoolLicenseFetchService.fetchOffersForSchoolFromVidis.mockResolvedValue(offersFromMediaSource); + mediaSchoolLicenseRepo.deleteAllBySchoolAndMediaSource.mockImplementation(); + mediaSchoolLicenseRepo.saveAll.mockImplementation(); + + return { + school, + mediaSource, + offersFromMediaSource, + }; + }; + + it('should call school service', async () => { + const { school } = setup(); + + await mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id); + + expect(schoolService.getSchoolById).toBeCalledWith(school.id); + }); + }); + + describe('when school without federal state was found', () => { + const setup = () => { + const schoolId = new ObjectId().toHexString(); + const school = schoolFactory.build({ id: schoolId, federalState: undefined, officialSchoolNumber: '00100' }); + + schoolService.getSchoolById.mockResolvedValue(school); + + return { + school, + }; + }; + + it('should throw FederalStateAbbreviationOfSchoolNotFoundLoggableException', async () => { + const { school } = setup(); + + await expect(mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id)).rejects.toThrow( + new FederalStateAbbreviationOfSchoolNotFoundLoggableException(school.id) + ); + }); + }); + + describe('when school with federal state abbreviation and official school number was found ', () => { + const setup = () => { + const federalStateEntity = federalStateFactory.build(); + const federalState = FederalStateEntityMapper.mapToDo(federalStateEntity); + const schoolId = new ObjectId().toHexString(); + const school = schoolFactory.build({ id: schoolId, federalState, officialSchoolNumber: '00100' }); + const mediaSource = mediaSourceFactory.build(); + const offersFromMediaSource = vidisOfferFactory.buildList(3); + + schoolService.getSchoolById.mockResolvedValue(school); + mediaSourceService.findByFormat.mockResolvedValue(mediaSource); + mediaSchoolLicenseFetchService.fetchOffersForSchoolFromVidis.mockResolvedValue(offersFromMediaSource); + + return { + school, + mediaSource, + offersFromMediaSource, + }; + }; + + it('should call mediaSourceService', async () => { + const { school } = setup(); + + await mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id); + + expect(mediaSourceService.findByFormat).toBeCalledWith(MediaSourceDataFormat.VIDIS); + }); + }); + + describe('when school with federal state abbreviation and without official school number was found ', () => { + const setup = () => { + const federalStateEntity = federalStateFactory.build(); + const federalState = FederalStateEntityMapper.mapToDo(federalStateEntity); + const school = schoolFactory.build({ officialSchoolNumber: undefined, federalState }); + + schoolService.getSchoolById.mockResolvedValue(school); + + return { + school, + }; + }; + + it('should throw SchoolNumberNotFoundLoggableException', async () => { + const { school } = setup(); + + await expect(mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id)).rejects.toThrow( + new SchoolNumberNotFoundLoggableException(school.id) + ); + }); + }); + + describe('when media source was found ', () => { + const setup = () => { + const federalStateEntity = federalStateFactory.build(); + const federalState = FederalStateEntityMapper.mapToDo(federalStateEntity); + const school = schoolFactory.build({ officialSchoolNumber: '00100', federalState }); + const mediaSource = mediaSourceFactory.build({ format: MediaSourceDataFormat.VIDIS }); + + schoolService.getSchoolById.mockResolvedValue(school); + mediaSourceService.findByFormat.mockResolvedValue(mediaSource); + + const schoolName = `${federalState.abbreviation}_${school.officialSchoolNumber ?? ''}`; + + return { + school, + mediaSource, + schoolName, + }; + }; + + it('should call mediaSchoolLicenseFetchService', async () => { + const { school, mediaSource, schoolName } = setup(); + + await mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id); + + expect(mediaSchoolLicenseFetchService.fetchOffersForSchoolFromVidis).toHaveBeenCalledWith( + mediaSource, + schoolName + ); + }); + }); + + describe('when fetching offers from media source was successful', () => { + const setup = () => { + const school = schoolFactory.build({ officialSchoolNumber: '00100' }); + const mediaSource = mediaSourceFactory.build({ format: MediaSourceDataFormat.VIDIS }); + const offersFromMediaSource = vidisOfferFactory.buildList(3); + + schoolService.getSchoolById.mockResolvedValue(school); + mediaSourceService.findByFormat.mockResolvedValue(mediaSource); + mediaSchoolLicenseFetchService.fetchOffersForSchoolFromVidis.mockResolvedValue(offersFromMediaSource); + mediaSchoolLicenseRepo.deleteAllBySchoolAndMediaSource.mockImplementation(); + mediaSchoolLicenseRepo.saveAll.mockImplementation(); + + return { + school, + mediaSource, + offersFromMediaSource, + }; + }; + + it('should delete all media school licences by school and media source', async () => { + const { school, mediaSource } = setup(); + + await mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id); + + expect(mediaSchoolLicenseRepo.deleteAllBySchoolAndMediaSource).toHaveBeenCalledWith(school.id, mediaSource.id); + }); + }); + + describe('when fetching offers from media source was successful and offers have an offerId', () => { + const setup = () => { + const school = schoolFactory.build({ officialSchoolNumber: '00100' }); + const mediaSource = mediaSourceFactory.withVidis().build({ format: MediaSourceDataFormat.VIDIS }); + const offersFromMediaSource = vidisOfferFactory.buildList(5, { offerId: 12345 }); + const mediaSchoolLicenses = mediaSchoolLicenseFactory.buildList(5, { + type: SchoolLicenseType.MEDIA_LICENSE, + mediaSource, + schoolId: school.id, + mediumId: '12345', + }); + + schoolService.getSchoolById.mockResolvedValue(school); + mediaSourceService.findByFormat.mockResolvedValue(mediaSource); + mediaSchoolLicenseFetchService.fetchOffersForSchoolFromVidis.mockResolvedValue(offersFromMediaSource); + mediaSchoolLicenseRepo.deleteAllBySchoolAndMediaSource.mockImplementation(); + mediaSchoolLicenseRepo.saveAll.mockImplementation(); + + return { + school, + mediaSource, + offersFromMediaSource, + mediaSchoolLicenses, + }; + }; + + it('should save all media school licences', async () => { + const { school, mediaSchoolLicenses, mediaSource } = setup(); + + await mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id); + + expect(mediaSchoolLicenseRepo.saveAll).toHaveBeenCalledWith( + expect.arrayContaining( + mediaSchoolLicenses.map((license) => + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + expect.objectContaining({ + ...license, + id: expect.any(String), + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + props: expect.objectContaining({ + id: expect.any(String), + mediaSource, + mediumId: mediaSchoolLicenses[0].mediumId, + schoolId: school.id, + type: SchoolLicenseType.MEDIA_LICENSE, + }), + }) + ) + ) + ); + }); + }); + + describe('when fetching offers from media source was successful and offers have no offerId ', () => { + const setup = () => { + const school = schoolFactory.build({ officialSchoolNumber: '00100' }); + const mediaSource = mediaSourceFactory.build(); + const offersFromMediaSource = vidisOfferFactory.buildList(3, { offerId: undefined }); + + schoolService.getSchoolById.mockResolvedValue(school); + mediaSourceService.findByFormat.mockResolvedValue(mediaSource); + mediaSchoolLicenseFetchService.fetchOffersForSchoolFromVidis.mockResolvedValue(offersFromMediaSource); + mediaSchoolLicenseRepo.deleteAllBySchoolAndMediaSource.mockImplementation(); + mediaSchoolLicenseRepo.saveAll.mockImplementation(); + + return { + school, + mediaSource, + offersFromMediaSource, + }; + }; + + it('should not save media school licenses', async () => { + const { school } = setup(); + + await mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id); + + expect(mediaSchoolLicenseRepo.saveAll).not.toHaveBeenCalled(); + }); + + it('should log info that medium id is missing', async () => { + const { school } = setup(); + + await mediaSchoolLicenseService.updateMediaSchoolLicenses(school.id); + + expect(logger.info).toHaveBeenCalledWith(new BuildMediaSchoolLicenseFailedLoggable()); + }); + }); + }); }); diff --git a/apps/server/src/modules/school-license/service/media-school-license.service.ts b/apps/server/src/modules/school-license/service/media-school-license.service.ts index 395aebe360..5708886855 100644 --- a/apps/server/src/modules/school-license/service/media-school-license.service.ts +++ b/apps/server/src/modules/school-license/service/media-school-license.service.ts @@ -1,11 +1,30 @@ +import { Logger } from '@core/logger'; +import { OfferDTO } from '@infra/vidis-client'; +import { ObjectId } from '@mikro-orm/mongodb'; +import { MediaSource, MediaSourceDataFormat, MediaSourceService } from '@modules/media-source'; +import { School, SchoolService } from '@modules/school'; import { ExternalToolMedium } from '@modules/tool/external-tool/domain/'; import { Inject } from '@nestjs/common'; import { EntityId } from '@shared/domain/types'; import { MediaSchoolLicense } from '../domain'; +import { SchoolLicenseType } from '../enum'; +import { + BuildMediaSchoolLicenseFailedLoggable, + FederalStateAbbreviationOfSchoolNotFoundLoggableException, + MediaSourceNotFoundLoggableException, + SchoolNumberNotFoundLoggableException, +} from '../loggable'; import { MEDIA_SCHOOL_LICENSE_REPO, MediaSchoolLicenseRepo } from '../repo'; +import { MediaSchoolLicenseFetchService } from './media-school-license-fetch.service'; export class MediaSchoolLicenseService { - constructor(@Inject(MEDIA_SCHOOL_LICENSE_REPO) private readonly mediaSchoolLicenseRepo: MediaSchoolLicenseRepo) {} + constructor( + @Inject(MEDIA_SCHOOL_LICENSE_REPO) private readonly mediaSchoolLicenseRepo: MediaSchoolLicenseRepo, + private readonly schoolService: SchoolService, + private readonly logger: Logger, + private readonly mediaSourceService: MediaSourceService, + private readonly mediaSchoolLicenseFetchService: MediaSchoolLicenseFetchService + ) {} public async deleteAllByMediaSource(mediaSourceId: EntityId): Promise { const deleteCount: number = await this.mediaSchoolLicenseRepo.deleteAllByMediaSource(mediaSourceId); @@ -36,4 +55,82 @@ export class MediaSchoolLicenseService { license.mediaSource?.sourceId === externalToolMedium.mediaSourceId ); } + + public async deleteAllBySchoolAndMediaSource(schoolId: EntityId, mediaSourceId: EntityId): Promise { + const deleteCount: number = await this.mediaSchoolLicenseRepo.deleteAllBySchoolAndMediaSource( + schoolId, + mediaSourceId + ); + + return deleteCount; + } + + public async updateMediaSchoolLicenses(schoolId: EntityId): Promise { + const school: School = await this.schoolService.getSchoolById(schoolId); + + const abbreviation: string | undefined = school.federalState?.abbreviation; + const { officialSchoolNumber } = school; + + if (!abbreviation) { + throw new FederalStateAbbreviationOfSchoolNotFoundLoggableException(schoolId); + } + + if (!officialSchoolNumber) { + throw new SchoolNumberNotFoundLoggableException(schoolId); + } + + const schoolName = `${abbreviation}_${officialSchoolNumber}`; + + const mediaSource: MediaSource | null = await this.mediaSourceService.findByFormat(MediaSourceDataFormat.VIDIS); + + if (!mediaSource) { + throw new MediaSourceNotFoundLoggableException(MediaSourceDataFormat.VIDIS); + } + + const offersFromMediaSource: OfferDTO[] = await this.mediaSchoolLicenseFetchService.fetchOffersForSchoolFromVidis( + mediaSource, + schoolName + ); + + await this.deleteAllBySchoolAndMediaSource(schoolId, mediaSource.id); + + await this.createLicenses(offersFromMediaSource, mediaSource, school); + } + + private buildMediaSchoolLicense( + school: School, + mediaSource: MediaSource, + mediumId: number | undefined + ): MediaSchoolLicense | null { + if (!mediumId) { + this.logger.info(new BuildMediaSchoolLicenseFailedLoggable()); + + return null; + } + + const license: MediaSchoolLicense = new MediaSchoolLicense({ + id: new ObjectId().toHexString(), + type: SchoolLicenseType.MEDIA_LICENSE, + schoolId: school.id, + mediaSource, + mediumId: mediumId.toString(), + }); + + return license; + } + + private async createLicenses(offers: OfferDTO[], mediaSource: MediaSource, school: School): Promise { + const newLicensesPromises: (MediaSchoolLicense | null)[] = offers.map((offer): MediaSchoolLicense | null => { + const newLicense: MediaSchoolLicense | null = this.buildMediaSchoolLicense(school, mediaSource, offer.offerId); + + return newLicense; + }); + + const newLicenses = await Promise.all(newLicensesPromises); + const filteredLicenses = newLicenses.filter((license): license is MediaSchoolLicense => license !== null); + + if (filteredLicenses.length) { + await this.saveAllMediaSchoolLicenses(filteredLicenses); + } + } } diff --git a/apps/server/src/modules/school-license/testing/index.ts b/apps/server/src/modules/school-license/testing/index.ts index a6cdca5358..69d22d095a 100644 --- a/apps/server/src/modules/school-license/testing/index.ts +++ b/apps/server/src/modules/school-license/testing/index.ts @@ -1,2 +1,3 @@ export { mediaSchoolLicenseFactory } from './media-school-license.factory'; export { mediaSchoolLicenseEntityFactory } from './media-school-license-entity.factory'; +export { vidisOfferFactory } from './vidis-offer.factory'; diff --git a/apps/server/src/modules/school-license/testing/vidis-offer.factory.ts b/apps/server/src/modules/school-license/testing/vidis-offer.factory.ts new file mode 100644 index 0000000000..686d4aac2e --- /dev/null +++ b/apps/server/src/modules/school-license/testing/vidis-offer.factory.ts @@ -0,0 +1,12 @@ +import { OfferDTO } from '@infra/vidis-client'; +import { Factory } from 'fishery'; + +export const vidisOfferFactory = Factory.define(({ sequence }) => { + return { + offerId: sequence, + schoolActivations: ['00100', '00200', '00300'], + offerDescription: 'Test Description', + offerTitle: 'VIDIS Test', + offerVersion: 1, + }; +}); diff --git a/apps/server/src/modules/school-license/uc/index.ts b/apps/server/src/modules/school-license/uc/index.ts new file mode 100644 index 0000000000..834a3217a4 --- /dev/null +++ b/apps/server/src/modules/school-license/uc/index.ts @@ -0,0 +1 @@ +export { MediaSchoolLicenseUc } from './media-school-license.uc'; diff --git a/apps/server/src/modules/school-license/uc/media-school-license.uc.spec.ts b/apps/server/src/modules/school-license/uc/media-school-license.uc.spec.ts new file mode 100644 index 0000000000..a90308d1c5 --- /dev/null +++ b/apps/server/src/modules/school-license/uc/media-school-license.uc.spec.ts @@ -0,0 +1,98 @@ +import { createMock, DeepMocked } from '@golevelup/ts-jest'; +import { UnauthorizedException } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import { Permission } from '@shared/domain/interface'; +import { AuthorizationService } from '@modules/authorization'; +import { schoolEntityFactory } from '@testing/factory/school-entity.factory'; +import { userFactory } from '@testing/factory/user.factory'; +import { setupEntities } from '@testing/setup-entities'; +import { MediaSchoolLicenseService } from '../service'; +import { MediaSchoolLicenseUc } from './media-school-license.uc'; + +describe(MediaSchoolLicenseUc.name, () => { + let module: TestingModule; + let uc: MediaSchoolLicenseUc; + let mediaSchoolLicenseService: DeepMocked; + let authorizationService: DeepMocked; + + beforeAll(async () => { + await setupEntities(); + + module = await Test.createTestingModule({ + providers: [ + MediaSchoolLicenseUc, + { + provide: MediaSchoolLicenseService, + useValue: createMock(), + }, + { + provide: AuthorizationService, + useValue: createMock(), + }, + ], + }).compile(); + + uc = module.get(MediaSchoolLicenseUc); + mediaSchoolLicenseService = module.get(MediaSchoolLicenseService); + authorizationService = module.get(AuthorizationService); + }); + + afterAll(async () => { + await module.close(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('updateMediaSchoolLicenses', () => { + describe('when current user and schoolId is given', () => { + describe('when current user has permission', () => { + const setup = () => { + const school = schoolEntityFactory.build(); + const user = userFactory.asAdmin([Permission.MEDIA_SCHOOL_LICENSE_ADMIN]).buildWithId({ school }); + + authorizationService.getUserWithPermissions.mockResolvedValue(user); + authorizationService.checkAllPermissions.mockImplementation(() => { + void Promise.resolve(); + }); + + return { + user, + }; + }; + + it('should call mediaSchoolService', async () => { + const { user } = setup(); + + await uc.updateMediaSchoolLicenses(user.id, user.school.id); + + expect(mediaSchoolLicenseService.updateMediaSchoolLicenses).toHaveBeenCalledWith(user.school.id); + }); + }); + + describe('when current user has no permission', () => { + const setup = () => { + const school = schoolEntityFactory.build(); + const user = userFactory.buildWithId({ school }); + + authorizationService.getUserWithPermissions.mockResolvedValue(user); + authorizationService.checkAllPermissions.mockImplementation(() => { + throw new UnauthorizedException(); + }); + + return { + user, + }; + }; + + it('should throw error', async () => { + const { user } = setup(); + + await expect(uc.updateMediaSchoolLicenses(user.id, user.school.id)).rejects.toThrow(UnauthorizedException); + expect(mediaSchoolLicenseService.updateMediaSchoolLicenses).not.toHaveBeenCalled(); + }); + }); + }); + }); +}); diff --git a/apps/server/src/modules/school-license/uc/media-school-license.uc.ts b/apps/server/src/modules/school-license/uc/media-school-license.uc.ts new file mode 100644 index 0000000000..7d6d551ad6 --- /dev/null +++ b/apps/server/src/modules/school-license/uc/media-school-license.uc.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@nestjs/common'; +import { User } from '@shared/domain/entity'; +import { Permission } from '@shared/domain/interface'; +import { EntityId } from '@shared/domain/types'; +import { AuthorizationService } from '@modules/authorization'; +import { MediaSchoolLicenseService } from '../service'; + +@Injectable() +export class MediaSchoolLicenseUc { + constructor( + private readonly mediaSchoolLicenseService: MediaSchoolLicenseService, + private readonly authorizationService: AuthorizationService + ) {} + + public async updateMediaSchoolLicenses(currentUserId: string, schoolId: EntityId): Promise { + const user: User = await this.authorizationService.getUserWithPermissions(currentUserId); + + this.authorizationService.checkAllPermissions(user, [Permission.MEDIA_SCHOOL_LICENSE_ADMIN]); + + await this.mediaSchoolLicenseService.updateMediaSchoolLicenses(schoolId); + } +} diff --git a/apps/server/src/modules/school/domain/do/federal-state.ts b/apps/server/src/modules/school/domain/do/federal-state.ts index eedc226356..7f7cbdeb1c 100644 --- a/apps/server/src/modules/school/domain/do/federal-state.ts +++ b/apps/server/src/modules/school/domain/do/federal-state.ts @@ -1,7 +1,11 @@ import { AuthorizableObject, DomainObject } from '@shared/domain/domain-object'; import { County } from './county'; -export class FederalState extends DomainObject {} +export class FederalState extends DomainObject { + get abbreviation(): string { + return this.props.abbreviation; + } +} export interface FederalStateProps extends AuthorizableObject { name: string; diff --git a/apps/server/src/modules/school/domain/do/school.ts b/apps/server/src/modules/school/domain/do/school.ts index a335dbe996..c3d446c57b 100644 --- a/apps/server/src/modules/school/domain/do/school.ts +++ b/apps/server/src/modules/school/domain/do/school.ts @@ -40,6 +40,10 @@ export class School extends DomainObject { return this.props.officialSchoolNumber; } + get federalState(): FederalState | undefined { + return this.props.federalState; + } + set ldapLastSync(ldapLastSync: string | undefined) { this.props.ldapLastSync = ldapLastSync; } diff --git a/apps/server/src/modules/server/server.app.module.ts b/apps/server/src/modules/server/server.app.module.ts index d41b5eeae7..7a2cd29acc 100644 --- a/apps/server/src/modules/server/server.app.module.ts +++ b/apps/server/src/modules/server/server.app.module.ts @@ -31,7 +31,6 @@ import { PseudonymApiModule } from '@modules/pseudonym/pseudonym-api.module'; import { RocketChatModule } from '@modules/rocketchat'; import { RoomApiModule } from '@modules/room/room-api.module'; import { RosterModule } from '@modules/roster/roster.module'; -import { SchoolLicenseModule } from '@modules/school-license/school-license.module'; import { SchoolApiModule } from '@modules/school/school-api.module'; import { SharingApiModule } from '@modules/sharing/sharing-api.module'; import { ShdApiModule } from '@modules/shd/shd.api.module'; @@ -50,6 +49,7 @@ import { ConfigModule } from '@nestjs/config'; import { createConfigModuleOptions } from '@shared/common/config-module-options'; import { defaultMikroOrmOptions } from '@shared/common/defaultMikroOrmOptions'; import { ALL_ENTITIES } from '@shared/domain/entity'; +import { SchoolLicenseApiModule } from '../school-license/school-license-api.module'; import { ServerConfigController, ServerController, ServerUc } from './api'; import { SERVER_CONFIG_TOKEN, serverConfig } from './server.config'; @@ -103,7 +103,7 @@ const serverModules = [ CollaborativeTextEditorApiModule, AlertModule, UserLicenseModule, - SchoolLicenseModule, + SchoolLicenseApiModule, RoomApiModule, RosterModule, ShdApiModule, diff --git a/apps/server/src/shared/domain/interface/permission.enum.ts b/apps/server/src/shared/domain/interface/permission.enum.ts index f677991d4a..2530c58733 100644 --- a/apps/server/src/shared/domain/interface/permission.enum.ts +++ b/apps/server/src/shared/domain/interface/permission.enum.ts @@ -78,6 +78,7 @@ export enum Permission { LESSONS_CREATE = 'LESSONS_CREATE', LESSONS_VIEW = 'LESSONS_VIEW', LINK_CREATE = 'LINK_CREATE', + MEDIA_SCHOOL_LICENSE_ADMIN = 'MEDIA_SCHOOL_LICENSE_ADMIN', NEWS_CREATE = 'NEWS_CREATE', NEWS_EDIT = 'NEWS_EDIT', NEWS_VIEW = 'NEWS_VIEW', diff --git a/backup/setup/migrations.json b/backup/setup/migrations.json index f7a693c2cc..8e6685c071 100644 --- a/backup/setup/migrations.json +++ b/backup/setup/migrations.json @@ -349,5 +349,14 @@ "created_at": { "$date": "2025-01-20T13:24:10.786Z" } + }, + { + "_id": { + "$oid": "679008937c51ba759ad4617a" + }, + "name": "Migration20250121203707", + "created_at": { + "$date": "2025-01-21T20:50:27.535Z" + } } ] diff --git a/backup/setup/roles.json b/backup/setup/roles.json index 8e23aeb9e5..a94befa049 100644 --- a/backup/setup/roles.json +++ b/backup/setup/roles.json @@ -139,7 +139,8 @@ "GROUP_FULL_ADMIN", "SCHOOL_SYSTEM_EDIT", "SCHOOL_SYSTEM_VIEW", - "USER_CHANGE_OWN_NAME" + "USER_CHANGE_OWN_NAME", + "MEDIA_SCHOOL_LICENSE_ADMIN" ], "__v": 2 }, diff --git a/openapitools.json b/openapitools.json index d55223b9aa..37c4a83372 100644 --- a/openapitools.json +++ b/openapitools.json @@ -139,7 +139,7 @@ "skipValidateSpec": true, "enablePostProcessFile": true, "openapiNormalizer": { - "FILTER": "operationId:getActivatedOffersByRegion" + "FILTER": "operationId:getActivatedOffersByRegion|operationId:getActivatedOffersBySchool" }, "additionalProperties": { "apiPackage": "api",