diff --git a/package-lock.json b/package-lock.json index 134b8ac..6ddb3ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,9 +23,10 @@ "@adobe/spacecat-shared-rum-api-client": "2.40.4", "@adobe/spacecat-shared-scrape-client": "2.3.6", "@adobe/spacecat-shared-slack-client": "1.5.32", - "@adobe/spacecat-shared-utils": "1.87.0", + "@adobe/spacecat-shared-utils": "https://gist.github.com/tkotthakota-adobe/655342ca8fe806db4e508761465becb2/raw/72a22c19f8a596650493990d8443238466f0d224/adobe-spacecat-shared-utils-1.87.0.tgz", "@aws-sdk/client-cloudwatch-logs": "3.966.0", "@aws-sdk/client-lambda": "3.966.0", + "@aws-sdk/client-s3": "3.966.0", "@aws-sdk/client-sqs": "3.966.0", "@aws-sdk/credential-provider-node": "3.966.0", "aws-xray-sdk": "3.12.0", @@ -551,67 +552,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.957.0.tgz", - "integrity": "sha512-iczcn/QRIBSpvsdAS/rbzmoBpleX1JBjXvCynMbDceVLBIcVrwT1hXECrhtIC2cjh4HaLo9ClAbiOiWuqt+6MA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@aws-sdk/util-arn-parser": "3.957.0", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", - "@smithy/util-config-provider": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.957.0.tgz", - "integrity": "sha512-AlbK3OeVNwZZil0wlClgeI/ISlOt/SPUxBsIns876IFaVu/Pj3DgImnYhpcJuFRek4r4XM51xzIaGQXM6GDHGg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.957.0.tgz", - "integrity": "sha512-iJpeVR5V8se1hl2pt+k8bF/e9JO4KWgPCMjg8BtRspNtKIUGy7j6msYvbDixaKZaF2Veg9+HoYcOhwnZumjXSA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.957.0", - "@aws-sdk/crc64-nvme": "3.957.0", - "@aws-sdk/types": "3.957.0", - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-stream": "^4.5.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-host-header": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.957.0.tgz", @@ -628,21 +568,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.957.0.tgz", - "integrity": "sha512-y8/W7TOQpmDJg/fPYlqAhwA4+I15LrS7TwgUEoxogtkD8gfur9wFMRLT8LCyc9o4NMEcAnK50hSb4+wB0qv6tQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-logger": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.957.0.tgz", @@ -675,47 +600,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.957.0.tgz", - "integrity": "sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.957.0", - "@aws-sdk/types": "3.957.0", - "@aws-sdk/util-arn-parser": "3.957.0", - "@smithy/core": "^3.20.0", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/signature-v4": "^5.3.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-stream": "^4.5.8", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/middleware-ssec": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.957.0.tgz", - "integrity": "sha512-qwkmrK0lizdjNt5qxl4tHYfASh8DFpHXM1iDVo+qHe+zuslfMqQEGRkzxS8tJq/I+8F0c6v3IKOveKJAfIvfqQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/nested-clients": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.957.0.tgz", @@ -783,24 +667,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.957.0.tgz", - "integrity": "sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.957.0", - "@aws-sdk/types": "3.957.0", - "@smithy/protocol-http": "^5.3.7", - "@smithy/signature-v4": "^5.3.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/token-providers": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", @@ -834,19 +700,6 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.957.0.tgz", - "integrity": "sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@adobe/helix-deploy/node_modules/@aws-sdk/util-endpoints": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz", @@ -877,156 +730,1585 @@ "tslib": "^2.6.2" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/config-resolver": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", - "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", - "dev": true, + "node_modules/@adobe/helix-log": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@adobe/helix-log/-/helix-log-6.0.6.tgz", + "integrity": "sha512-gPMhGA6P1L6u2I6V84quEkywmD8WHJqzUrr89/Mu//Za78UVlEbG2snWiqXyMMZhK6UNqweAWQsM9xWmdvI1ig==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.7", - "@smithy/util-middleware": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "big.js": "^7.0.0", + "colorette": "^2.0.2", + "ferrum": "^1.9.3", + "phin": "^3.7.0", + "polka": "^0.5.2" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/credential-provider-imds": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", - "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", + "node_modules/@adobe/helix-shared-async": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@adobe/helix-shared-async/-/helix-shared-async-2.0.2.tgz", + "integrity": "sha512-I510DKZI7Vf1ikqm9asKN5ZG9oEEx6VQpttdtzM1BGkrXWA7t/QeG6O54TLKGYMXDhdhpH+8kaleS3OfhQyDOQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@adobe/helix-shared-process-queue": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@adobe/helix-shared-process-queue/-/helix-shared-process-queue-3.1.4.tgz", + "integrity": "sha512-u1dmRDhJgOjZ4i05lSnKk0lNY5LtExq3TjYMaTcIQt00sFU6IxtOcvj0qhwahyhIKL+9gkvqEd4jVrT7oogi4g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@adobe/helix-shared-async": "2.0.2" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/eventstream-codec": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.7.tgz", - "integrity": "sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ==", - "dev": true, + "node_modules/@adobe/helix-shared-secrets": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@adobe/helix-shared-secrets/-/helix-shared-secrets-2.3.0.tgz", + "integrity": "sha512-eSztnig3KWmyDBfMreaV8zTjWSu9MBVj3hhfIs+Ufs5isrXZag6om/uoB+DQArqADjbKtJHP8yXe8VWu34jvXQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.11.0", - "@smithy/util-hex-encoding": "^4.2.0", - "tslib": "^2.6.2" + "@adobe/fetch": "^4.1.3", + "@adobe/helix-shared-wrap": "^1.0.5", + "aws4": "^1.12.0" }, - "engines": { - "node": ">=18.0.0" + "optionalDependencies": { + "@adobe/helix-universal": "^5.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.7.tgz", - "integrity": "sha512-ujzPk8seYoDBmABDE5YqlhQZAXLOrtxtJLrbhHMKjBoG5b4dK4i6/mEU+6/7yXIAkqOO8sJ6YxZl+h0QQ1IJ7g==", - "dev": true, + "node_modules/@adobe/helix-shared-secrets/node_modules/@adobe/helix-shared-wrap": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@adobe/helix-shared-wrap/-/helix-shared-wrap-1.0.5.tgz", + "integrity": "sha512-g8bap0KhWI6Y6USlf9Se4t+Og0A6udYkoQH2NBdj/HOLnLozwn+60wbVLJhHIW2Ldt81xmhBqjhW0j1BtCQ3uw==", + "license": "Apache-2.0" + }, + "node_modules/@adobe/helix-shared-wrap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@adobe/helix-shared-wrap/-/helix-shared-wrap-2.0.2.tgz", + "integrity": "sha512-5cjL0LtqTp7YG6SaYOeW3t+/aRD1DDKhgt6zQKoeoVkpPKo5EsnDDbGUL4naYlxzOnpBx7FdERX6fUA4Kd+T1w==", + "license": "Apache-2.0" + }, + "node_modules/@adobe/helix-status": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/@adobe/helix-status/-/helix-status-10.1.5.tgz", + "integrity": "sha512-uJG32d5cZjVU37BRNiQeIfH9ut3kypUQfheJ6edVBcKS9Ggd35R3sDpi3hdDbY3/9M5UOMl6b4j65ezdEzeUgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@adobe/fetch": "^4.1.10" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.7.tgz", - "integrity": "sha512-x7BtAiIPSaNaWuzm24Q/mtSkv+BrISO/fmheiJ39PKRNH3RmH2Hph/bUKSOBOBC9unqfIYDhKTHwpyZycLGPVQ==", - "dev": true, + "node_modules/@adobe/helix-universal": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@adobe/helix-universal/-/helix-universal-5.3.0.tgz", + "integrity": "sha512-1eKFpKZMNamJHhq6eFm9gMLhgQunsf34mEFbaqg9ChEXZYk18SYgUu5GeNTvzk5Rzo0h9AuSwLtnI2Up2OSiSA==", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@adobe/fetch": "4.2.3", + "aws4": "1.13.2" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.7.tgz", - "integrity": "sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A==", + "node_modules/@adobe/helix-universal-devserver": { + "version": "1.1.145", + "resolved": "https://registry.npmjs.org/@adobe/helix-universal-devserver/-/helix-universal-devserver-1.1.145.tgz", + "integrity": "sha512-22v9zmyP5iCUb9QXawpn2FPVo2HbZ8rDEOB0RJgxoecQUbSqEKPtdtJ0q3rESCPlPU4toOffRUuLYSuFJsiAVw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.7", - "@smithy/types": "^4.11.0", + "@adobe/helix-deploy": "^13.0.0", + "@adobe/helix-universal": "^5.1.0", + "express": "5.2.1", + "fs-extra": "11.3.3" + } + }, + "node_modules/@adobe/helix-universal-logger": { + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/@adobe/helix-universal-logger/-/helix-universal-logger-3.0.28.tgz", + "integrity": "sha512-Qg3GirQUifeSxX1IDgHDwIjVtsVCef49MCfoi8EWI9eu+/MDNPQS7uLqZjMin8Fm0lLyzi5owmEk/8g6sDPsAA==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/helix-log": "6.0.6" + } + }, + "node_modules/@adobe/rum-distiller": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/@adobe/rum-distiller/-/rum-distiller-1.22.2.tgz", + "integrity": "sha512-DOql+UjLOleYflCSzSI1DBBpO1zTah8D+wlMcGsDVRMOyedpBr8NGqktw8OW0JBQnFWGUidNK4E8REjsjCK5BA==", + "license": "Apache-2.0" + }, + "node_modules/@adobe/semantic-release-coralogix": { + "version": "1.1.40", + "resolved": "https://registry.npmjs.org/@adobe/semantic-release-coralogix/-/semantic-release-coralogix-1.1.40.tgz", + "integrity": "sha512-2IcRtz6RdZxPkoyEho2fZJg/5vzyY9ixqlPVpnPhb3OJnhZIn/V56HXHA//5UA4UJOutNr69XDKdU4kCAZ6gtQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@semantic-release/error": "4.0.0" + } + }, + "node_modules/@adobe/semantic-release-skms-cmr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@adobe/semantic-release-skms-cmr/-/semantic-release-skms-cmr-1.1.5.tgz", + "integrity": "sha512-LuJrWzL1Mh+r2IQ6AWOxXsBX3QLTZTibB9L6sMtLBcL+4Ry6Z1i7eYgIlb1g2dXVf3xZyxVZCfn0AhQqKIWHXQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.1.9", + "cookie": "0.7.2" + } + }, + "node_modules/@adobe/spacecat-shared-data-access": { + "version": "2.93.0", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-data-access/-/spacecat-shared-data-access-2.93.0.tgz", + "integrity": "sha512-BnxhC/FGiawigo+a0yDhWS0WL4zyg8UnwDVQB+p8noNY0WBksbZRZxYnVTa4Mnid8UFmDBadqO6uKLZ3TkUrNQ==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/spacecat-shared-utils": "1.81.1", + "@aws-sdk/client-dynamodb": "3.940.0", + "@aws-sdk/client-s3": "^3.940.0", + "@aws-sdk/lib-dynamodb": "3.940.0", + "@types/joi": "17.2.3", + "aws-xray-sdk": "3.12.0", + "electrodb": "3.5.0", + "joi": "18.0.2", + "pluralize": "8.0.0" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@adobe/spacecat-shared-utils": { + "version": "1.81.1", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", + "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@aws-sdk/client-s3": "3.940.0", + "@aws-sdk/client-sqs": "3.940.0", + "@json2csv/plainjs": "7.0.6", + "aws-xray-sdk": "3.12.0", + "cheerio": "1.1.2", + "date-fns": "4.1.0", + "franc-min": "6.2.0", + "iso-639-3": "3.0.1", + "validator": "^13.15.15", + "world-countries": "5.1.0", + "zod": "^4.1.11" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/client-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", + "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.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/client-sqs": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", + "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-sqs": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/core": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", + "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", + "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.940.0", + "@aws-sdk/credential-provider-http": "3.940.0", + "@aws-sdk/credential-provider-ini": "3.940.0", + "@aws-sdk/credential-provider-process": "3.940.0", + "@aws-sdk/credential-provider-sso": "3.940.0", + "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", + "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", + "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@adobe/spacecat-shared-google-client": { + "version": "1.4.62", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-google-client/-/spacecat-shared-google-client-1.4.62.tgz", + "integrity": "sha512-j40IBJPgIKwo6fARmZwGeONtnP7UXAL4dG9VER5UwDirhddXPn5MW2zjuBLZdcQuKI/0RXGxeOiDbTchri5cBQ==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/helix-universal": "5.3.0", + "@adobe/spacecat-shared-http-utils": "1.19.3", + "@adobe/spacecat-shared-utils": "1.81.1", + "@aws-sdk/client-secrets-manager": "3.940.0", + "aws-xray-sdk": "3.12.0", + "google-auth-library": "10.5.0", + "googleapis": "164.1.0" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@adobe/spacecat-shared-http-utils": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-http-utils/-/spacecat-shared-http-utils-1.19.3.tgz", + "integrity": "sha512-4ZD+dSxXXs7WsDybX120FNNTOfjntw+FvkrzggU5BwkkOXJWxINM0i6V30RjecfZRyPz8ndtFaRSmLQTo60Kyw==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/spacecat-shared-data-access": "2.88.5", + "@adobe/spacecat-shared-utils": "1.81.1", + "jose": "6.1.2" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@adobe/spacecat-shared-utils": { + "version": "1.81.1", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", + "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@aws-sdk/client-s3": "3.940.0", + "@aws-sdk/client-sqs": "3.940.0", + "@json2csv/plainjs": "7.0.6", + "aws-xray-sdk": "3.12.0", + "cheerio": "1.1.2", + "date-fns": "4.1.0", + "franc-min": "6.2.0", + "iso-639-3": "3.0.1", + "validator": "^13.15.15", + "world-countries": "5.1.0", + "zod": "^4.1.11" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/client-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", + "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.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/client-secrets-manager": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.940.0.tgz", + "integrity": "sha512-fpxSRsGyuXmyNqEwdGJUDWVgN0v8xR7tr32Quls3K+HnYlnBGFmISu5Pcc+BfwmrZHnPaVpPc+S3PUzTnFpOJg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/client-sqs": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", + "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-sqs": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/core": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", + "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", + "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.940.0", + "@aws-sdk/credential-provider-http": "3.940.0", + "@aws-sdk/credential-provider-ini": "3.940.0", + "@aws-sdk/credential-provider-process": "3.940.0", + "@aws-sdk/credential-provider-sso": "3.940.0", + "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", + "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", + "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-gpt-client/-/spacecat-shared-gpt-client-1.6.15.tgz", + "integrity": "sha512-SLMNrEWMsGBvUQ4X+fzm3GF8aSoOH1yNAjQacJaobuUoYKu0rT91WSk1zszz8A8URvfXvFDaIFjBb+TP1q8soA==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/helix-universal": "5.3.0", + "@adobe/spacecat-shared-ims-client": "1.11.6", + "@adobe/spacecat-shared-utils": "1.81.1" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@adobe/spacecat-shared-ims-client": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-ims-client/-/spacecat-shared-ims-client-1.11.6.tgz", + "integrity": "sha512-tmCpHVDUHyTjHowm+c6Mrsclyoa86hXDkUqClvnTSrRHWINJHZl2wyEQcsmpugKjTyzu8u94lEDlKs50d4AVZg==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/helix-universal": "5.3.0", + "@adobe/spacecat-shared-data-access": "2.88.5", + "@adobe/spacecat-shared-utils": "1.81.1", + "@aws-sdk/client-secrets-manager": "3.940.0", + "aws-xray-sdk": "3.12.0" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@adobe/spacecat-shared-utils": { + "version": "1.81.1", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", + "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@aws-sdk/client-s3": "3.940.0", + "@aws-sdk/client-sqs": "3.940.0", + "@json2csv/plainjs": "7.0.6", + "aws-xray-sdk": "3.12.0", + "cheerio": "1.1.2", + "date-fns": "4.1.0", + "franc-min": "6.2.0", + "iso-639-3": "3.0.1", + "validator": "^13.15.15", + "world-countries": "5.1.0", + "zod": "^4.1.11" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/client-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", + "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.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/client-secrets-manager": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.940.0.tgz", + "integrity": "sha512-fpxSRsGyuXmyNqEwdGJUDWVgN0v8xR7tr32Quls3K+HnYlnBGFmISu5Pcc+BfwmrZHnPaVpPc+S3PUzTnFpOJg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/client-sqs": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", + "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-sqs": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/core": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", + "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", + "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.940.0", + "@aws-sdk/credential-provider-http": "3.940.0", + "@aws-sdk/credential-provider-ini": "3.940.0", + "@aws-sdk/credential-provider-process": "3.940.0", + "@aws-sdk/credential-provider-sso": "3.940.0", + "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", + "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.7.tgz", - "integrity": "sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g==", - "dev": true, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.2.7", - "@smithy/types": "^4.11.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/hash-blob-browser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.8.tgz", - "integrity": "sha512-07InZontqsM1ggTCPSRgI7d8DirqRrnpL7nIACT4PW0AWrgDiHhjGZzbAE5UtRSiU0NISGUYe7/rri9ZeWyDpw==", - "dev": true, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", "license": "Apache-2.0", "dependencies": { - "@smithy/chunked-blob-reader": "^5.2.0", - "@smithy/chunked-blob-reader-native": "^4.2.1", - "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/hash-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", - "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", - "dev": true, + "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", + "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", - "@smithy/util-buffer-from": "^4.2.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@adobe/spacecat-shared-http-utils": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-http-utils/-/spacecat-shared-http-utils-1.19.4.tgz", + "integrity": "sha512-P7iw/KYUtRmjLR6ZEFsf+1RPuoZkaN3sZUfZigQpH0JWJlhbSehTHMBC29yrGhvYrgEA4ssLu5S0F4tRhcq3xg==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/spacecat-shared-data-access": "2.88.7", + "@adobe/spacecat-shared-utils": "1.81.1", + "jose": "6.1.2" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@adobe/spacecat-shared-utils": { + "version": "1.81.1", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", + "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", + "license": "Apache-2.0", + "dependencies": { + "@adobe/fetch": "4.2.3", + "@aws-sdk/client-s3": "3.940.0", + "@aws-sdk/client-sqs": "3.940.0", + "@json2csv/plainjs": "7.0.6", + "aws-xray-sdk": "3.12.0", + "cheerio": "1.1.2", + "date-fns": "4.1.0", + "franc-min": "6.2.0", + "iso-639-3": "3.0.1", + "validator": "^13.15.15", + "world-countries": "5.1.0", + "zod": "^4.1.11" + }, + "engines": { + "node": ">=22.0.0 <25.0.0", + "npm": ">=10.9.0 <12.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/client-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", + "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.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/hash-stream-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.7.tgz", - "integrity": "sha512-ZQVoAwNYnFMIbd4DUc517HuwNelJUY6YOzwqrbcAgCnVn+79/OK7UjwA93SPpdTOpKDVkLIzavWm/Ck7SmnDPQ==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/client-sqs": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", + "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-sqs": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -1034,297 +2316,253 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/invalid-dependency": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", - "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/core": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", + "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", + "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.940.0", + "@aws-sdk/credential-provider-http": "3.940.0", + "@aws-sdk/credential-provider-ini": "3.940.0", + "@aws-sdk/credential-provider-process": "3.940.0", + "@aws-sdk/credential-provider-sso": "3.940.0", + "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/md5-js": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.7.tgz", - "integrity": "sha512-Wv6JcUxtOLTnxvNjDnAiATUsk8gvA6EeS8zzHig07dotpByYsLot+m0AaQEniUBjx97AC41MQR4hW0baraD1Xw==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/middleware-content-length": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", - "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/middleware-retry": { - "version": "4.4.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.17.tgz", - "integrity": "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/service-error-classification": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-retry": "^4.2.7", - "@smithy/uuid": "^1.1.0", + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/service-error-classification": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", - "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0" + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.16.tgz", - "integrity": "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.19.tgz", - "integrity": "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.5", - "@smithy/credential-provider-imds": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/util-retry": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", - "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", + "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.7", - "@smithy/types": "^4.11.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-deploy/node_modules/@smithy/util-waiter": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.7.tgz", - "integrity": "sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.7", - "@smithy/types": "^4.11.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/helix-log": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@adobe/helix-log/-/helix-log-6.0.6.tgz", - "integrity": "sha512-gPMhGA6P1L6u2I6V84quEkywmD8WHJqzUrr89/Mu//Za78UVlEbG2snWiqXyMMZhK6UNqweAWQsM9xWmdvI1ig==", - "license": "Apache-2.0", - "dependencies": { - "big.js": "^7.0.0", - "colorette": "^2.0.2", - "ferrum": "^1.9.3", - "phin": "^3.7.0", - "polka": "^0.5.2" - } - }, - "node_modules/@adobe/helix-shared-async": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@adobe/helix-shared-async/-/helix-shared-async-2.0.2.tgz", - "integrity": "sha512-I510DKZI7Vf1ikqm9asKN5ZG9oEEx6VQpttdtzM1BGkrXWA7t/QeG6O54TLKGYMXDhdhpH+8kaleS3OfhQyDOQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@adobe/helix-shared-process-queue": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@adobe/helix-shared-process-queue/-/helix-shared-process-queue-3.1.4.tgz", - "integrity": "sha512-u1dmRDhJgOjZ4i05lSnKk0lNY5LtExq3TjYMaTcIQt00sFU6IxtOcvj0qhwahyhIKL+9gkvqEd4jVrT7oogi4g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@adobe/helix-shared-async": "2.0.2" - } - }, - "node_modules/@adobe/helix-shared-secrets": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@adobe/helix-shared-secrets/-/helix-shared-secrets-2.3.0.tgz", - "integrity": "sha512-eSztnig3KWmyDBfMreaV8zTjWSu9MBVj3hhfIs+Ufs5isrXZag6om/uoB+DQArqADjbKtJHP8yXe8VWu34jvXQ==", + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", "license": "Apache-2.0", "dependencies": { - "@adobe/fetch": "^4.1.3", - "@adobe/helix-shared-wrap": "^1.0.5", - "aws4": "^1.12.0" + "tslib": "^2.6.2" }, - "optionalDependencies": { - "@adobe/helix-universal": "^5.0.0" - } - }, - "node_modules/@adobe/helix-shared-secrets/node_modules/@adobe/helix-shared-wrap": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@adobe/helix-shared-wrap/-/helix-shared-wrap-1.0.5.tgz", - "integrity": "sha512-g8bap0KhWI6Y6USlf9Se4t+Og0A6udYkoQH2NBdj/HOLnLozwn+60wbVLJhHIW2Ldt81xmhBqjhW0j1BtCQ3uw==", - "license": "Apache-2.0" - }, - "node_modules/@adobe/helix-shared-wrap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@adobe/helix-shared-wrap/-/helix-shared-wrap-2.0.2.tgz", - "integrity": "sha512-5cjL0LtqTp7YG6SaYOeW3t+/aRD1DDKhgt6zQKoeoVkpPKo5EsnDDbGUL4naYlxzOnpBx7FdERX6fUA4Kd+T1w==", - "license": "Apache-2.0" - }, - "node_modules/@adobe/helix-status": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@adobe/helix-status/-/helix-status-10.1.5.tgz", - "integrity": "sha512-uJG32d5cZjVU37BRNiQeIfH9ut3kypUQfheJ6edVBcKS9Ggd35R3sDpi3hdDbY3/9M5UOMl6b4j65ezdEzeUgQ==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "^4.1.10" - } - }, - "node_modules/@adobe/helix-universal": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@adobe/helix-universal/-/helix-universal-5.3.0.tgz", - "integrity": "sha512-1eKFpKZMNamJHhq6eFm9gMLhgQunsf34mEFbaqg9ChEXZYk18SYgUu5GeNTvzk5Rzo0h9AuSwLtnI2Up2OSiSA==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "aws4": "1.13.2" - } - }, - "node_modules/@adobe/helix-universal-devserver": { - "version": "1.1.145", - "resolved": "https://registry.npmjs.org/@adobe/helix-universal-devserver/-/helix-universal-devserver-1.1.145.tgz", - "integrity": "sha512-22v9zmyP5iCUb9QXawpn2FPVo2HbZ8rDEOB0RJgxoecQUbSqEKPtdtJ0q3rESCPlPU4toOffRUuLYSuFJsiAVw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@adobe/helix-deploy": "^13.0.0", - "@adobe/helix-universal": "^5.1.0", - "express": "5.2.1", - "fs-extra": "11.3.3" - } - }, - "node_modules/@adobe/helix-universal-logger": { - "version": "3.0.28", - "resolved": "https://registry.npmjs.org/@adobe/helix-universal-logger/-/helix-universal-logger-3.0.28.tgz", - "integrity": "sha512-Qg3GirQUifeSxX1IDgHDwIjVtsVCef49MCfoi8EWI9eu+/MDNPQS7uLqZjMin8Fm0lLyzi5owmEk/8g6sDPsAA==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "@adobe/helix-log": "6.0.6" - } - }, - "node_modules/@adobe/rum-distiller": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@adobe/rum-distiller/-/rum-distiller-1.22.2.tgz", - "integrity": "sha512-DOql+UjLOleYflCSzSI1DBBpO1zTah8D+wlMcGsDVRMOyedpBr8NGqktw8OW0JBQnFWGUidNK4E8REjsjCK5BA==", - "license": "Apache-2.0" - }, - "node_modules/@adobe/semantic-release-coralogix": { - "version": "1.1.40", - "resolved": "https://registry.npmjs.org/@adobe/semantic-release-coralogix/-/semantic-release-coralogix-1.1.40.tgz", - "integrity": "sha512-2IcRtz6RdZxPkoyEho2fZJg/5vzyY9ixqlPVpnPhb3OJnhZIn/V56HXHA//5UA4UJOutNr69XDKdU4kCAZ6gtQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "@semantic-release/error": "4.0.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@adobe/semantic-release-skms-cmr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@adobe/semantic-release-skms-cmr/-/semantic-release-skms-cmr-1.1.5.tgz", - "integrity": "sha512-LuJrWzL1Mh+r2IQ6AWOxXsBX3QLTZTibB9L6sMtLBcL+4Ry6Z1i7eYgIlb1g2dXVf3xZyxVZCfn0AhQqKIWHXQ==", - "dev": true, + "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", + "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", "license": "Apache-2.0", "dependencies": { - "@adobe/fetch": "4.1.9", - "cookie": "0.7.2" + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@adobe/spacecat-shared-data-access": { - "version": "2.93.0", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-data-access/-/spacecat-shared-data-access-2.93.0.tgz", - "integrity": "sha512-BnxhC/FGiawigo+a0yDhWS0WL4zyg8UnwDVQB+p8noNY0WBksbZRZxYnVTa4Mnid8UFmDBadqO6uKLZ3TkUrNQ==", + "node_modules/@adobe/spacecat-shared-ims-client": { + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-ims-client/-/spacecat-shared-ims-client-1.11.8.tgz", + "integrity": "sha512-nZOfEp3zN3i6mWZZIcwHZqCL2Qj+9nPwmw2BMSFzShJbApf7uCRhdiZagGKmOTY/OgzP+9KrXAFsozxlt3azhQ==", "license": "Apache-2.0", "dependencies": { + "@adobe/fetch": "4.2.3", + "@adobe/helix-universal": "5.3.0", + "@adobe/spacecat-shared-data-access": "2.88.7", "@adobe/spacecat-shared-utils": "1.81.1", - "@aws-sdk/client-dynamodb": "3.940.0", - "@aws-sdk/client-s3": "^3.940.0", - "@aws-sdk/lib-dynamodb": "3.940.0", - "@types/joi": "17.2.3", - "aws-xray-sdk": "3.12.0", - "electrodb": "3.5.0", - "joi": "18.0.2", - "pluralize": "8.0.0" + "@aws-sdk/client-secrets-manager": "3.940.0", + "aws-xray-sdk": "3.12.0" }, "engines": { "node": ">=22.0.0 <25.0.0", "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -1348,7 +2586,123 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-s3": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", + "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.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.940.0.tgz", + "integrity": "sha512-fpxSRsGyuXmyNqEwdGJUDWVgN0v8xR7tr32Quls3K+HnYlnBGFmISu5Pcc+BfwmrZHnPaVpPc+S3PUzTnFpOJg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.940.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.940.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -1380,19 +2734,123 @@ "@smithy/middleware-serde": "^4.2.6", "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/core": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", + "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", + "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.940.0", + "@aws-sdk/credential-provider-http": "3.940.0", + "@aws-sdk/credential-provider-ini": "3.940.0", + "@aws-sdk/credential-provider-process": "3.940.0", + "@aws-sdk/credential-provider-sso": "3.940.0", + "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -1400,23 +2858,38 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", + "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.18.5", "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", + "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -1424,22 +2897,13 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", - "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.940.0", - "@aws-sdk/credential-provider-http": "3.940.0", - "@aws-sdk/credential-provider-ini": "3.940.0", - "@aws-sdk/credential-provider-process": "3.940.0", - "@aws-sdk/credential-provider-sso": "3.940.0", - "@aws-sdk/credential-provider-web-identity": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -1447,7 +2911,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", @@ -1465,7 +2929,36 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-data-access/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", @@ -1489,43 +2982,26 @@ } } }, - "node_modules/@adobe/spacecat-shared-google-client": { - "version": "1.4.62", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-google-client/-/spacecat-shared-google-client-1.4.62.tgz", - "integrity": "sha512-j40IBJPgIKwo6fARmZwGeONtnP7UXAL4dG9VER5UwDirhddXPn5MW2zjuBLZdcQuKI/0RXGxeOiDbTchri5cBQ==", + "node_modules/@adobe/spacecat-shared-rum-api-client": { + "version": "2.40.4", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-rum-api-client/-/spacecat-shared-rum-api-client-2.40.4.tgz", + "integrity": "sha512-x6BW8ql+yD3drzgea0Px2kS8qdzVqVaTLgE7MVski+W1BgvrD1mU6/VkSXdkDP4H9mE85OQ+c0jIpVkG70ITEA==", "license": "Apache-2.0", "dependencies": { "@adobe/fetch": "4.2.3", + "@adobe/helix-shared-wrap": "2.0.2", "@adobe/helix-universal": "5.3.0", - "@adobe/spacecat-shared-http-utils": "1.19.3", - "@adobe/spacecat-shared-utils": "1.81.1", - "@aws-sdk/client-secrets-manager": "3.940.0", - "aws-xray-sdk": "3.12.0", - "google-auth-library": "10.5.0", - "googleapis": "164.1.0" - }, - "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-google-client/node_modules/@adobe/spacecat-shared-http-utils": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-http-utils/-/spacecat-shared-http-utils-1.19.3.tgz", - "integrity": "sha512-4ZD+dSxXXs7WsDybX120FNNTOfjntw+FvkrzggU5BwkkOXJWxINM0i6V30RjecfZRyPz8ndtFaRSmLQTo60Kyw==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "@adobe/spacecat-shared-data-access": "2.88.5", + "@adobe/rum-distiller": "1.22.2", "@adobe/spacecat-shared-utils": "1.81.1", - "jose": "6.1.2" + "aws4": "1.13.2", + "urijs": "1.19.11" }, "engines": { "node": ">=22.0.0 <25.0.0", "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-google-client/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -1549,30 +3025,44 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/client-secrets-manager": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.940.0.tgz", - "integrity": "sha512-fpxSRsGyuXmyNqEwdGJUDWVgN0v8xR7tr32Quls3K+HnYlnBGFmISu5Pcc+BfwmrZHnPaVpPc+S3PUzTnFpOJg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", "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.940.0", "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", "@aws-sdk/middleware-logger": "3.936.0", "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", "@aws-sdk/middleware-user-agent": "3.940.0", "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", "@aws-sdk/types": "3.936.0", "@aws-sdk/util-endpoints": "3.936.0", "@aws-sdk/util-user-agent-browser": "3.936.0", "@aws-sdk/util-user-agent-node": "3.940.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.12", "@smithy/middleware-retry": "^4.4.12", @@ -1592,14 +3082,16 @@ "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -1651,23 +3143,142 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/core": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", + "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", + "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.940.0", + "@aws-sdk/credential-provider-http": "3.940.0", + "@aws-sdk/credential-provider-ini": "3.940.0", + "@aws-sdk/credential-provider-process": "3.940.0", + "@aws-sdk/credential-provider-sso": "3.940.0", + "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", + "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.18.5", "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", + "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -1675,22 +3286,13 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", - "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.940.0", - "@aws-sdk/credential-provider-http": "3.940.0", - "@aws-sdk/credential-provider-ini": "3.940.0", - "@aws-sdk/credential-provider-process": "3.940.0", - "@aws-sdk/credential-provider-sso": "3.940.0", - "@aws-sdk/credential-provider-web-identity": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -1698,7 +3300,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", @@ -1716,7 +3318,36 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-google-client/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", @@ -1740,15 +3371,14 @@ } } }, - "node_modules/@adobe/spacecat-shared-gpt-client": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-gpt-client/-/spacecat-shared-gpt-client-1.6.15.tgz", - "integrity": "sha512-SLMNrEWMsGBvUQ4X+fzm3GF8aSoOH1yNAjQacJaobuUoYKu0rT91WSk1zszz8A8URvfXvFDaIFjBb+TP1q8soA==", + "node_modules/@adobe/spacecat-shared-scrape-client": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-scrape-client/-/spacecat-shared-scrape-client-2.3.6.tgz", + "integrity": "sha512-v01KMyAbwHAFE11n9Fw/qDDl2yaSz8q1fk2W4SbSO7sKj8u8i1ciGIDlmCuDANgd0gCEN6bSATSy+v4Fzy78dg==", "license": "Apache-2.0", "dependencies": { - "@adobe/fetch": "4.2.3", "@adobe/helix-universal": "5.3.0", - "@adobe/spacecat-shared-ims-client": "1.11.6", + "@adobe/spacecat-shared-data-access": "2.88.7", "@adobe/spacecat-shared-utils": "1.81.1" }, "engines": { @@ -1756,25 +3386,7 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@adobe/spacecat-shared-ims-client": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-ims-client/-/spacecat-shared-ims-client-1.11.6.tgz", - "integrity": "sha512-tmCpHVDUHyTjHowm+c6Mrsclyoa86hXDkUqClvnTSrRHWINJHZl2wyEQcsmpugKjTyzu8u94lEDlKs50d4AVZg==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "@adobe/helix-universal": "5.3.0", - "@adobe/spacecat-shared-data-access": "2.88.5", - "@adobe/spacecat-shared-utils": "1.81.1", - "@aws-sdk/client-secrets-manager": "3.940.0", - "aws-xray-sdk": "3.12.0" - }, - "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -1798,30 +3410,44 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/client-secrets-manager": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.940.0.tgz", - "integrity": "sha512-fpxSRsGyuXmyNqEwdGJUDWVgN0v8xR7tr32Quls3K+HnYlnBGFmISu5Pcc+BfwmrZHnPaVpPc+S3PUzTnFpOJg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", "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.940.0", "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", "@aws-sdk/middleware-logger": "3.936.0", "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", "@aws-sdk/middleware-user-agent": "3.940.0", "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", "@aws-sdk/types": "3.936.0", "@aws-sdk/util-endpoints": "3.936.0", "@aws-sdk/util-user-agent-browser": "3.936.0", "@aws-sdk/util-user-agent-node": "3.940.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.12", "@smithy/middleware-retry": "^4.4.12", @@ -1841,14 +3467,16 @@ "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -1900,7 +3528,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/core": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", @@ -1924,7 +3552,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", @@ -1947,133 +3575,56 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", - "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-gpt-client/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", - "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@adobe/spacecat-shared-http-utils": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-http-utils/-/spacecat-shared-http-utils-1.19.4.tgz", - "integrity": "sha512-P7iw/KYUtRmjLR6ZEFsf+1RPuoZkaN3sZUfZigQpH0JWJlhbSehTHMBC29yrGhvYrgEA4ssLu5S0F4tRhcq3xg==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "@adobe/spacecat-shared-data-access": "2.88.7", - "@adobe/spacecat-shared-utils": "1.81.1", - "jose": "6.1.2" - }, - "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@adobe/spacecat-shared-utils": { - "version": "1.81.1", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", - "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "@aws-sdk/client-s3": "3.940.0", - "@aws-sdk/client-sqs": "3.940.0", - "@json2csv/plainjs": "7.0.6", - "aws-xray-sdk": "3.12.0", - "cheerio": "1.1.2", - "date-fns": "4.1.0", - "franc-min": "6.2.0", - "iso-639-3": "3.0.1", - "validator": "^13.15.15", - "world-countries": "5.1.0", - "zod": "^4.1.11" - }, - "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", - "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.940.0", - "@aws-sdk/credential-provider-node": "3.940.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-sdk-sqs": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.940.0", - "@aws-sdk/region-config-resolver": "3.936.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.940.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/md5-js": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", + "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2081,23 +3632,38 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", + "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.18.5", "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", + "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2105,22 +3671,13 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", - "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.940.0", - "@aws-sdk/credential-provider-http": "3.940.0", - "@aws-sdk/credential-provider-ini": "3.940.0", - "@aws-sdk/credential-provider-process": "3.940.0", - "@aws-sdk/credential-provider-sso": "3.940.0", - "@aws-sdk/credential-provider-web-identity": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -2128,7 +3685,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", @@ -2146,7 +3703,36 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-http-utils/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", @@ -2170,25 +3756,22 @@ } } }, - "node_modules/@adobe/spacecat-shared-ims-client": { - "version": "1.11.8", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-ims-client/-/spacecat-shared-ims-client-1.11.8.tgz", - "integrity": "sha512-nZOfEp3zN3i6mWZZIcwHZqCL2Qj+9nPwmw2BMSFzShJbApf7uCRhdiZagGKmOTY/OgzP+9KrXAFsozxlt3azhQ==", + "node_modules/@adobe/spacecat-shared-slack-client": { + "version": "1.5.32", + "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-slack-client/-/spacecat-shared-slack-client-1.5.32.tgz", + "integrity": "sha512-LxjKfGWGgqlqK1J2SXPG+vEsQ6gDAyTRLTSsOvvHyPay1Gt2mbQtfXN8X6hJWsB8Tnu/h7jGLIXMEC0YE9vCXg==", "license": "Apache-2.0", "dependencies": { - "@adobe/fetch": "4.2.3", "@adobe/helix-universal": "5.3.0", - "@adobe/spacecat-shared-data-access": "2.88.7", "@adobe/spacecat-shared-utils": "1.81.1", - "@aws-sdk/client-secrets-manager": "3.940.0", - "aws-xray-sdk": "3.12.0" + "@slack/web-api": "7.13.0" }, "engines": { "node": ">=22.0.0 <25.0.0", "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@adobe/spacecat-shared-utils": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@adobe/spacecat-shared-utils": { "version": "1.81.1", "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", @@ -2212,30 +3795,44 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-secrets-manager": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.940.0.tgz", - "integrity": "sha512-fpxSRsGyuXmyNqEwdGJUDWVgN0v8xR7tr32Quls3K+HnYlnBGFmISu5Pcc+BfwmrZHnPaVpPc+S3PUzTnFpOJg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", "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.940.0", "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", "@aws-sdk/middleware-logger": "3.936.0", "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", "@aws-sdk/middleware-user-agent": "3.940.0", "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", "@aws-sdk/types": "3.936.0", "@aws-sdk/util-endpoints": "3.936.0", "@aws-sdk/util-user-agent-browser": "3.936.0", "@aws-sdk/util-user-agent-node": "3.940.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", "@smithy/middleware-endpoint": "^4.3.12", "@smithy/middleware-retry": "^4.4.12", @@ -2255,14 +3852,16 @@ "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -2314,7 +3913,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/core": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", @@ -2338,7 +3937,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", @@ -2361,136 +3960,95 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", - "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-ims-client/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", - "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, - "node_modules/@adobe/spacecat-shared-rum-api-client": { - "version": "2.40.4", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-rum-api-client/-/spacecat-shared-rum-api-client-2.40.4.tgz", - "integrity": "sha512-x6BW8ql+yD3drzgea0Px2kS8qdzVqVaTLgE7MVski+W1BgvrD1mU6/VkSXdkDP4H9mE85OQ+c0jIpVkG70ITEA==", + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", "license": "Apache-2.0", "dependencies": { - "@adobe/fetch": "4.2.3", - "@adobe/helix-shared-wrap": "2.0.2", - "@adobe/helix-universal": "5.3.0", - "@adobe/rum-distiller": "1.22.2", - "@adobe/spacecat-shared-utils": "1.81.1", - "aws4": "1.13.2", - "urijs": "1.19.11" + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@adobe/spacecat-shared-utils": { - "version": "1.81.1", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", - "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", "license": "Apache-2.0", "dependencies": { - "@adobe/fetch": "4.2.3", - "@aws-sdk/client-s3": "3.940.0", - "@aws-sdk/client-sqs": "3.940.0", - "@json2csv/plainjs": "7.0.6", - "aws-xray-sdk": "3.12.0", - "cheerio": "1.1.2", - "date-fns": "4.1.0", - "franc-min": "6.2.0", - "iso-639-3": "3.0.1", - "validator": "^13.15.15", - "world-countries": "5.1.0", - "zod": "^4.1.11" + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", - "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.940.0", - "@aws-sdk/credential-provider-node": "3.940.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-sdk-sqs": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.940.0", - "@aws-sdk/region-config-resolver": "3.936.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.940.0", - "@smithy/config-resolver": "^4.4.3", + "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/md5-js": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -2498,46 +4056,31 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/core": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", - "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", + "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.940.0", - "@aws-sdk/credential-provider-http": "3.940.0", - "@aws-sdk/credential-provider-ini": "3.940.0", - "@aws-sdk/credential-provider-process": "3.940.0", - "@aws-sdk/credential-provider-sso": "3.940.0", - "@aws-sdk/credential-provider-web-identity": "3.940.0", + "@aws-sdk/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -2545,17 +4088,16 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/signature-v4-multi-region": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", - "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.940.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -2563,7 +4105,19 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-rum-api-client/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", @@ -2587,25 +4141,10 @@ } } }, - "node_modules/@adobe/spacecat-shared-scrape-client": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-scrape-client/-/spacecat-shared-scrape-client-2.3.6.tgz", - "integrity": "sha512-v01KMyAbwHAFE11n9Fw/qDDl2yaSz8q1fk2W4SbSO7sKj8u8i1ciGIDlmCuDANgd0gCEN6bSATSy+v4Fzy78dg==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/helix-universal": "5.3.0", - "@adobe/spacecat-shared-data-access": "2.88.7", - "@adobe/spacecat-shared-utils": "1.81.1" - }, - "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@adobe/spacecat-shared-utils": { - "version": "1.81.1", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", - "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", + "node_modules/@adobe/spacecat-shared-utils": { + "version": "1.87.0", + "resolved": "https://gist.github.com/tkotthakota-adobe/655342ca8fe806db4e508761465becb2/raw/72a22c19f8a596650493990d8443238466f0d224/adobe-spacecat-shared-utils-1.87.0.tgz", + "integrity": "sha512-yy7LHABeZaF/ueY72W6e2kPDfT4fX6xE3WFxS+6jWFAH+AXYCEBDBwJBNL0E8Cj7RqG2G/fVjndLqUqI9mDPCA==", "license": "Apache-2.0", "dependencies": { "@adobe/fetch": "4.2.3", @@ -2617,6 +4156,7 @@ "date-fns": "4.1.0", "franc-min": "6.2.0", "iso-639-3": "3.0.1", + "urijs": "1.19.11", "validator": "^13.15.15", "world-countries": "5.1.0", "zod": "^4.1.11" @@ -2626,30 +4166,42 @@ "npm": ">=10.9.0 <12.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/client-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", - "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", + "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", "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.940.0", "@aws-sdk/credential-provider-node": "3.940.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.940.0", "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", "@aws-sdk/middleware-logger": "3.936.0", "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-sdk-sqs": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/middleware-ssec": "3.936.0", "@aws-sdk/middleware-user-agent": "3.940.0", "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.940.0", "@aws-sdk/types": "3.936.0", "@aws-sdk/util-endpoints": "3.936.0", "@aws-sdk/util-user-agent-browser": "3.936.0", "@aws-sdk/util-user-agent-node": "3.940.0", "@smithy/config-resolver": "^4.4.3", "@smithy/core": "^3.18.5", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", "@smithy/invalid-dependency": "^4.2.5", "@smithy/md5-js": "^4.2.5", "@smithy/middleware-content-length": "^4.2.5", @@ -2671,142 +4223,16 @@ "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/core": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", - "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.940.0", - "@aws-sdk/credential-provider-http": "3.940.0", - "@aws-sdk/credential-provider-ini": "3.940.0", - "@aws-sdk/credential-provider-process": "3.940.0", - "@aws-sdk/credential-provider-sso": "3.940.0", - "@aws-sdk/credential-provider-web-identity": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", - "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-scrape-client/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", - "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@adobe/spacecat-shared-slack-client": { - "version": "1.5.32", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-slack-client/-/spacecat-shared-slack-client-1.5.32.tgz", - "integrity": "sha512-LxjKfGWGgqlqK1J2SXPG+vEsQ6gDAyTRLTSsOvvHyPay1Gt2mbQtfXN8X6hJWsB8Tnu/h7jGLIXMEC0YE9vCXg==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/helix-universal": "5.3.0", - "@adobe/spacecat-shared-utils": "1.81.1", - "@slack/web-api": "7.13.0" - }, - "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@adobe/spacecat-shared-utils": { - "version": "1.81.1", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.81.1.tgz", - "integrity": "sha512-GSQuLJsPsT6SDJNydhozgRNHl5qat4f+W7/IwyAvNfAqgPrF6Eb7+h4ZUz8Nb01Rm13Z18f6NY/u/wW12sdxtQ==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "@aws-sdk/client-s3": "3.940.0", - "@aws-sdk/client-sqs": "3.940.0", - "@json2csv/plainjs": "7.0.6", - "aws-xray-sdk": "3.12.0", - "cheerio": "1.1.2", - "date-fns": "4.1.0", - "franc-min": "6.2.0", - "iso-639-3": "3.0.1", - "validator": "^13.15.15", - "world-countries": "5.1.0", - "zod": "^4.1.11" - }, - "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" - } - }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/client-sqs": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", @@ -2858,7 +4284,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/core": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", @@ -2882,7 +4308,7 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/credential-provider-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", @@ -2905,118 +4331,56 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", - "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-slack-client/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", - "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@adobe/spacecat-shared-utils": { - "version": "1.87.0", - "resolved": "https://registry.npmjs.org/@adobe/spacecat-shared-utils/-/spacecat-shared-utils-1.87.0.tgz", - "integrity": "sha512-rg38jLMa4JdgEUgiZGl3V75Grn2aUcDGCjLBEnKj9l8z0Bd1PWp7ScvwRAsIZEeIW3qUKKfBRiPfrBUmUL57Ig==", - "license": "Apache-2.0", - "dependencies": { - "@adobe/fetch": "4.2.3", - "@aws-sdk/client-s3": "3.940.0", - "@aws-sdk/client-sqs": "3.940.0", - "@json2csv/plainjs": "7.0.6", - "aws-xray-sdk": "3.12.0", - "cheerio": "1.1.2", - "date-fns": "4.1.0", - "franc-min": "6.2.0", - "iso-639-3": "3.0.1", - "urijs": "1.19.11", - "validator": "^13.15.15", - "world-countries": "5.1.0", - "zod": "^4.1.11" - }, - "engines": { - "node": ">=22.0.0 <25.0.0", - "npm": ">=10.9.0 <12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/client-sqs": { + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-flexible-checksums": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.940.0.tgz", - "integrity": "sha512-tXPi9OlELbiewGDb9maXDMhdYW617I9osGo/C1GAR6eLYwj40/TfOBeOQf3tX9EcH8NpDBuMksxoAvkpvqYIKw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", + "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.940.0", - "@aws-sdk/credential-provider-node": "3.940.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-sdk-sqs": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.940.0", - "@aws-sdk/region-config-resolver": "3.936.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.940.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/md5-js": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", + "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -3024,23 +4388,38 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/core": { + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-sdk-s3": { "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", + "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.940.0", "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", + "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.18.5", "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", "@smithy/protocol-http": "^5.3.5", "@smithy/signature-v4": "^5.3.5", "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", + "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -3048,22 +4427,13 @@ "node": ">=18.0.0" } }, - "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", - "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.940.0", - "@aws-sdk/credential-provider-http": "3.940.0", - "@aws-sdk/credential-provider-ini": "3.940.0", - "@aws-sdk/credential-provider-process": "3.940.0", - "@aws-sdk/credential-provider-sso": "3.940.0", - "@aws-sdk/credential-provider-web-identity": "3.940.0", "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -3089,6 +4459,35 @@ "node": ">=18.0.0" } }, + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.940.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", + "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.940.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@adobe/spacecat-shared-utils/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.940.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", @@ -3764,174 +5163,10 @@ "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/config-resolver": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", - "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.7", - "@smithy/util-middleware": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/credential-provider-imds": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", - "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/hash-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", - "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/invalid-dependency": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", - "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/middleware-content-length": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", - "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/middleware-retry": { - "version": "4.4.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.17.tgz", - "integrity": "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/service-error-classification": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-retry": "^4.2.7", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/service-error-classification": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", - "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.16.tgz", - "integrity": "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.19.tgz", - "integrity": "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.4.5", - "@smithy/credential-provider-imds": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/util-retry": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", - "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.2.7", + "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { @@ -4456,6 +5691,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.940.0.tgz", "integrity": "sha512-u2sXsNJazJbuHeWICvsj6RvNyJh3isedEfPvB21jK/kxcriK+dE/izlKC2cyxUjERCmku0zTFNzY9FhrLbYHjQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -4925,27 +6161,302 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.7.tgz", - "integrity": "sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.7.tgz", + "integrity": "sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.7.tgz", + "integrity": "sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/hash-node": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", + "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/invalid-dependency": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", + "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-content-length": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", + "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-endpoint": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.3.tgz", + "integrity": "sha512-Zb8R35hjBhp1oFhiaAZ9QhClpPHdEDmNDC2UrrB2fqV0oNDUUPH12ovZHB5xi/Rd+pg/BJHOR1q+SfsieSKPQg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.20.2", + "@smithy/middleware-serde": "^4.2.8", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-middleware": "^4.2.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.19.tgz", + "integrity": "sha512-QtisFIjIw2tjMm/ESatjWFVIQb5Xd093z8xhxq/SijLg7Mgo2C2wod47Ib/AHpBLFhwYXPzd7Hp2+JVXfeZyMQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/service-error-classification": "^4.2.7", + "@smithy/smithy-client": "^4.10.4", + "@smithy/types": "^4.11.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-retry": "^4.2.7", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/service-error-classification": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", + "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/smithy-client": { + "version": "4.10.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.4.tgz", + "integrity": "sha512-rHig+BWjhjlHlah67ryaW9DECYixiJo5pQCTEwsJyarRBAwHMMC3iYz5MXXAHXe64ZAMn1NhTUSTFIu1T6n6jg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.20.2", + "@smithy/middleware-endpoint": "^4.4.3", + "@smithy/middleware-stack": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-stream": "^4.5.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.18.tgz", + "integrity": "sha512-Ao1oLH37YmLyHnKdteMp6l4KMCGBeZEAN68YYe00KAaKFijFELDbRQRm3CNplz7bez1HifuBV0l5uR6eVJLhIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.7", + "@smithy/smithy-client": "^4.10.4", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.21.tgz", + "integrity": "sha512-e21ASJDirE96kKXZLcYcnn4Zt0WGOvMYc1P8EK0gQeQ3I8PbJWqBKx9AUr/YeFpDkpYwEu1RsPe4UXk2+QL7IA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.5", + "@smithy/credential-provider-imds": "^4.2.7", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/smithy-client": "^4.10.4", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-retry": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", + "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-waiter": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.7.tgz", + "integrity": "sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.966.0.tgz", + "integrity": "sha512-IckVv+A6irQyXTiJrNpfi63ZtPuk6/Iu70TnMq2DTRFK/4bD2bOvqL1IHZ2WGmZMoeWd5LI8Fn6pIwdK6g4QJQ==", + "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.966.0", + "@aws-sdk/credential-provider-node": "3.966.0", + "@aws-sdk/middleware-bucket-endpoint": "3.966.0", + "@aws-sdk/middleware-expect-continue": "3.965.0", + "@aws-sdk/middleware-flexible-checksums": "3.966.0", + "@aws-sdk/middleware-host-header": "3.965.0", + "@aws-sdk/middleware-location-constraint": "3.965.0", + "@aws-sdk/middleware-logger": "3.965.0", + "@aws-sdk/middleware-recursion-detection": "3.965.0", + "@aws-sdk/middleware-sdk-s3": "3.966.0", + "@aws-sdk/middleware-ssec": "3.965.0", + "@aws-sdk/middleware-user-agent": "3.966.0", + "@aws-sdk/region-config-resolver": "3.965.0", + "@aws-sdk/signature-v4-multi-region": "3.966.0", + "@aws-sdk/types": "3.965.0", + "@aws-sdk/util-endpoints": "3.965.0", + "@aws-sdk/util-user-agent-browser": "3.965.0", + "@aws-sdk/util-user-agent-node": "3.966.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/core": "^3.20.1", + "@smithy/eventstream-serde-browser": "^4.2.7", + "@smithy/eventstream-serde-config-resolver": "^4.3.7", + "@smithy/eventstream-serde-node": "^4.2.7", + "@smithy/fetch-http-handler": "^5.3.8", + "@smithy/hash-blob-browser": "^4.2.8", + "@smithy/hash-node": "^4.2.7", + "@smithy/hash-stream-node": "^4.2.7", + "@smithy/invalid-dependency": "^4.2.7", + "@smithy/md5-js": "^4.2.7", + "@smithy/middleware-content-length": "^4.2.7", + "@smithy/middleware-endpoint": "^4.4.2", + "@smithy/middleware-retry": "^4.4.18", + "@smithy/middleware-serde": "^4.2.8", + "@smithy/middleware-stack": "^4.2.7", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/node-http-handler": "^4.4.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/smithy-client": "^4.10.3", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.17", + "@smithy/util-defaults-mode-node": "^4.2.20", + "@smithy/util-endpoints": "^3.2.7", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-retry": "^4.2.7", + "@smithy/util-stream": "^4.5.8", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.966.0.tgz", + "integrity": "sha512-QaRVBHD1prdrFXIeFAY/1w4b4S0EFyo/ytzU+rCklEjMRT7DKGXGoHXTWLGz+HD7ovlS5u+9cf8a/LeSOEMzww==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.7", + "@aws-sdk/types": "3.965.0", + "@aws-sdk/xml-builder": "3.965.0", + "@smithy/core": "^3.20.1", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/signature-v4": "^5.3.7", + "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.7.tgz", - "integrity": "sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/crc64-nvme": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.965.0.tgz", + "integrity": "sha512-9FbIyJ/Zz1AdEIrb0+Pn7wRi+F/0Y566ooepg0hDyHUzRV3ZXKjOlu3wJH3YwTz2UkdwQmldfUos2yDJps7RyA==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.2.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -4953,27 +6464,32 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/hash-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", - "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.966.0.tgz", + "integrity": "sha512-KMPZ7gtFXErd9pMpXJMBwFlxxlGIaIQrUBfj3ea7rlrNtoVHnSI4qsoldLq5l9/Ho64KoCiICH4+qXjze8JTDQ==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.965.0", + "@aws-sdk/util-arn-parser": "3.966.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/invalid-dependency": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", - "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.965.0.tgz", + "integrity": "sha512-UBxVytsmhEmFwkBnt+aV0eAJ7uc+ouNokCqMBrQ7Oc5A77qhlcHfOgXIKz2SxqsiYTsDq+a0lWFM/XpyRWraqA==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.965.0", + "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -4981,115 +6497,122 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-content-length": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", - "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.966.0.tgz", + "integrity": "sha512-0/ofXeceTH/flKhg4EGGYr4cDtaLVkR/2RI05J/hxrHIls+iM6j8++GO0TocxmZYK+8B+7XKSaV9LU26nboTUQ==", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/crc64-nvme": "3.965.0", + "@aws-sdk/types": "3.965.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-stream": "^4.5.8", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-endpoint": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.3.tgz", - "integrity": "sha512-Zb8R35hjBhp1oFhiaAZ9QhClpPHdEDmNDC2UrrB2fqV0oNDUUPH12ovZHB5xi/Rd+pg/BJHOR1q+SfsieSKPQg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.965.0.tgz", + "integrity": "sha512-SfpSYqoPOAmdb3DBsnNsZ0vix+1VAtkUkzXM79JL3R5IfacpyKE2zytOgVAQx/FjhhlpSTwuXd+LRhUEVb3MaA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.2", - "@smithy/middleware-serde": "^4.2.8", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/shared-ini-file-loader": "^4.4.2", + "@aws-sdk/types": "3.965.0", + "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.19.tgz", - "integrity": "sha512-QtisFIjIw2tjMm/ESatjWFVIQb5Xd093z8xhxq/SijLg7Mgo2C2wod47Ib/AHpBLFhwYXPzd7Hp2+JVXfeZyMQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.965.0.tgz", + "integrity": "sha512-07T1rwAarQs33mVg5U28AsSdLB5JUXu9yBTBmspFGajKVsEahIyntf53j9mAXF1N2KR0bNdP0J4A0kst4t43UQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/service-error-classification": "^4.2.7", - "@smithy/smithy-client": "^4.10.4", + "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-retry": "^4.2.7", - "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/service-error-classification": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", - "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.965.0.tgz", + "integrity": "sha512-gjUvJRZT1bUABKewnvkj51LAynFrfz2h5DYAg5/2F4Utx6UOGByTSr9Rq8JCLbURvvzAbCtcMkkIJRxw+8Zuzw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0" + "@aws-sdk/types": "3.965.0", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/smithy-client": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.4.tgz", - "integrity": "sha512-rHig+BWjhjlHlah67ryaW9DECYixiJo5pQCTEwsJyarRBAwHMMC3iYz5MXXAHXe64ZAMn1NhTUSTFIu1T6n6jg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.965.0.tgz", + "integrity": "sha512-6dvD+18Ni14KCRu+tfEoNxq1sIGVp9tvoZDZ7aMvpnA7mDXuRLrOjRQ/TAZqXwr9ENKVGyxcPl0cRK8jk1YWjA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.2", - "@smithy/middleware-endpoint": "^4.4.3", - "@smithy/middleware-stack": "^4.2.7", + "@aws-sdk/types": "3.965.0", + "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", - "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.18", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.18.tgz", - "integrity": "sha512-Ao1oLH37YmLyHnKdteMp6l4KMCGBeZEAN68YYe00KAaKFijFELDbRQRm3CNplz7bez1HifuBV0l5uR6eVJLhIg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.966.0.tgz", + "integrity": "sha512-9N9zncsY5ydDCRatKdrPZcdCwNWt7TdHmqgwQM52PuA5gs1HXWwLLNDy/51H+9RTHi7v6oly+x9utJ/qypCh2g==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.4", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/types": "3.965.0", + "@aws-sdk/util-arn-parser": "3.966.0", + "@smithy/core": "^3.20.1", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/signature-v4": "^5.3.7", + "@smithy/smithy-client": "^4.10.3", "@smithy/types": "^4.11.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-stream": "^4.5.8", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.21.tgz", - "integrity": "sha512-e21ASJDirE96kKXZLcYcnn4Zt0WGOvMYc1P8EK0gQeQ3I8PbJWqBKx9AUr/YeFpDkpYwEu1RsPe4UXk2+QL7IA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-ssec": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.965.0.tgz", + "integrity": "sha512-dke++CTw26y+a2D1DdVuZ4+2TkgItdx6TeuE0zOl4lsqXGvTBUG4eaIZalt7ZOAW5ys2pbDOk1bPuh4opoD3pQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.5", - "@smithy/credential-provider-imds": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.4", + "@aws-sdk/types": "3.965.0", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -5097,13 +6620,17 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-retry": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", - "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.966.0.tgz", + "integrity": "sha512-MvGoy0vhMluVpSB5GaGJbYLqwbZfZjwEZhneDHdPhgCgQqmCtugnYIIjpUw7kKqWGsmaMQmNEgSFf1zYYmwOyg==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.7", + "@aws-sdk/core": "3.966.0", + "@aws-sdk/types": "3.965.0", + "@aws-sdk/util-endpoints": "3.965.0", + "@smithy/core": "^3.20.1", + "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -5111,13 +6638,15 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-waiter": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.7.tgz", - "integrity": "sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.965.0.tgz", + "integrity": "sha512-RoMhu9ly2B0coxn8ctXosPP2WmDD0MkQlZGLjoYHQUOCBmty5qmCxOqBmBDa6wbWbB8xKtMQ/4VXloQOgzjHXg==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.7", + "@aws-sdk/types": "3.965.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/node-config-provider": "^4.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -5125,147 +6654,86 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.940.0.tgz", - "integrity": "sha512-Wi4qnBT6shRRMXuuTgjMFTU5mu2KFWisgcigEMPptjPGUtJvBVi4PTGgS64qsLoUk/obqDAyOBOfEtRZ2ddC2w==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.966.0.tgz", + "integrity": "sha512-VNSpyfKtDiBg/nPwSXDvnjISaDE9mI8zhOK3C4/obqh8lK1V6j04xDlwyIWbbIM0f6VgV1FVixlghtJB79eBqA==", "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.940.0", - "@aws-sdk/credential-provider-node": "3.940.0", - "@aws-sdk/middleware-bucket-endpoint": "3.936.0", - "@aws-sdk/middleware-expect-continue": "3.936.0", - "@aws-sdk/middleware-flexible-checksums": "3.940.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-location-constraint": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-sdk-s3": "3.940.0", - "@aws-sdk/middleware-ssec": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.940.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/signature-v4-multi-region": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.940.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/eventstream-serde-browser": "^4.2.5", - "@smithy/eventstream-serde-config-resolver": "^4.3.5", - "@smithy/eventstream-serde-node": "^4.2.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-blob-browser": "^4.2.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/hash-stream-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/md5-js": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-stream": "^4.5.6", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.5", + "@aws-sdk/middleware-sdk-s3": "3.966.0", + "@aws-sdk/types": "3.965.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/signature-v4": "^5.3.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.965.0.tgz", + "integrity": "sha512-jvodoJdMavvg8faN7co58vVJRO5MVep4JFPRzUNCzpJ98BDqWDk/ad045aMJcmxkLzYLS2UAnUmqjJ/tUPNlzQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.940.0.tgz", - "integrity": "sha512-M8NFAvgvO6xZjiti5kztFiAYmSmSlG3eUfr4ZHSfXYZUA/KUdZU/D6xJyaLnU8cYRWBludb6K9XPKKVwKfqm4g==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.966.0.tgz", + "integrity": "sha512-WcCLdKBK2nHhtOPE8du5XjOXaOToxGF3Ge8rgK2jaRpjkzjS0/mO+Jp2H4+25hOne3sP2twBu5BrvD9KoXQ5LQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.940.0", - "@aws-sdk/credential-provider-http": "3.940.0", - "@aws-sdk/credential-provider-ini": "3.940.0", - "@aws-sdk/credential-provider-process": "3.940.0", - "@aws-sdk/credential-provider-sso": "3.940.0", - "@aws-sdk/credential-provider-web-identity": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.940.0.tgz", - "integrity": "sha512-nJbLrUj6fY+l2W2rIB9P4Qvpiy0tnTdg/dmixRxrU1z3e8wBdspJlyE+AZN4fuVbeL6rrRrO/zxQC1bB3cw5IA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.965.0.tgz", + "integrity": "sha512-WqSCB0XIsGUwZWvrYkuoofi2vzoVHqyeJ2kN+WyoOsxPLTiQSBIoqm/01R/qJvoxwK/gOOF7su9i84Vw2NQQpQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.965.0", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.965.0.tgz", + "integrity": "sha512-Xiza/zMntQGpkd2dETQeAK8So1pg5+STTzpcdGWxj5q0jGO5ayjqT/q1Q7BrsX5KIr6PvRkl9/V7lLCv04wGjQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.965.0", + "@smithy/types": "^4.11.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.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.940.0.tgz", - "integrity": "sha512-dlD/F+L/jN26I8Zg5x0oDGJiA+/WEQmnSE27fi5ydvYnpfQLwThtQo9SsNS47XSR/SOULaaoC9qx929rZuo74A==", + "version": "3.966.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.966.0.tgz", + "integrity": "sha512-vPPe8V0GLj+jVS5EqFz2NUBgWH35favqxliUOvhp8xBdNRkEjiZm5TqitVtFlxS4RrLY3HOndrWbrP5ejbwl1Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/middleware-user-agent": "3.966.0", + "@aws-sdk/types": "3.965.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -5280,6 +6748,20 @@ } } }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/xml-builder": { + "version": "3.965.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.965.0.tgz", + "integrity": "sha512-Tcod25/BTupraQwtb+Q+GX8bmEZfxIFjjJ/AvkhUZsZlkPeVluzq1uu3Oeqf145DCdMjzLIN6vab5MrykbDP+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/client-secrets-manager": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.957.0.tgz", @@ -5609,245 +7091,85 @@ "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", "@aws-sdk/middleware-user-agent": "3.957.0", - "@aws-sdk/region-config-resolver": "3.957.0", - "@aws-sdk/types": "3.957.0", - "@aws-sdk/util-endpoints": "3.957.0", - "@aws-sdk/util-user-agent-browser": "3.957.0", - "@aws-sdk/util-user-agent-node": "3.957.0", - "@smithy/config-resolver": "^4.4.5", - "@smithy/core": "^3.20.0", - "@smithy/fetch-http-handler": "^5.3.8", - "@smithy/hash-node": "^4.2.7", - "@smithy/invalid-dependency": "^4.2.7", - "@smithy/middleware-content-length": "^4.2.7", - "@smithy/middleware-endpoint": "^4.4.1", - "@smithy/middleware-retry": "^4.4.17", - "@smithy/middleware-serde": "^4.2.8", - "@smithy/middleware-stack": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/node-http-handler": "^4.4.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.16", - "@smithy/util-defaults-mode-node": "^4.2.19", - "@smithy/util-endpoints": "^3.2.7", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-retry": "^4.2.7", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.957.0.tgz", - "integrity": "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/config-resolver": "^4.4.5", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/token-providers": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", - "integrity": "sha512-oSwo3BZ6gcvhjTg036V0UQmtENUeNwfCU35iDckX961CdI1alQ3TKRWLzKrwvXCbrOx+bZsuA1PHsTbNhI/+Fw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", - "@aws-sdk/types": "3.957.0", - "@smithy/property-provider": "^4.2.7", - "@smithy/shared-ini-file-loader": "^4.4.2", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/types": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", - "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-endpoints": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz", - "integrity": "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "@smithy/util-endpoints": "^3.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.957.0.tgz", - "integrity": "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/config-resolver": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", - "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.7", - "@smithy/util-middleware": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/credential-provider-imds": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", - "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/hash-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", - "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/invalid-dependency": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", - "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/middleware-content-length": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", - "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { + "@aws-sdk/region-config-resolver": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@aws-sdk/util-endpoints": "3.957.0", + "@aws-sdk/util-user-agent-browser": "3.957.0", + "@aws-sdk/util-user-agent-node": "3.957.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/core": "^3.20.0", + "@smithy/fetch-http-handler": "^5.3.8", + "@smithy/hash-node": "^4.2.7", + "@smithy/invalid-dependency": "^4.2.7", + "@smithy/middleware-content-length": "^4.2.7", + "@smithy/middleware-endpoint": "^4.4.1", + "@smithy/middleware-retry": "^4.4.17", + "@smithy/middleware-serde": "^4.2.8", + "@smithy/middleware-stack": "^4.2.7", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", + "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.16", + "@smithy/util-defaults-mode-node": "^4.2.19", + "@smithy/util-endpoints": "^3.2.7", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-retry": "^4.2.7", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/middleware-retry": { - "version": "4.4.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.17.tgz", - "integrity": "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==", + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.957.0.tgz", + "integrity": "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/config-resolver": "^4.4.5", "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/service-error-classification": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-retry": "^4.2.7", - "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/service-error-classification": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", - "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/token-providers": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", + "integrity": "sha512-oSwo3BZ6gcvhjTg036V0UQmtENUeNwfCU35iDckX961CdI1alQ3TKRWLzKrwvXCbrOx+bZsuA1PHsTbNhI/+Fw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0" + "@aws-sdk/core": "3.957.0", + "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.16.tgz", - "integrity": "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==", + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -5855,38 +7177,34 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.19.tgz", - "integrity": "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==", + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-endpoints": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz", + "integrity": "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.5", - "@smithy/credential-provider-imds": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", + "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/util-retry": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", - "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.957.0.tgz", + "integrity": "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.7", + "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sqs": { @@ -6741,200 +8059,26 @@ "dependencies": { "@aws-sdk/types": "3.957.0", "@smithy/config-resolver": "^4.4.5", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", - "integrity": "sha512-oSwo3BZ6gcvhjTg036V0UQmtENUeNwfCU35iDckX961CdI1alQ3TKRWLzKrwvXCbrOx+bZsuA1PHsTbNhI/+Fw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", - "@aws-sdk/types": "3.957.0", - "@smithy/property-provider": "^4.2.7", - "@smithy/shared-ini-file-loader": "^4.4.2", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/types": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", - "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz", - "integrity": "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "@smithy/util-endpoints": "^3.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.957.0.tgz", - "integrity": "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/config-resolver": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", - "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.7", - "@smithy/util-middleware": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/credential-provider-imds": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", - "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/hash-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", - "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/invalid-dependency": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", - "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/middleware-content-length": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", - "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/middleware-retry": { - "version": "4.4.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.17.tgz", - "integrity": "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/service-error-classification": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-retry": "^4.2.7", - "@smithy/uuid": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/service-error-classification": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", - "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0" + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.16.tgz", - "integrity": "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==", + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", + "integrity": "sha512-oSwo3BZ6gcvhjTg036V0UQmtENUeNwfCU35iDckX961CdI1alQ3TKRWLzKrwvXCbrOx+bZsuA1PHsTbNhI/+Fw==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", + "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -6942,18 +8086,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.19.tgz", - "integrity": "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==", + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.5", - "@smithy/credential-provider-imds": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -6961,34 +8100,34 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-retry": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", - "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz", + "integrity": "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.7", + "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-waiter": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.7.tgz", - "integrity": "sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==", + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.957.0.tgz", + "integrity": "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.7", + "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sso": { @@ -7404,225 +8543,15 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.957.0.tgz", - "integrity": "sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/nested-clients": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.957.0.tgz", - "integrity": "sha512-PZUFtaUTSZWO+mbgQGWSiwz3EqedsuKNb7Xoxjzh5rfJE352DD4/jScQEhVPxvdLw62IK9b5UDu5kZlxzBs9Ow==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.957.0", - "@aws-sdk/middleware-host-header": "3.957.0", - "@aws-sdk/middleware-logger": "3.957.0", - "@aws-sdk/middleware-recursion-detection": "3.957.0", - "@aws-sdk/middleware-user-agent": "3.957.0", - "@aws-sdk/region-config-resolver": "3.957.0", - "@aws-sdk/types": "3.957.0", - "@aws-sdk/util-endpoints": "3.957.0", - "@aws-sdk/util-user-agent-browser": "3.957.0", - "@aws-sdk/util-user-agent-node": "3.957.0", - "@smithy/config-resolver": "^4.4.5", - "@smithy/core": "^3.20.0", - "@smithy/fetch-http-handler": "^5.3.8", - "@smithy/hash-node": "^4.2.7", - "@smithy/invalid-dependency": "^4.2.7", - "@smithy/middleware-content-length": "^4.2.7", - "@smithy/middleware-endpoint": "^4.4.1", - "@smithy/middleware-retry": "^4.4.17", - "@smithy/middleware-serde": "^4.2.8", - "@smithy/middleware-stack": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/node-http-handler": "^4.4.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.16", - "@smithy/util-defaults-mode-node": "^4.2.19", - "@smithy/util-endpoints": "^3.2.7", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-retry": "^4.2.7", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.957.0.tgz", - "integrity": "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/config-resolver": "^4.4.5", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/token-providers": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", - "integrity": "sha512-oSwo3BZ6gcvhjTg036V0UQmtENUeNwfCU35iDckX961CdI1alQ3TKRWLzKrwvXCbrOx+bZsuA1PHsTbNhI/+Fw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", - "@aws-sdk/types": "3.957.0", - "@smithy/property-provider": "^4.2.7", - "@smithy/shared-ini-file-loader": "^4.4.2", - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", - "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-endpoints": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz", - "integrity": "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "@smithy/util-endpoints": "^3.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.957.0.tgz", - "integrity": "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.957.0", - "@smithy/types": "^4.11.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/config-resolver": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", - "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.7", - "@smithy/util-middleware": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/credential-provider-imds": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", - "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/hash-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", - "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/invalid-dependency": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", - "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-content-length": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", - "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.957.0.tgz", + "integrity": "sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.957.0", + "@aws/lambda-invoke-store": "^0.2.2", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" @@ -7631,49 +8560,85 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-retry": { - "version": "4.4.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.17.tgz", - "integrity": "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/nested-clients": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.957.0.tgz", + "integrity": "sha512-PZUFtaUTSZWO+mbgQGWSiwz3EqedsuKNb7Xoxjzh5rfJE352DD4/jScQEhVPxvdLw62IK9b5UDu5kZlxzBs9Ow==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.957.0", + "@aws-sdk/middleware-host-header": "3.957.0", + "@aws-sdk/middleware-logger": "3.957.0", + "@aws-sdk/middleware-recursion-detection": "3.957.0", + "@aws-sdk/middleware-user-agent": "3.957.0", + "@aws-sdk/region-config-resolver": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@aws-sdk/util-endpoints": "3.957.0", + "@aws-sdk/util-user-agent-browser": "3.957.0", + "@aws-sdk/util-user-agent-node": "3.957.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/core": "^3.20.0", + "@smithy/fetch-http-handler": "^5.3.8", + "@smithy/hash-node": "^4.2.7", + "@smithy/invalid-dependency": "^4.2.7", + "@smithy/middleware-content-length": "^4.2.7", + "@smithy/middleware-endpoint": "^4.4.1", + "@smithy/middleware-retry": "^4.4.17", + "@smithy/middleware-serde": "^4.2.8", + "@smithy/middleware-stack": "^4.2.7", "@smithy/node-config-provider": "^4.3.7", + "@smithy/node-http-handler": "^4.4.7", "@smithy/protocol-http": "^5.3.7", - "@smithy/service-error-classification": "^4.2.7", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.16", + "@smithy/util-defaults-mode-node": "^4.2.19", + "@smithy/util-endpoints": "^3.2.7", "@smithy/util-middleware": "^4.2.7", "@smithy/util-retry": "^4.2.7", - "@smithy/uuid": "^1.1.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/service-error-classification": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", - "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.957.0.tgz", + "integrity": "sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0" + "@aws-sdk/types": "3.957.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.16.tgz", - "integrity": "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/token-providers": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", + "integrity": "sha512-oSwo3BZ6gcvhjTg036V0UQmtENUeNwfCU35iDckX961CdI1alQ3TKRWLzKrwvXCbrOx+bZsuA1PHsTbNhI/+Fw==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.957.0", + "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", + "@smithy/shared-ini-file-loader": "^4.4.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -7681,18 +8646,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.19.tgz", - "integrity": "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.5", - "@smithy/credential-provider-imds": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, @@ -7700,21 +8660,36 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-retry": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", - "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-endpoints": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.957.0.tgz", + "integrity": "sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.7", + "@aws-sdk/types": "3.957.0", "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-endpoints": "^3.2.7", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.957.0.tgz", + "integrity": "sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.957.0", + "@smithy/types": "^4.11.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, "node_modules/@aws-sdk/core": { "version": "3.957.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.957.0.tgz", @@ -8812,16 +9787,17 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", - "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.957.0.tgz", + "integrity": "sha512-iczcn/QRIBSpvsdAS/rbzmoBpleX1JBjXvCynMbDceVLBIcVrwT1hXECrhtIC2cjh4HaLo9ClAbiOiWuqt+6MA==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.957.0", + "@aws-sdk/util-arn-parser": "3.957.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" }, @@ -8829,6 +9805,20 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { "version": "3.936.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.936.0.tgz", @@ -8847,14 +9837,29 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", - "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.957.0.tgz", + "integrity": "sha512-AlbK3OeVNwZZil0wlClgeI/ISlOt/SPUxBsIns876IFaVu/Pj3DgImnYhpcJuFRek4r4XM51xzIaGQXM6GDHGg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.957.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -8862,22 +9867,24 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.940.0.tgz", - "integrity": "sha512-WdsxDAVj5qaa5ApAP+JbpCOMHFGSmzjs2Y2OBSbWPeR9Ew7t/Okj+kUub94QJPsgzhvU1/cqNejhsw5VxeFKSQ==", + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.957.0.tgz", + "integrity": "sha512-iJpeVR5V8se1hl2pt+k8bF/e9JO4KWgPCMjg8BtRspNtKIUGy7j6msYvbDixaKZaF2Veg9+HoYcOhwnZumjXSA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.940.0", - "@aws-sdk/types": "3.936.0", + "@aws-sdk/core": "3.957.0", + "@aws-sdk/crc64-nvme": "3.957.0", + "@aws-sdk/types": "3.957.0", "@smithy/is-array-buffer": "^4.2.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-stream": "^4.5.6", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -8885,24 +9892,14 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/core": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -8925,13 +9922,28 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", - "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.957.0.tgz", + "integrity": "sha512-y8/W7TOQpmDJg/fPYlqAhwA4+I15LrS7TwgUEoxogtkD8gfur9wFMRLT8LCyc9o4NMEcAnK50hSb4+wB0qv6tQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.957.0", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -8969,23 +9981,24 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.940.0.tgz", - "integrity": "sha512-JYkLjgS1wLoKHJ40G63+afM1ehmsPsjcmrHirKh8+kSCx4ip7+nL1e/twV4Zicxr8RJi9Y0Ahq5mDvneilDDKQ==", + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.957.0.tgz", + "integrity": "sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-arn-parser": "3.893.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", + "@aws-sdk/core": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@aws-sdk/util-arn-parser": "3.957.0", + "@smithy/core": "^3.20.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/signature-v4": "^5.3.7", + "@smithy/smithy-client": "^4.10.2", + "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-stream": "^4.5.6", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -8993,24 +10006,14 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/core": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.940.0.tgz", - "integrity": "sha512-KsGD2FLaX5ngJao1mHxodIVU9VYd1E8810fcYiGwO1PFHDzf5BEkp6D9IdMeQwT8Q6JLYtiiT1Y/o3UCScnGoA==", + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -9035,13 +10038,28 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", - "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.957.0.tgz", + "integrity": "sha512-qwkmrK0lizdjNt5qxl4tHYfASh8DFpHXM1iDVo+qHe+zuslfMqQEGRkzxS8tJq/I+8F0c6v3IKOveKJAfIvfqQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.957.0", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -9230,16 +10248,31 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.940.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.940.0.tgz", - "integrity": "sha512-ugHZEoktD/bG6mdgmhzLDjMP2VrYRAUPRPF1DpCyiZexkH7DCU7XrSJyXMvkcf0DHV+URk0q2sLf/oqn1D2uYw==", + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.957.0.tgz", + "integrity": "sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.940.0", - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/middleware-sdk-s3": "3.957.0", + "@aws-sdk/types": "3.957.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/signature-v4": "^5.3.7", + "@smithy/types": "^4.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.957.0.tgz", + "integrity": "sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -9302,9 +10335,10 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", - "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "version": "3.957.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.957.0.tgz", + "integrity": "sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g==", + "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10797,6 +11831,7 @@ "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", @@ -10968,6 +12003,7 @@ "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -12333,16 +13369,16 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", - "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", + "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", + "@smithy/util-endpoints": "^3.2.7", + "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" }, "engines": { @@ -12350,9 +13386,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.20.0.tgz", - "integrity": "sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.20.2.tgz", + "integrity": "sha512-nc99TseyTwL1bg+T21cyEA5oItNy1XN4aUeyOlXJnvyRW5VSK1oRKRoSM/Iq0KFPuqZMxjBemSZHZCOZbSyBMw==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.2.8", @@ -12371,15 +13407,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", - "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", + "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", "tslib": "^2.6.2" }, "engines": { @@ -12387,13 +13423,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.5.tgz", - "integrity": "sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.7.tgz", + "integrity": "sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.11.0", "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" }, @@ -12402,13 +13438,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.5.tgz", - "integrity": "sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.7.tgz", + "integrity": "sha512-ujzPk8seYoDBmABDE5YqlhQZAXLOrtxtJLrbhHMKjBoG5b4dK4i6/mEU+6/7yXIAkqOO8sJ6YxZl+h0QQ1IJ7g==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/eventstream-serde-universal": "^4.2.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12416,12 +13452,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.5.tgz", - "integrity": "sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.7.tgz", + "integrity": "sha512-x7BtAiIPSaNaWuzm24Q/mtSkv+BrISO/fmheiJ39PKRNH3RmH2Hph/bUKSOBOBC9unqfIYDhKTHwpyZycLGPVQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12429,13 +13465,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.5.tgz", - "integrity": "sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.7.tgz", + "integrity": "sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/eventstream-serde-universal": "^4.2.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12443,13 +13479,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.5.tgz", - "integrity": "sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.7.tgz", + "integrity": "sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/eventstream-codec": "^4.2.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12473,14 +13509,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.6.tgz", - "integrity": "sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.8.tgz", + "integrity": "sha512-07InZontqsM1ggTCPSRgI7d8DirqRrnpL7nIACT4PW0AWrgDiHhjGZzbAE5UtRSiU0NISGUYe7/rri9ZeWyDpw==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.2.0", "@smithy/chunked-blob-reader-native": "^4.2.1", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12488,12 +13524,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", - "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", + "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.11.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" @@ -12503,12 +13539,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.5.tgz", - "integrity": "sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.7.tgz", + "integrity": "sha512-ZQVoAwNYnFMIbd4DUc517HuwNelJUY6YOzwqrbcAgCnVn+79/OK7UjwA93SPpdTOpKDVkLIzavWm/Ck7SmnDPQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.11.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -12517,12 +13553,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", - "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", + "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12542,12 +13578,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.5.tgz", - "integrity": "sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.7.tgz", + "integrity": "sha512-Wv6JcUxtOLTnxvNjDnAiATUsk8gvA6EeS8zzHig07dotpByYsLot+m0AaQEniUBjx97AC41MQR4hW0baraD1Xw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.11.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, @@ -12556,13 +13592,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", - "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", + "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12570,12 +13606,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.1.tgz", - "integrity": "sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.3.tgz", + "integrity": "sha512-Zb8R35hjBhp1oFhiaAZ9QhClpPHdEDmNDC2UrrB2fqV0oNDUUPH12ovZHB5xi/Rd+pg/BJHOR1q+SfsieSKPQg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.0", + "@smithy/core": "^3.20.2", "@smithy/middleware-serde": "^4.2.8", "@smithy/node-config-provider": "^4.3.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -12589,18 +13625,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz", - "integrity": "sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q==", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.19.tgz", + "integrity": "sha512-QtisFIjIw2tjMm/ESatjWFVIQb5Xd093z8xhxq/SijLg7Mgo2C2wod47Ib/AHpBLFhwYXPzd7Hp2+JVXfeZyMQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/service-error-classification": "^4.2.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/service-error-classification": "^4.2.7", + "@smithy/smithy-client": "^4.10.4", + "@smithy/types": "^4.11.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-retry": "^4.2.7", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -12720,12 +13756,12 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", - "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", + "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.9.0" + "@smithy/types": "^4.11.0" }, "engines": { "node": ">=18.0.0" @@ -12764,13 +13800,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.2.tgz", - "integrity": "sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g==", + "version": "4.10.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.4.tgz", + "integrity": "sha512-rHig+BWjhjlHlah67ryaW9DECYixiJo5pQCTEwsJyarRBAwHMMC3iYz5MXXAHXe64ZAMn1NhTUSTFIu1T6n6jg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.0", - "@smithy/middleware-endpoint": "^4.4.1", + "@smithy/core": "^3.20.2", + "@smithy/middleware-endpoint": "^4.4.3", "@smithy/middleware-stack": "^4.2.7", "@smithy/protocol-http": "^5.3.7", "@smithy/types": "^4.11.0", @@ -12871,14 +13907,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz", - "integrity": "sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA==", + "version": "4.3.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.18.tgz", + "integrity": "sha512-Ao1oLH37YmLyHnKdteMp6l4KMCGBeZEAN68YYe00KAaKFijFELDbRQRm3CNplz7bez1HifuBV0l5uR6eVJLhIg==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/smithy-client": "^4.10.4", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12886,17 +13922,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz", - "integrity": "sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg==", + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.21.tgz", + "integrity": "sha512-e21ASJDirE96kKXZLcYcnn4Zt0WGOvMYc1P8EK0gQeQ3I8PbJWqBKx9AUr/YeFpDkpYwEu1RsPe4UXk2+QL7IA==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.3", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.10", - "@smithy/types": "^4.9.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/credential-provider-imds": "^4.2.7", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/smithy-client": "^4.10.4", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -12943,13 +13979,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", - "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", + "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/service-error-classification": "^4.2.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -13001,13 +14037,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", - "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.7.tgz", + "integrity": "sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/abort-controller": "^4.2.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -13351,6 +14387,7 @@ "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.52.0", "@typescript-eslint/types": "8.52.0", @@ -13582,6 +14619,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -13628,6 +14666,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -14080,6 +15119,7 @@ "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.12.0.tgz", "integrity": "sha512-lwalRdxXRy+Sn49/vN7W507qqmBRk5Fy2o0a9U6XTjL9IV+oR5PUiiptoBrOcaYCiVuGld8OEbNqhm6wvV3m6A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "^3.4.1", "@smithy/service-error-classification": "^2.0.4", @@ -14681,6 +15721,7 @@ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -16603,6 +17644,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -20183,6 +21225,7 @@ "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -20451,6 +21494,7 @@ "integrity": "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==", "dev": true, "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" @@ -23213,6 +24257,7 @@ "dev": true, "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -24790,6 +25835,7 @@ "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -24800,6 +25846,7 @@ "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -25398,6 +26445,7 @@ "integrity": "sha512-6qGjWccl5yoyugHt3jTgztJ9Y0JVzyH8/Voc/D8PlLat9pwxQYXz7W1Dpnq5h0/G5GCYGUaDSlYcyk3AMh5A6g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/error": "^4.0.0", @@ -26112,6 +27160,7 @@ "integrity": "sha512-Z0NVCW45W8Mg5oC/27/+fCqIHFnW8kpkFOq0j9XJIev4Ld0mKmERaZv5DMLAb9fGCevjKwaEeIQz5+MBXfZcDw==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^15.1.0", @@ -26629,6 +27678,7 @@ "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", @@ -27496,6 +28546,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index a23b4b7..d9a3068 100755 --- a/package.json +++ b/package.json @@ -84,7 +84,8 @@ "@adobe/spacecat-shared-rum-api-client": "2.40.4", "@adobe/spacecat-shared-scrape-client": "2.3.6", "@adobe/spacecat-shared-slack-client": "1.5.32", - "@adobe/spacecat-shared-utils": "1.87.0", + "@adobe/spacecat-shared-utils": "https://gist.github.com/tkotthakota-adobe/655342ca8fe806db4e508761465becb2/raw/72a22c19f8a596650493990d8443238466f0d224/adobe-spacecat-shared-utils-1.87.0.tgz", + "@aws-sdk/client-s3": "3.966.0", "@aws-sdk/client-cloudwatch-logs": "3.966.0", "@aws-sdk/client-lambda": "3.966.0", "@aws-sdk/client-sqs": "3.966.0", diff --git a/src/tasks/demo-url-processor/handler.js b/src/tasks/demo-url-processor/handler.js index 9d10994..c81e066 100644 --- a/src/tasks/demo-url-processor/handler.js +++ b/src/tasks/demo-url-processor/handler.js @@ -91,13 +91,13 @@ export async function runDemoUrlProcessor(message, context) { } const demoUrl = `${experienceUrl}?organizationId=${organizationId}#/@${imsTenantId}/sites-optimizer/sites/${siteId}/home`; - const slackMessage = `:white_check_mark: Onboarding setup completed successfully for the site ${siteUrl}!\nAccess your environment here: ${demoUrl}`; + const slackMessage = `:white_check_mark: Onboarding setup completed for the site ${siteUrl}!\nAccess your environment here: ${demoUrl}`; if (slackContext) { await say(env, log, slackContext, slackMessage); } - log.info(`Onboarding setup completed successfully for the site ${siteUrl}! Access your environment here: ${demoUrl}`); + log.info(`Onboarding setup completed for the site ${siteUrl}! Access your environment here: ${demoUrl}`); return ok({ message: 'Demo URL processor completed' }); } diff --git a/src/tasks/opportunity-status-processor/handler.js b/src/tasks/opportunity-status-processor/handler.js index 179a80c..8eb081a 100644 --- a/src/tasks/opportunity-status-processor/handler.js +++ b/src/tasks/opportunity-status-processor/handler.js @@ -11,17 +11,20 @@ */ import { ok } from '@adobe/spacecat-shared-http-utils'; -import { CloudWatchLogsClient, FilterLogEventsCommand } from '@aws-sdk/client-cloudwatch-logs'; import RUMAPIClient from '@adobe/spacecat-shared-rum-api-client'; import GoogleClient from '@adobe/spacecat-shared-google-client'; import { ScrapeClient } from '@adobe/spacecat-shared-scrape-client'; import { resolveCanonicalUrl } from '@adobe/spacecat-shared-utils'; +import { + checkAndAlertBotProtection, + checkAuditExecution, + getAuditFailureReason, +} from '../../utils/cloudwatch-utils.js'; import { say } from '../../utils/slack-utils.js'; import { getOpportunitiesForAudit } from './audit-opportunity-map.js'; import { OPPORTUNITY_DEPENDENCY_MAP } from './opportunity-dependency-map.js'; const TASK_TYPE = 'opportunity-status-processor'; -const AUDIT_WORKER_LOG_GROUP = '/aws/lambda/spacecat-services--audit-worker'; /** * Checks if RUM is available for a domain by attempting to get a domainkey @@ -127,9 +130,10 @@ function getOpportunityTitle(opportunityType) { * * @param {string} baseUrl - The base URL to check * @param {object} context - The context object with env and log + * @param {number} [onboardStartTime] - Optional onboard start timestamp to filter jobs * @returns {Promise<{available: boolean, results: Array}>} Scraping availability and URL results */ -async function isScrapingAvailable(baseUrl, context) { +async function isScrapingAvailable(baseUrl, context, onboardStartTime) { const { log } = context; try { @@ -144,15 +148,27 @@ async function isScrapingAvailable(baseUrl, context) { // Create scrape client const scrapeClient = ScrapeClient.createFrom(context); - // Get all scrape jobs for this baseUrl with 'default' processing type - const jobs = await scrapeClient.getScrapeJobsByBaseURL(baseUrl, 'default'); + // Get all scrape jobs for this baseUrl (all processing types) + const jobs = await scrapeClient.getScrapeJobsByBaseURL(baseUrl); if (!jobs || jobs.length === 0) { return { available: false, results: [] }; } - // Sort jobs by date (latest first) - assuming jobs have a timestamp field - const sortedJobs = jobs.sort((a, b) => { + // Filter jobs created after onboardStartTime + const filteredJobs = jobs.filter((job) => { + const jobTimestamp = new Date(job.startedAt || job.createdAt || 0).getTime(); + return jobTimestamp >= onboardStartTime; + }); + log.info(`Filtered ${filteredJobs.length} jobs created after onboardStartTime from ${jobs.length} total jobs`); + + if (filteredJobs.length === 0) { + log.info(`No scrape jobs found for ${baseUrl} after onboardStartTime ${new Date(onboardStartTime).toISOString()}`); + return { available: false, results: [] }; + } + + // Sort jobs by date (latest first) + const sortedJobs = filteredJobs.sort((a, b) => { const dateA = new Date(b.startedAt || b.createdAt || 0); const dateB = new Date(a.startedAt || a.createdAt || 0); return dateA - dateB; @@ -177,7 +193,6 @@ async function isScrapingAvailable(baseUrl, context) { log.info(`Scraping check: No jobs with URL results found for ${baseUrl}`); return { available: false, results: [] }; } - // Count successful and failed scrapes const completedCount = urlResults.filter((result) => result.status === 'COMPLETE').length; const failedCount = urlResults.filter((result) => result.status === 'FAILED').length; @@ -203,94 +218,11 @@ async function isScrapingAvailable(baseUrl, context) { } /** - * Searches CloudWatch logs for audit execution - * @param {string} auditType - The audit type to search for - * @param {string} siteId - The site ID - * @param {number} onboardStartTime - The onboarding start timestamp - * @param {object} context - The context object - * @returns {Promise} Whether the audit was executed - */ -async function checkAuditExecution(auditType, siteId, onboardStartTime, context) { - const { log, env } = context; - const logGroupName = AUDIT_WORKER_LOG_GROUP; - - try { - const cloudWatchClient = new CloudWatchLogsClient({ region: env.AWS_REGION || 'us-east-1' }); - const filterPattern = `"Received ${auditType} audit request for: ${siteId}"`; - - // Add small buffer before onboardStartTime to account for clock skew and processing delays - // The audit log should be after onboardStartTime, but we add a small buffer for safety - const bufferMs = 60 * 1000; // 1 minute - const searchStartTime = onboardStartTime ? onboardStartTime - bufferMs : undefined; - - const command = new FilterLogEventsCommand({ - logGroupName, - filterPattern, - startTime: searchStartTime, - endTime: Date.now(), - }); - - const response = await cloudWatchClient.send(command); - const found = response.events && response.events.length > 0; - - return found; - } catch (error) { - log.error(`Error checking audit execution for ${auditType}:`, error); - return false; - } -} - -/** - * Searches CloudWatch logs for audit failure reason - * @param {string} auditType - The audit type to search for - * @param {string} siteId - The site ID - * @param {number} onboardStartTime - The onboarding start timestamp - * @param {object} context - The context object - * @returns {Promise} The failure reason or null if not found + * Checks scrape results for bot protection blocking + * @param {Array} scrapeResults - Array of scrape URL results + * @param {object} context - The context object with log + * @returns {object|null} Bot protection details if detected, null otherwise */ -async function getAuditFailureReason(auditType, siteId, onboardStartTime, context) { - const { log, env } = context; - const logGroupName = AUDIT_WORKER_LOG_GROUP; - - try { - const cloudWatchClient = new CloudWatchLogsClient({ region: env.AWS_REGION || 'us-east-1' }); - const filterPattern = `"${auditType} audit for ${siteId} failed"`; - - // Add small buffer before onboardStartTime to account for clock skew and processing delays - const bufferMs = 30 * 1000; // 30 seconds - const searchStartTime = onboardStartTime ? onboardStartTime - bufferMs : undefined; - - const command = new FilterLogEventsCommand({ - logGroupName, - filterPattern, - startTime: searchStartTime, - endTime: Date.now(), - }); - - const response = await cloudWatchClient.send(command); - - if (response.events && response.events.length > 0) { - // Extract reason from the message - const { message } = response.events[0]; - const reasonMatch = message.match(/Reason:\s*([^]+?)(?:\s+at\s|$)/); - if (reasonMatch && reasonMatch[1]) { - return reasonMatch[1].trim(); - } - // Fallback: return entire message if "Reason:" pattern not found - return message.trim(); - } - - return null; - /* c8 ignore start */ - // Defensive error handling: Difficult to test as requires CloudWatch API to throw errors. - // Would need complex AWS SDK mocking infrastructure for marginal coverage gain. - } catch (error) { - log.error(`Error checking audit failure for ${auditType}:`, error); - return null; - } - /* c8 ignore stop */ -} - /** * Analyzes missing opportunities and determines the root cause * @param {Array} missingOpportunities - Array of missing opportunity types @@ -448,10 +380,10 @@ export async function runOpportunityStatusProcessor(message, context) { auditTypes.forEach((auditType) => { const opportunitiesForAudit = getOpportunitiesForAudit(auditType); if (opportunitiesForAudit.length === 0) { - // This audit type doesn't map to any known opportunities hasUnknownAuditTypes = true; + } else { + expectedOpportunityTypes = [...expectedOpportunityTypes, ...opportunitiesForAudit]; } - expectedOpportunityTypes = [...expectedOpportunityTypes, ...opportunitiesForAudit]; }); // Remove duplicates expectedOpportunityTypes = [...new Set(expectedOpportunityTypes)]; @@ -485,9 +417,43 @@ export async function runOpportunityStatusProcessor(message, context) { } if (needsScraping) { - const scrapingCheck = await isScrapingAvailable(siteUrl, context); + /* c8 ignore start */ + log.info(`[BOT-CHECK-TP] Scraping dependency detected, checking scraping availability for ${siteUrl}`); + log.info(`[BOT-CHECK-TP] onboardStartTime: ${new Date(onboardStartTime).toISOString()} (${onboardStartTime})`); + /* c8 ignore stop */ + + // First, get scraping availability and jobId + const scrapingCheck = await isScrapingAvailable(siteUrl, context, onboardStartTime); scrapingAvailable = scrapingCheck.available; + // Always check for bot protection, use jobId for precision if available + // If no jobId, fallback to searching all [BOT-BLOCKED] events in time window + /* c8 ignore start */ + if (scrapingCheck.jobId) { + log.info(`[BOT-CHECK-TP] Found scrape job ${scrapingCheck.jobId}, checking for bot protection`); + } else { + log.info('[BOT-CHECK-TP] No scrape job found yet, checking for bot protection using time-based filter'); + } + /* c8 ignore stop */ + + const botProtectionStats = await checkAndAlertBotProtection({ + jobId: scrapingCheck.jobId || null, + siteUrl, + searchStartTime: onboardStartTime, + slackContext, + context, + }); + + // Abort processing if bot protection detected + if (botProtectionStats && botProtectionStats.totalCount > 0) { + log.warn(`[BOT-BLOCKED] Bot protection blocking scrapes for ${siteUrl}`); + return ok({ + message: `Bot protection detected for ${siteUrl}`, + botProtectionDetected: true, + blockedUrlCount: botProtectionStats.totalCount, + }); + } + // Send Slack notification with scraping statistics if available if (scrapingCheck.stats && slackContext) { const { completed, failed, total } = scrapingCheck.stats; @@ -666,7 +632,7 @@ export async function runOpportunityStatusProcessor(message, context) { if (failedOpportunities.length > 0) { for (const failed of failedOpportunities) { // Use info icon for successful audits with zero suggestions - const emoji = failed.reason.includes('opportunity found with zero suggestions') ? ' :information_source:' : ' :x:'; + const emoji = failed.reason.includes('found no suggestions') ? ' :information_source:' : ' :x:'; auditErrors.push(`*${failed.title}*: ${failed.reason}${emoji}`); } } diff --git a/src/tasks/opportunity-status-processor/opportunity-dependency-map.js b/src/tasks/opportunity-status-processor/opportunity-dependency-map.js index 8024b31..efd03bd 100644 --- a/src/tasks/opportunity-status-processor/opportunity-dependency-map.js +++ b/src/tasks/opportunity-status-processor/opportunity-dependency-map.js @@ -21,11 +21,11 @@ export const OPPORTUNITY_DEPENDENCY_MAP = { cwv: ['RUM'], 'high-organic-low-ctr': ['RUM'], 'broken-internal-links': ['RUM', 'AHREFSImport'], - 'meta-tags': ['AHREFSImport'], - 'broken-backlinks': ['AHREFSImport'], - 'alt-text': ['AHREFSImport'], - 'form-accessibility': ['RUM'], - 'forms-opportunities': ['RUM'], + 'meta-tags': ['AHREFSImport', 'scraping'], // meta-tags audit uses scraping + 'broken-backlinks': ['AHREFSImport', 'scraping'], // broken-backlinks audit uses scraping + 'alt-text': ['AHREFSImport', 'scraping'], // alt-text audit uses scraping + 'form-accessibility': ['RUM', 'scraping'], // forms audit uses scraping + 'forms-opportunities': ['RUM', 'scraping'], // forms audit uses scraping }; /** diff --git a/src/utils/cloudwatch-utils.js b/src/utils/cloudwatch-utils.js new file mode 100644 index 0000000..c55824f --- /dev/null +++ b/src/utils/cloudwatch-utils.js @@ -0,0 +1,328 @@ +/* + * Copyright 2025 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import { CloudWatchLogsClient, FilterLogEventsCommand } from '@aws-sdk/client-cloudwatch-logs'; + +const AUDIT_WORKER_LOG_GROUP = '/aws/lambda/spacecat-services--audit-worker'; +const CONTENT_SCRAPER_LOG_GROUP = '/aws/lambda/spacecat-services--content-scraper'; + +/** + * Creates a CloudWatch Logs client + * @param {object} env - Environment variables + * @returns {CloudWatchLogsClient} Configured CloudWatch client + */ +function createCloudWatchClient(env) { + return new CloudWatchLogsClient({ + region: env.AWS_REGION || 'us-east-1', + }); +} + +/** + * Queries CloudWatch logs for bot protection errors from content scraper + * @param {string|null} jobId - The scrape job ID for filtering (optional) + * @param {object} context - Context with env and log + * @param {number} onboardStartTime - Onboard start timestamp (ms) to limit search window + * @returns {Promise} Array of bot protection events + */ +export async function queryBotProtectionLogs(jobId, context, onboardStartTime) { + const { env, log } = context; + + const cloudwatchClient = createCloudWatchClient(env); + const logGroupName = env.CONTENT_SCRAPER_LOG_GROUP || CONTENT_SCRAPER_LOG_GROUP; + + // Query logs from 5 minutes before onboard start time to now + // Buffer handles clock skew and CloudWatch log ingestion delays + const BUFFER_MS = 5 * 60 * 1000; // 5 minutes + const startTime = onboardStartTime - BUFFER_MS; + const endTime = Date.now(); + + /* c8 ignore start */ + log.info('[BOT-CHECK-TP] Querying CloudWatch logs:'); + log.info(`[BOT-CHECK-TP] Log Group: ${logGroupName}`); + log.info(`[BOT-CHECK-TP] Job ID: ${jobId || 'N/A (searching all bot protection events)'}`); + log.info(`[BOT-CHECK-TP] Time Range: ${new Date(startTime).toISOString()} to ${new Date(endTime).toISOString()}`); + log.info(`[BOT-CHECK-TP] Onboard Start Time (raw): ${new Date(onboardStartTime).toISOString()}`); + log.info('[BOT-CHECK-TP] Buffer Applied: 5 minutes'); + /* c8 ignore stop */ + + try { + // If jobId is provided, filter by both [BOT-BLOCKED] and jobId + // Otherwise, just filter by [BOT-BLOCKED] + const filterPattern = jobId ? `"[BOT-BLOCKED]" "${jobId}"` : '"[BOT-BLOCKED]"'; + + /* c8 ignore start */ + log.info(`[BOT-CHECK-TP] Filter Pattern: ${filterPattern}`); + log.info('[BOT-CHECK-TP] Sending CloudWatch query...'); + /* c8 ignore stop */ + + const command = new FilterLogEventsCommand({ + logGroupName, + startTime, + endTime, + // Filter pattern to find bot protection logs for this site in the time window + // Using text pattern since logs have prefix: + // [BOT-BLOCKED] Bot Protection Detection in Scraper: {...} + filterPattern, + limit: 100, // Max URLs per job + }); + + const response = await cloudwatchClient.send(command); + + /* c8 ignore start */ + log.info(`[BOT-CHECK-TP] CloudWatch query completed. Events found: ${response.events?.length || 0}`); + /* c8 ignore stop */ + + if (!response.events || response.events.length === 0) { + /* c8 ignore start */ + log.info('[BOT-CHECK-TP] No bot protection events found in CloudWatch response'); + /* c8 ignore stop */ + log.debug(`No bot protection logs found${jobId ? ` for job ${jobId}` : ''} in time window`); + return []; + } + + /* c8 ignore start */ + log.info(`[BOT-CHECK-TP] Raw CloudWatch events count: ${response.events.length}`); + log.info(`[BOT-CHECK-TP] Sample event message: ${response.events[0]?.message?.substring(0, 200)}`); + /* c8 ignore stop */ + + log.info(`Found ${response.events.length} bot protection events in CloudWatch logs${jobId ? ` for job ${jobId}` : ''}`); + + // Parse log events + const botProtectionEvents = response.events + .map((event) => { + try { + // CloudWatch log message format: "Bot Protection Detection in Scraper: { json }" + const messageMatch = event.message.match(/Bot Protection Detection in Scraper:\s+({.*})/); + if (messageMatch) { + return JSON.parse(messageMatch[1]); + } + /* c8 ignore start */ + log.warn(`[BOT-CHECK-TP] Event message did not match expected pattern: ${event.message?.substring(0, 100)}`); + /* c8 ignore stop */ + return null; + } catch (parseError) { + log.warn(`Failed to parse bot protection log event: ${event.message}`); + return null; + } + }) + .filter((event) => event !== null); + + /* c8 ignore start */ + log.info(`[BOT-CHECK-TP] Successfully parsed ${botProtectionEvents.length} bot protection events`); + /* c8 ignore stop */ + + return botProtectionEvents; + } catch (error) { + log.error('Failed to query CloudWatch logs for bot protection:', error); + // Don't fail the entire task processor run + return []; + } +} + +/** + * Aggregates bot protection events by HTTP status code and blocker type + * @param {Array} events - Array of bot protection events from logs + * @returns {object} Aggregated statistics + */ +export function aggregateBotProtectionStats(events) { + const stats = { + totalCount: events.length, + byHttpStatus: {}, + byBlockerType: {}, + urls: [], + highConfidenceCount: 0, // confidence >= 0.95 + }; + + for (const event of events) { + // Count by HTTP status + const status = event.httpStatus || 'unknown'; + stats.byHttpStatus[status] = (stats.byHttpStatus[status] || 0) + 1; + + // Count by blocker type + const blockerType = event.blockerType || 'unknown'; + stats.byBlockerType[blockerType] = (stats.byBlockerType[blockerType] || 0) + 1; + + // Track high confidence detections + if (event.confidence >= 0.95) { + stats.highConfidenceCount += 1; + } + + // Collect URLs (with details) + stats.urls.push({ + url: event.url, + httpStatus: event.httpStatus, + blockerType: event.blockerType, + confidence: event.confidence, + }); + } + + return stats; +} + +/** + * Checks for bot protection and sends Slack alert if detected + * This is a convenience function that combines CloudWatch querying, stats aggregation, + * and Slack alerting in one call to simplify handler logic. + * + * @param {Object} params - Parameters object + * @param {string|null} params.jobId - The scrape job ID (optional) + * @param {string} params.siteUrl - The site URL + * @param {number} params.searchStartTime - Search start timestamp (ms) + * @param {Object} params.slackContext - Slack context for sending messages + * @param {Object} params.context - Application context with env, log + * @returns {Promise} Bot protection stats if detected, null otherwise + */ +export async function checkAndAlertBotProtection({ + jobId = null, + siteUrl, + searchStartTime, + slackContext, + context, +}) { + const { log, env } = context; + + /* c8 ignore start */ + log.info(`[BOT-CHECK-TP] Starting bot protection check for site ${siteUrl}${jobId ? ` (job ${jobId})` : ''}`); + log.info(`[BOT-CHECK-TP] Search start time: ${new Date(searchStartTime).toISOString()}`); + /* c8 ignore stop */ + + // Query CloudWatch logs using jobId (if available) and time range + const logEvents = await queryBotProtectionLogs(jobId, context, searchStartTime); + + if (logEvents.length === 0) { + /* c8 ignore start */ + log.info(`[BOT-CHECK-TP] No bot protection detected for site ${siteUrl}${jobId ? ` (job ${jobId})` : ''}`); + /* c8 ignore stop */ + return null; + } + + /* c8 ignore start */ + log.info(`[BOT-CHECK-TP] Bot protection detected! Processing ${logEvents.length} events`); + /* c8 ignore stop */ + + // Aggregate statistics + const botProtectionStats = aggregateBotProtectionStats(logEvents); + log.warn( + `[BOT-BLOCKED] Bot protection detected: ${botProtectionStats.totalCount} URLs blocked ` + + `(from CloudWatch logs) for site ${siteUrl}${jobId ? ` (job ${jobId})` : ''}`, + ); + + // Send Slack alert - import dynamically to avoid circular dependency + const { formatAllowlistMessage } = await import('@adobe/spacecat-shared-utils'); + const { say, formatBotProtectionSlackMessage } = await import('./slack-utils.js'); + + const botIps = env.SPACECAT_BOT_IPS || ''; + const allowlistInfo = formatAllowlistMessage(botIps); + + await say( + env, + log, + slackContext, + formatBotProtectionSlackMessage({ + siteUrl, + stats: botProtectionStats, + allowlistIps: allowlistInfo.ips, + allowlistUserAgent: allowlistInfo.userAgent, + }), + ); + + return botProtectionStats; +} + +/** + * Checks if an audit was executed by searching Audit Worker logs + * @param {string} auditType - The audit type to search for + * @param {string} siteId - The site ID + * @param {number} onboardStartTime - The onboarding start timestamp + * @param {object} context - The context object with env and log + * @returns {Promise} Whether the audit was executed + */ +export async function checkAuditExecution(auditType, siteId, onboardStartTime, context) { + const { log, env } = context; + const logGroupName = env.AUDIT_WORKER_LOG_GROUP || AUDIT_WORKER_LOG_GROUP; + + try { + const cloudWatchClient = createCloudWatchClient(env); + const filterPattern = `"Received ${auditType} audit request for: ${siteId}"`; + + // Add small buffer before onboardStartTime to account for clock skew and processing delays + // The audit log should be after onboardStartTime, but we add a small buffer for safety + const bufferMs = 5 * 60 * 1000; // 5 minutes + const searchStartTime = onboardStartTime + ? onboardStartTime - bufferMs + : Date.now() - 30 * 60 * 1000; // 30 minutes ago + + const command = new FilterLogEventsCommand({ + logGroupName, + filterPattern, + startTime: searchStartTime, + endTime: Date.now(), + }); + + const response = await cloudWatchClient.send(command); + const found = response.events && response.events.length > 0; + + return found; + } catch (error) { + log.error(`Error checking audit execution for ${auditType}:`, error); + return false; + } +} + +/** + * Gets the failure reason for an audit by searching Audit Worker logs + * @param {string} auditType - The audit type to search for + * @param {string} siteId - The site ID + * @param {number} onboardStartTime - The onboarding start timestamp + * @param {object} context - The context object with env and log + * @returns {Promise} The failure reason or null if not found + */ +export async function getAuditFailureReason(auditType, siteId, onboardStartTime, context) { + const { log, env } = context; + const logGroupName = env.AUDIT_WORKER_LOG_GROUP || AUDIT_WORKER_LOG_GROUP; + + try { + const cloudWatchClient = createCloudWatchClient(env); + const filterPattern = `"${auditType} audit for ${siteId} failed"`; + + // Add small buffer before onboardStartTime to account for clock skew and processing delays + const bufferMs = 30 * 1000; // 30 seconds + const searchStartTime = onboardStartTime + ? onboardStartTime - bufferMs + : Date.now() - 30 * 60 * 1000; // 30 minutes ago + + const command = new FilterLogEventsCommand({ + logGroupName, + filterPattern, + startTime: searchStartTime, + endTime: Date.now(), + }); + + const response = await cloudWatchClient.send(command); + + if (response.events && response.events.length > 0) { + // Extract reason from the message + const { message } = response.events[0]; + const reasonMatch = message.match(/Reason:\s*([^]+?)(?:\s+at\s|$)/); + if (reasonMatch && reasonMatch[1]) { + return reasonMatch[1].trim(); + } + // Fallback: return entire message if "Reason:" pattern not found + return message.trim(); + } + + return null; + } catch (error) { + log.error(`Error getting audit failure reason for ${auditType}:`, error); + return null; + } +} diff --git a/src/utils/slack-utils.js b/src/utils/slack-utils.js index 1deb935..a8c9089 100644 --- a/src/utils/slack-utils.js +++ b/src/utils/slack-utils.js @@ -13,6 +13,39 @@ // eslint-disable-next-line import/no-unresolved import { hasText } from '@adobe/spacecat-shared-utils'; import { BaseSlackClient, SLACK_TARGETS } from '@adobe/spacecat-shared-slack-client'; + +/** + * Formats HTTP status code with emoji and description + * Only includes status codes that indicate bot protection (403, 200 with challenge page) + * @param {number|string} status - HTTP status code + * @returns {string} Formatted status string + */ +function formatHttpStatus(status) { + const statusMap = { + 403: '🚫 403 Forbidden', + 200: '⚠️ 200 OK (Challenge Page)', + unknown: '❓ Unknown Status', + }; + return statusMap[String(status)] || `⚠️ ${status}`; +} + +/** + * Formats blocker type with proper casing + * @param {string} type - Blocker type + * @returns {string} Formatted blocker type + */ +function formatBlockerType(type) { + const typeMap = { + cloudflare: 'Cloudflare', + akamai: 'Akamai', + imperva: 'Imperva', + fastly: 'Fastly', + cloudfront: 'AWS CloudFront', + unknown: 'Unknown Blocker', + }; + return typeMap[type] || type; +} + /** * Sends a message to Slack using the provided client and context * @param {object} slackClient - The Slack client instance @@ -50,3 +83,82 @@ export async function say(env, log, slackContext, message) { }); } } + +/** + * Formats bot protection details for Slack notifications with detailed statistics + * @param {Object} options - Options + * @param {string} options.siteUrl - Site URL + * @param {Object} options.stats - Bot protection statistics (from aggregateBotProtectionStats) + * @param {Array} options.allowlistIps - Array of IPs to allowlist + * @param {string} options.allowlistUserAgent - User-Agent to allowlist + * @returns {string} Formatted Slack message + */ +export function formatBotProtectionSlackMessage({ + siteUrl, + stats, + allowlistIps = [], + allowlistUserAgent, +}) { + const { + totalCount, + byHttpStatus, + byBlockerType, + urls, + highConfidenceCount, + } = stats; + + // Format HTTP status breakdown + const statusBreakdown = Object.entries(byHttpStatus) + .sort((a, b) => b[1] - a[1]) // Sort by count descending + .map(([status, count]) => ` • ${formatHttpStatus(status)}: ${count} URL${count > 1 ? 's' : ''}`) + .join('\n'); + + // Format blocker type breakdown + const blockerBreakdown = Object.entries(byBlockerType) + .sort((a, b) => b[1] - a[1]) + .map(([type, count]) => ` • ${formatBlockerType(type)}: ${count} URL${count > 1 ? 's' : ''}`) + .join('\n'); + + // Sample URLs (show up to 3, prioritize high confidence) + const sampleUrls = urls + .sort((a, b) => (b.confidence || 0) - (a.confidence || 0)) + .slice(0, 3) + .map((u) => { + const confidenceLabel = u.confidence >= 0.95 ? '(high confidence)' : ''; + return ` • ${u.url}\n ${formatHttpStatus(u.httpStatus)} · ${formatBlockerType(u.blockerType)} ${confidenceLabel}`; + }) + .join('\n'); + + const ipList = allowlistIps.map((ip) => ` • \`${ip}\``).join('\n'); + + let message = ':rotating_light: :warning: *Bot Protection Detected*\n\n' + + `*Summary:* ${totalCount} URL${totalCount > 1 ? 's' : ''} blocked by bot protection\n\n` + + '*📊 Detection Statistics*\n' + + `• *Total Blocked:* ${totalCount} URLs\n` + + `• *High Confidence:* ${highConfidenceCount} URLs\n\n` + + '*By HTTP Status:*\n' + /* c8 ignore next */ + + `${statusBreakdown || ' • No status data available'}\n\n` + + '*By Blocker Type:*\n' + /* c8 ignore next */ + + `${blockerBreakdown || ' • No blocker data available'}\n\n` + + '*🔍 Sample Blocked URLs*\n' + /* c8 ignore next */ + + `${sampleUrls || ' • No URL details available'}\n`; + + if (totalCount > 3) { + message += ` ... and ${totalCount - 3} more URLs\n`; + } + + message += '\n' + + '*✅ How to Resolve*\n' + + 'Allowlist SpaceCat Bot in your CDN/WAF:\n\n' + + '*User-Agent:*\n' + + ` • \`${allowlistUserAgent}\`\n\n` + + '*IP Addresses:*\n' + + `${ipList}\n\n` + + `*Site:* ${siteUrl}\n\n` + + ':bulb: _After allowlisting, re-run onboarding or trigger a new scrape._'; + + return message; +} diff --git a/test/tasks/demo-url-processor/demo-url-processor.test.js b/test/tasks/demo-url-processor/demo-url-processor.test.js index 7062fe4..5039beb 100644 --- a/test/tasks/demo-url-processor/demo-url-processor.test.js +++ b/test/tasks/demo-url-processor/demo-url-processor.test.js @@ -92,7 +92,7 @@ describe('Demo URL Processor', () => { organizationId: 'test-org-id', })).to.be.true; const expectedDemoUrl = 'https://example.com?organizationId=test-org-id#/@adobe-sites-engineering/sites-optimizer/sites/test-site-id/home'; - expect(context.log.info.calledWith(`Onboarding setup completed successfully for the site example.com! Access your environment here: ${expectedDemoUrl}`)).to.be.true; + expect(context.log.info.calledWith(`Onboarding setup completed for the site example.com! Access your environment here: ${expectedDemoUrl}`)).to.be.true; }); it('should handle organization not found error', async () => { @@ -104,7 +104,7 @@ describe('Demo URL Processor', () => { // Should log error and return early expect(context.log.error.calledWith('Organization not found for organizationId: test-org-id')).to.be.true; // Should not log the success message - expect(context.log.info.calledWithMatch(sinon.match('Onboarding setup completed successfully for the site example.com!'))).to.be.false; + expect(context.log.info.calledWithMatch(sinon.match('Onboarding setup completed for the site example.com!'))).to.be.false; }); it('should use tenantId when available (highest priority)', async () => { @@ -119,7 +119,7 @@ describe('Demo URL Processor', () => { // Should use the tenantId (highest priority) const expectedDemoUrl = 'https://example.com?organizationId=test-org-id#/@adobe-sites-engineering/sites-optimizer/sites/test-site-id/home'; - expect(context.log.info.calledWith(`Onboarding setup completed successfully for the site example.com! Access your environment here: ${expectedDemoUrl}`)).to.be.true; + expect(context.log.info.calledWith(`Onboarding setup completed for the site example.com! Access your environment here: ${expectedDemoUrl}`)).to.be.true; }); it('should fallback to name when tenantId is missing (backward compatibility)', async () => { @@ -137,7 +137,7 @@ describe('Demo URL Processor', () => { // Should use the name-based tenant (lowercase, no spaces) as fallback const expectedDemoUrl = 'https://example.com?organizationId=test-org-id#/@adobesitesengineering/sites-optimizer/sites/test-site-id/home'; - expect(context.log.info.calledWith(`Onboarding setup completed successfully for the site example.com! Access your environment here: ${expectedDemoUrl}`)).to.be.true; + expect(context.log.info.calledWith(`Onboarding setup completed for the site example.com! Access your environment here: ${expectedDemoUrl}`)).to.be.true; }); it('should fallback to DEFAULT_TENANT_ID when both name and tenantId are missing', async () => { @@ -158,7 +158,7 @@ describe('Demo URL Processor', () => { // Should log error about using default tenant ID expect(context.log.error.calledWith('Using default tenant ID')).to.be.true; const expectedDemoUrl = 'https://example.com?organizationId=test-org-id#/@default-tenant/sites-optimizer/sites/test-site-id/home'; - expect(context.log.info.calledWith(`Onboarding setup completed successfully for the site example.com! Access your environment here: ${expectedDemoUrl}`)).to.be.true; + expect(context.log.info.calledWith(`Onboarding setup completed for the site example.com! Access your environment here: ${expectedDemoUrl}`)).to.be.true; }); it('should return success message when processing completes', async () => { @@ -171,7 +171,7 @@ describe('Demo URL Processor', () => { await runDemoUrlProcessor(message, context); // Verify that the success message was logged - expect(context.log.info.calledWithMatch(sinon.match('Onboarding setup completed successfully for the site example.com!'))).to.be.true; + expect(context.log.info.calledWithMatch(sinon.match('Onboarding setup completed for the site example.com!'))).to.be.true; }); it('should handle error when Organization.findById throws an exception', async () => { @@ -194,7 +194,7 @@ describe('Demo URL Processor', () => { // the error handling works and the function completes successfully. // Verify that the success message was still logged (since the function continues) - expect(context.log.info.calledWithMatch(sinon.match('Onboarding setup completed successfully for the site example.com!'))).to.be.true; + expect(context.log.info.calledWithMatch(sinon.match('Onboarding setup completed for the site example.com!'))).to.be.true; // Verify that the processing log was recorded expect(context.log.info.calledWith('Processing demo url for site:', { diff --git a/test/tasks/opportunity-status-processor/opportunity-dependency-map.test.js b/test/tasks/opportunity-status-processor/opportunity-dependency-map.test.js index 5b97b41..f86cd6e 100644 --- a/test/tasks/opportunity-status-processor/opportunity-dependency-map.test.js +++ b/test/tasks/opportunity-status-processor/opportunity-dependency-map.test.js @@ -33,8 +33,11 @@ describe('Opportunity Dependency Map', () => { expect(OPPORTUNITY_DEPENDENCY_MAP.cwv).to.deep.equal(['RUM']); expect(OPPORTUNITY_DEPENDENCY_MAP['high-organic-low-ctr']).to.deep.equal(['RUM']); expect(OPPORTUNITY_DEPENDENCY_MAP['broken-internal-links']).to.deep.equal(['RUM', 'AHREFSImport']); - expect(OPPORTUNITY_DEPENDENCY_MAP['meta-tags']).to.deep.equal(['AHREFSImport']); - expect(OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']).to.deep.equal(['AHREFSImport']); + expect(OPPORTUNITY_DEPENDENCY_MAP['meta-tags']).to.deep.equal(['AHREFSImport', 'scraping']); + expect(OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']).to.deep.equal(['AHREFSImport', 'scraping']); + expect(OPPORTUNITY_DEPENDENCY_MAP['alt-text']).to.deep.equal(['AHREFSImport', 'scraping']); + expect(OPPORTUNITY_DEPENDENCY_MAP['form-accessibility']).to.deep.equal(['RUM', 'scraping']); + expect(OPPORTUNITY_DEPENDENCY_MAP['forms-opportunities']).to.deep.equal(['RUM', 'scraping']); }); }); diff --git a/test/tasks/opportunity-status-processor/opportunity-status-processor.test.js b/test/tasks/opportunity-status-processor/opportunity-status-processor.test.js index 20354b5..5b71c8c 100644 --- a/test/tasks/opportunity-status-processor/opportunity-status-processor.test.js +++ b/test/tasks/opportunity-status-processor/opportunity-status-processor.test.js @@ -50,6 +50,16 @@ describe('Opportunity Status Processor', () => { text: sandbox.stub().resolves('User-agent: *\nAllow: /'), }); + // Mock S3 client + const mockS3Client = { + send: sandbox.stub().resolves({ + Body: { + transformToString: sandbox.stub().resolves('{}'), + }, + ContentType: 'application/json', + }), + }; + // Mock context context = new MockContextBuilder() .withSandbox(sandbox) @@ -61,6 +71,9 @@ describe('Opportunity Status Processor', () => { allBySiteIdAndSourceAndGeo: sandbox.stub().resolves([]), }, }) + .withOverrides({ + s3Client: mockS3Client, + }) .build(); // Mock message @@ -434,6 +447,13 @@ describe('Opportunity Status Processor', () => { }, }; + // Mock ScrapeClient to prevent hanging + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([]), + }; + const scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); + await runOpportunityStatusProcessor(testMessage, testContext); // Verify RUM was checked successfully - this should cover lines 26-37 @@ -441,6 +461,7 @@ describe('Opportunity Status Processor', () => { expect(mockRUMClient.retrieveDomainkey.calledWith('example.com')).to.be.true; expect(testContext.log.info.calledWith('RUM is available for domain: example.com')).to.be.true; + scrapeClientStub.restore(); createFromStub.restore(); }); @@ -526,50 +547,67 @@ describe('Opportunity Status Processor', () => { sinon.restore(); }); - it('should handle GSC configuration success', async () => { - // Mock GSC success - mockGoogleClient.listSites.resolves({ - data: { - siteEntry: [ - { siteUrl: 'https://example.com' }, - ], - }, - }); + it('should handle GSC configuration success', async function () { + this.timeout(5000); + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + let scrapeClientStub = null; - const GoogleClient = await import('@adobe/spacecat-shared-google-client'); - const createFromStub = sinon.stub(GoogleClient.default, 'createFrom').resolves(mockGoogleClient); + try { + // Mock GSC success + mockGoogleClient.listSites.resolves({ + data: { + siteEntry: [ + { siteUrl: 'https://example.com' }, + ], + }, + }); - const testMessage = { - siteId: 'test-site-id', - siteUrl: 'https://example.com', - organizationId: 'test-org-id', - taskContext: { - auditTypes: ['cwv'], - slackContext: null, - }, - }; + const GoogleClient = await import('@adobe/spacecat-shared-google-client'); + const createFromStub = sinon.stub(GoogleClient.default, 'createFrom').resolves(mockGoogleClient); - const testContext = { - ...mockContext, - dataAccess: { - Site: { - findById: sinon.stub().resolves({ - getOpportunities: sinon.stub().resolves([]), - }), + const testMessage = { + siteId: 'test-site-id', + siteUrl: 'https://example.com', + organizationId: 'test-org-id', + taskContext: { + auditTypes: ['cwv'], + slackContext: null, }, - SiteTopPage: { - allBySiteIdAndSourceAndGeo: sinon.stub().resolves([]), + }; + + const testContext = { + ...mockContext, + dataAccess: { + Site: { + findById: sinon.stub().resolves({ + getOpportunities: sinon.stub().resolves([]), + }), + }, + SiteTopPage: { + allBySiteIdAndSourceAndGeo: sinon.stub().resolves([]), + }, }, - }, - }; + }; - await runOpportunityStatusProcessor(testMessage, testContext); + // Mock scrape client to avoid hanging + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([]), + getScrapeJobUrlResults: sinon.stub().resolves([]), + }; + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); - // GSC is not checked because 'cwv' opportunity only requires RUM, not GSC - // So GoogleClient.createFrom should NOT be called - expect(createFromStub.called).to.be.false; + await runOpportunityStatusProcessor(testMessage, testContext); - createFromStub.restore(); + // GSC is not checked because 'cwv' opportunity only requires RUM, not GSC + // So GoogleClient.createFrom should NOT be called + expect(createFromStub.called).to.be.false; + + createFromStub.restore(); + } finally { + if (scrapeClientStub && scrapeClientStub.restore) { + scrapeClientStub.restore(); + } + } }); it('should handle GSC configuration failure', async () => { @@ -729,10 +767,19 @@ describe('Opportunity Status Processor', () => { // Mock site with no opportunities mockSite.getOpportunities.resolves([]); + // Mock ScrapeClient to prevent hanging + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([]), + }; + const scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); + await runOpportunityStatusProcessor(message, context); // Should detect missing cwv opportunity expect(context.log.warn.calledWithMatch('Missing opportunities')).to.be.true; + + scrapeClientStub.restore(); }); it('should log all expected opportunities when present', async () => { @@ -760,23 +807,6 @@ describe('Opportunity Status Processor', () => { expect(mockOpportunities[1].getSuggestions.called).to.be.true; }); - it('should check scraping for site with URL', async () => { - message.siteUrl = 'https://www.example.com'; - - const mockOpportunities = [ - { - getType: () => 'alt-text', - getSuggestions: sinon.stub().resolves([]), - }, - ]; - mockSite.getOpportunities.resolves(mockOpportunities); - - await runOpportunityStatusProcessor(message, context); - - // Scraping check should be performed - expect(mockSite.getOpportunities.called).to.be.true; - }); - it('should handle when auditTypes is empty array', async () => { message.taskContext.auditTypes = []; @@ -971,30 +1001,47 @@ describe('Opportunity Status Processor', () => { expect(mockSite.getOpportunities.called).to.be.true; }); - it('should show no failures message when all checks pass', async () => { - message.siteUrl = 'https://example.com'; - message.taskContext.slackContext = { - channelId: 'test-channel', - threadTs: 'test-thread', - }; + it('should show no failures message when all checks pass', async function () { + this.timeout(5000); + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + let scrapeClientStub = null; - // Mock all services as available - context.dataAccess.SiteTopPage.allBySiteIdAndSourceAndGeo.resolves([ - { url: 'https://example.com/page1' }, - ]); + try { + message.siteUrl = 'https://example.com'; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; - const mockOpportunities = [ - { - getType: () => 'cwv', - getSuggestions: sinon.stub().resolves(['suggestion1']), - }, - ]; - mockSite.getOpportunities.resolves(mockOpportunities); + // Mock all services as available + context.dataAccess.SiteTopPage.allBySiteIdAndSourceAndGeo.resolves([ + { url: 'https://example.com/page1' }, + ]); - await runOpportunityStatusProcessor(message, context); + const mockOpportunities = [ + { + getType: () => 'cwv', + getSuggestions: sinon.stub().resolves(['suggestion1']), + }, + ]; + mockSite.getOpportunities.resolves(mockOpportunities); - // Should complete successfully - expect(mockSite.getOpportunities.called).to.be.true; + // Mock scrape client to avoid hanging + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([]), + getScrapeJobUrlResults: sinon.stub().resolves([]), + }; + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); + + await runOpportunityStatusProcessor(message, context); + + // Should complete successfully + expect(mockSite.getOpportunities.called).to.be.true; + } finally { + if (scrapeClientStub && scrapeClientStub.restore) { + scrapeClientStub.restore(); + } + } }); }); @@ -1052,25 +1099,42 @@ describe('Opportunity Status Processor', () => { expect(mockSite.getOpportunities.called).to.be.true; }); - it('should handle opportunities with empty runbook', async () => { - message.siteUrl = 'https://example.com'; - message.taskContext.slackContext = { - channelId: 'test-channel', - threadTs: 'test-thread', - }; + it('should handle opportunities with empty runbook', async function () { + this.timeout(5000); + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + let scrapeClientStub = null; - const mockOpportunities = [ - { - getType: () => 'cwv', - getSuggestions: sinon.stub().resolves([]), - getData: () => ({ runbook: '' }), - }, - ]; - mockSite.getOpportunities.resolves(mockOpportunities); + try { + message.siteUrl = 'https://example.com'; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; - await runOpportunityStatusProcessor(message, context); + const mockOpportunities = [ + { + getType: () => 'cwv', + getSuggestions: sinon.stub().resolves([]), + getData: () => ({ runbook: '' }), + }, + ]; + mockSite.getOpportunities.resolves(mockOpportunities); - expect(mockSite.getOpportunities.called).to.be.true; + // Mock scrape client to avoid hanging + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([]), + getScrapeJobUrlResults: sinon.stub().resolves([]), + }; + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); + + await runOpportunityStatusProcessor(message, context); + + expect(mockSite.getOpportunities.called).to.be.true; + } finally { + if (scrapeClientStub && scrapeClientStub.restore) { + scrapeClientStub.restore(); + } + } }); it('should handle opportunities with null runbook', async () => { @@ -1362,21 +1426,6 @@ describe('Opportunity Status Processor', () => { expect(mockSite.getOpportunities.called).to.be.true; }); - it('should handle empty opportunities with Slack output', async () => { - message.siteUrl = 'https://example.com'; - message.taskContext.slackContext = { - channelId: 'test-channel', - threadTs: 'test-thread', - }; - - mockSite.getOpportunities.resolves([]); - - await runOpportunityStatusProcessor(message, context); - - // Should show "No opportunities found for this site" - expect(mockSite.getOpportunities.called).to.be.true; - }); - it('should trigger all service preconditions passed log', async () => { message.siteUrl = 'https://example.com'; message.taskContext.slackContext = { @@ -1907,22 +1956,31 @@ describe('Opportunity Status Processor', () => { }); it('should handle no scrape jobs found (line 149-150)', async () => { - // Import ScrapeClient and create stub - const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); - const { ScrapeClient } = scrapeModule; + // Temporarily add scraping dependency to trigger scraping check + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; const mockScrapeClient = { getScrapeJobsByBaseURL: sinon.stub().resolves([]), getScrapeJobUrlResults: sinon.stub(), }; - const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); - - // Temporarily add scraping dependency to trigger scraping check - const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); - const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + const mockScrapeClientClass = { + createFrom: sinon.stub().returns(mockScrapeClient), + }; try { + // Use esmock to mock the ScrapeClient module + const esmock = (await import('esmock')).default; + const handler = await esmock('../../../src/tasks/opportunity-status-processor/handler.js', { + '@adobe/spacecat-shared-scrape-client': { ScrapeClient: mockScrapeClientClass }, + '../../../src/utils/cloudwatch-utils.js': { + checkAndAlertBotProtection: sinon.stub().resolves(null), + checkAuditExecution: sinon.stub().resolves(true), + getAuditFailureReason: sinon.stub().resolves(null), + }, + }); + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; message.siteUrl = 'https://example.com'; @@ -1931,15 +1989,15 @@ describe('Opportunity Status Processor', () => { channelId: 'test-channel', threadTs: 'test-thread', }; + message.taskContext.onboardStartTime = Date.now(); mockSite.getOpportunities.resolves([]); - await runOpportunityStatusProcessor(message, context); + await handler.runOpportunityStatusProcessor(message, context); - // Verify that scraping check was performed - expect(mockScrapeClient.getScrapeJobsByBaseURL.calledWith('https://example.com', 'default')).to.be.true; + // Verify that scraping check was performed (all processing types) + expect(mockScrapeClient.getScrapeJobsByBaseURL.calledWith('https://example.com')).to.be.true; } finally { - // Cleanup - always restore even if test fails - scrapeClientStub.restore(); + // Cleanup dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; } }); @@ -1949,16 +2007,6 @@ describe('Opportunity Status Processor', () => { const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); const { ScrapeClient } = scrapeModule; - const mockScrapeClient = { - getScrapeJobsByBaseURL: sinon.stub().resolves([ - { id: 'job-1', startedAt: '2025-01-15T10:00:00Z' }, - { id: 'job-2', createdAt: '2025-01-14T10:00:00Z' }, - ]), - getScrapeJobUrlResults: sinon.stub().resolves([]), // No results for any job - }; - - const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); - // Temporarily add scraping dependency const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; @@ -1972,16 +2020,36 @@ describe('Opportunity Status Processor', () => { channelId: 'test-channel', threadTs: 'test-thread', }; + message.taskContext.onboardStartTime = Date.now() - 3600000; // 1 hour ago + context.env.AWS_REGION = 'us-east-1'; // Required for CloudWatch client + + const mockScrapeClient = { + getScrapeJobsByBaseURL: sinon.stub().resolves([ + // Jobs AFTER onboardStartTime so they're not filtered out + { id: 'job-1', startedAt: new Date(Date.now() - 1800000).toISOString() }, // 30 min ago + { id: 'job-2', createdAt: new Date(Date.now() - 2400000).toISOString() }, // 40 min ago + ]), + getScrapeJobUrlResults: sinon.stub().resolves([]), // No results for any job + }; + + const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); mockSite.getOpportunities.resolves([]); + // Mock CloudWatch to return NO bot protection events + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ events: [] }); + await runOpportunityStatusProcessor(message, context); // Verify that scraping jobs were checked expect(mockScrapeClient.getScrapeJobsByBaseURL.called).to.be.true; expect(mockScrapeClient.getScrapeJobUrlResults.called).to.be.true; - } finally { + // Cleanup + cloudWatchStub.restore(); scrapeClientStub.restore(); + } finally { dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; } }); @@ -1991,24 +2059,6 @@ describe('Opportunity Status Processor', () => { const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); const { ScrapeClient } = scrapeModule; - const getScrapeJobUrlResultsStub = sinon.stub(); - getScrapeJobUrlResultsStub - .onFirstCall().resolves([]) // job-recent has no results - .onSecondCall().resolves([ // job-old has results - { url: 'https://example.com/page1', status: 'COMPLETE' }, - ]); - - const mockScrapeClient = { - getScrapeJobsByBaseURL: sinon.stub().resolves([ - { id: 'job-old', createdAt: '2025-01-01T10:00:00Z' }, - { id: 'job-recent', startedAt: '2025-01-15T10:00:00Z' }, - { id: 'job-oldest', createdAt: '2024-12-01T10:00:00Z' }, - ]), - getScrapeJobUrlResults: getScrapeJobUrlResultsStub, - }; - - const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); - // Temporarily add scraping dependency const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; @@ -2022,16 +2072,44 @@ describe('Opportunity Status Processor', () => { channelId: 'test-channel', threadTs: 'test-thread', }; + message.taskContext.onboardStartTime = Date.now() - 3600000; // 1 hour ago + context.env.AWS_REGION = 'us-east-1'; // Required for CloudWatch client + + const getScrapeJobUrlResultsStub = sinon.stub(); + getScrapeJobUrlResultsStub + .onFirstCall().resolves([]) // job-recent has no results + .onSecondCall().resolves([ // job-old has results + { url: 'https://example.com/page1', status: 'COMPLETE' }, + ]); + + const mockScrapeClient = { + getScrapeJobsByBaseURL: sinon.stub().resolves([ + // All jobs AFTER onboardStartTime so they're not filtered out + { id: 'job-old', createdAt: new Date(Date.now() - 2400000).toISOString() }, // 40 min ago + { id: 'job-recent', startedAt: new Date(Date.now() - 600000).toISOString() }, // 10 min ago (most recent) + { id: 'job-oldest', createdAt: new Date(Date.now() - 3000000).toISOString() }, // 50 min ago + ]), + getScrapeJobUrlResults: getScrapeJobUrlResultsStub, + }; + + const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); mockSite.getOpportunities.resolves([]); + // Mock CloudWatch to return NO bot protection events + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ events: [] }); + await runOpportunityStatusProcessor(message, context); // Verify jobs were checked in order (sorted by date) expect(mockScrapeClient.getScrapeJobUrlResults.calledWith('job-recent')).to.be.true; expect(mockScrapeClient.getScrapeJobUrlResults.calledWith('job-old')).to.be.true; - } finally { + // Cleanup + cloudWatchStub.restore(); scrapeClientStub.restore(); + } finally { dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; } }); @@ -2041,18 +2119,6 @@ describe('Opportunity Status Processor', () => { const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); const { ScrapeClient } = scrapeModule; - const mockScrapeClient = { - getScrapeJobsByBaseURL: sinon.stub().resolves([ - { id: 'job-1', startedAt: '2025-01-15T10:00:00Z' }, - ]), - getScrapeJobUrlResults: sinon.stub().resolves([ - { url: 'https://example.com/page1', status: 'COMPLETE' }, - { url: 'https://example.com/page2', status: 'FAILED' }, - ]), - }; - - const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); - // Temporarily add scraping dependency const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; @@ -2066,38 +2132,48 @@ describe('Opportunity Status Processor', () => { channelId: 'test-channel', threadTs: 'test-thread', }; + message.taskContext.onboardStartTime = Date.now() - 3600000; + context.env.AWS_REGION = 'us-east-1'; // Required for CloudWatch client + + const mockScrapeClient = { + getScrapeJobsByBaseURL: sinon.stub().resolves([ + // Job AFTER onboardStartTime so it's not filtered out + { id: 'job-1', startedAt: new Date(Date.now() - 1800000).toISOString() }, // 30 min ago + ]), + getScrapeJobUrlResults: sinon.stub().resolves([ + { url: 'https://example.com/page1', status: 'COMPLETE' }, + { url: 'https://example.com/page2', status: 'FAILED' }, + ]), + }; + + const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); mockSite.getOpportunities.resolves([]); + // Mock CloudWatch to return NO bot protection events + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ events: [] }); + await runOpportunityStatusProcessor(message, context); // Should detect successful scrape (at least one COMPLETE) - // Verify that scraping was checked and completed successfully - expect(mockScrapeClient.getScrapeJobsByBaseURL.calledWith('https://example.com', 'default')).to.be.true; + // Verify that scraping was checked and completed successfully (all processing types) + expect(mockScrapeClient.getScrapeJobsByBaseURL.calledWith('https://example.com')).to.be.true; expect(mockScrapeClient.getScrapeJobUrlResults.calledOnce).to.be.true; - } finally { + // Cleanup + cloudWatchStub.restore(); scrapeClientStub.restore(); + } finally { dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; } }); - it('should handle all FAILED scrape results and detect missing scraping dependency (lines 181, 347-348)', async () => { + it('should handle jobs with completely missing timestamps (line 160, 172-173)', async () => { // Import ScrapeClient and create stub const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); const { ScrapeClient } = scrapeModule; - const mockScrapeClient = { - getScrapeJobsByBaseURL: sinon.stub().resolves([ - { id: 'job-1', startedAt: '2025-01-15T10:00:00Z' }, - ]), - getScrapeJobUrlResults: sinon.stub().resolves([ - { url: 'https://example.com/page1', status: 'FAILED' }, - { url: 'https://example.com/page2', status: 'FAILED' }, - ]), - }; - - const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); - // Temporarily add scraping dependency const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; @@ -2107,74 +2183,109 @@ describe('Opportunity Status Processor', () => { message.siteUrl = 'https://example.com'; message.taskContext.auditTypes = ['broken-backlinks']; - // Set onboard time to trigger analysis - message.taskContext.onboardStartTime = Date.now() - 3600000; message.taskContext.slackContext = { channelId: 'test-channel', threadTs: 'test-thread', }; + // Set onboardStartTime to 0 so jobs with timestamp 0 can pass the filter + message.taskContext.onboardStartTime = 0; + context.env.AWS_REGION = 'us-east-1'; + + const mockScrapeClient = { + getScrapeJobsByBaseURL: sinon.stub().resolves([ + // Job with NO timestamps - triggers || 0 on line 160 (filter), and lines 172-173 (sort) + { id: 'job-no-timestamps' }, + // Job with only createdAt, no startedAt - line 172: b.startedAt || b.createdAt + { id: 'job-created-only', createdAt: new Date(Date.now() - 1200000).toISOString() }, + // Job with only startedAt, no createdAt - line 173: a.startedAt || a.createdAt + { id: 'job-started-only', startedAt: new Date(Date.now() - 1800000).toISOString() }, + // Job with both - ensures sort comparisons happen + { id: 'job-both', startedAt: new Date(Date.now() - 600000).toISOString(), createdAt: new Date(Date.now() - 900000).toISOString() }, + ]), + getScrapeJobUrlResults: sinon.stub().resolves([]), + }; + + const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); mockSite.getOpportunities.resolves([]); + // Mock CloudWatch + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ events: [] }); + await runOpportunityStatusProcessor(message, context); - // Should detect scraping NOT available (no COMPLETE status) - expect(mockScrapeClient.getScrapeJobUrlResults.calledOnce).to.be.true; - // Should trigger missing opportunities analysis with scraping dependency unmet - } finally { + // Verify jobs were processed and sorted + expect(mockScrapeClient.getScrapeJobsByBaseURL.called).to.be.true; + // The sort function will compare all pairs, hitting both line 172 and 173 + // Cleanup + cloudWatchStub.restore(); scrapeClientStub.restore(); + } finally { dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; } }); + }); - it('should handle jobs sorted by startedAt vs createdAt (lines 154-158)', async () => { - // Import ScrapeClient and create stub - const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); - const { ScrapeClient } = scrapeModule; - - const getScrapeJobUrlResultsStub = sinon.stub(); - getScrapeJobUrlResultsStub - .onFirstCall().resolves([{ url: 'https://example.com/page1', status: 'COMPLETE' }]); - - const mockScrapeClient = { - getScrapeJobsByBaseURL: sinon.stub().resolves([ - { id: 'job-has-started', startedAt: '2025-01-20T10:00:00Z', createdAt: '2025-01-15T10:00:00Z' }, - { id: 'job-only-created', createdAt: '2025-01-18T10:00:00Z' }, - { id: 'job-no-dates' }, // No dates, defaults to 0 - ]), - getScrapeJobUrlResults: getScrapeJobUrlResultsStub, + describe('Additional coverage for uncovered lines', () => { + it('should use info icon for opportunities with no suggestions (line 621)', async () => { + // Mock Slack client + const mockSlackClient = { + postMessage: sinon.stub().resolves(), }; + const SlackClientModule = await import('@adobe/spacecat-shared-slack-client'); + const slackStub = sinon.stub(SlackClientModule.BaseSlackClient, 'createFrom').returns(mockSlackClient); - const scrapeClientStub = sinon.stub(ScrapeClient, 'createFrom').returns(mockScrapeClient); - - // Temporarily add scraping dependency - const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); - const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + message.siteUrl = 'https://example.com'; + message.taskContext.auditTypes = ['cwv', 'broken-backlinks']; + message.taskContext.onboardStartTime = Date.now() - 3600000; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + context.env.AWS_REGION = 'us-east-1'; - try { - dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + // Mock TWO opportunities with no suggestions to ensure loop executes multiple times + const mockOpportunity1 = { + getType: () => 'cwv', + getSuggestions: sinon.stub().resolves([]), // No suggestions + }; - message.siteUrl = 'https://example.com'; - message.taskContext.auditTypes = ['broken-backlinks']; - message.taskContext.slackContext = { - channelId: 'test-channel', - threadTs: 'test-thread', - }; - mockSite.getOpportunities.resolves([]); + const mockOpportunity2 = { + getType: () => 'broken-backlinks', + getSuggestions: sinon.stub().resolves([]), // No suggestions + }; + + mockSite.getOpportunities.resolves([mockOpportunity1, mockOpportunity2]); + // Mock CloudWatch - no bot protection + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ events: [] }); + + try { await runOpportunityStatusProcessor(message, context); - // Should check job-has-started first (most recent startedAt) - expect(mockScrapeClient.getScrapeJobUrlResults.firstCall.calledWith('job-has-started')).to.be.true; + // Verify Slack messages were sent + const postMessageCalls = mockSlackClient.postMessage.getCalls(); + expect(postMessageCalls.length).to.be.at.least(1); + + // Line 621 should be executed for both opportunities + // Find messages with the error details + const allMessages = postMessageCalls.map((c) => c.args[0]?.text).join('\n'); + + // Both opportunities should appear with :information_source: emoji + expect(allMessages).to.include('Core Web Vitals'); + expect(allMessages).to.include('Broken Backlinks'); + expect(allMessages).to.include(':information_source:'); + expect(allMessages).to.include('found no suggestions'); } finally { - // Cleanup - scrapeClientStub.restore(); - dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + cloudWatchStub.restore(); + slackStub.restore(); } }); - }); - describe('Additional coverage for uncovered lines', () => { it('should handle empty baseUrl in scraping check (lines 138-139)', async () => { const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); const { ScrapeClient } = scrapeModule; @@ -2298,4 +2409,941 @@ describe('Opportunity Status Processor', () => { } }); }); + + describe('Bot Protection Detection', () => { + let mockScrapeClient; + let scrapeClientStub; + let mockSlackClient; + let BaseSlackClientStub; + + beforeEach(async () => { + // Restore any previous BaseSlackClient stub first + if (BaseSlackClientStub && BaseSlackClientStub.restore) { + BaseSlackClientStub.restore(); + } + + // Create fresh mock scrape client with new stubs for each test + mockScrapeClient = { + getScrapeJobsByBaseURL: sinon.stub(), + getScrapeJobUrlResults: sinon.stub(), + }; + + // Create fresh mock Slack client with new stubs for each test + mockSlackClient = { + postMessage: sinon.stub().resolves(), + }; + + const SlackClientModule = await import('@adobe/spacecat-shared-slack-client'); + BaseSlackClientStub = sinon.stub(SlackClientModule.BaseSlackClient, 'createFrom').returns(mockSlackClient); + + // Reset mock site + mockSite.getOpportunities.resolves([]); + + // Recreate S3 client stub (it was restored by afterEach sinon.restore()) + context.s3Client = { + send: sinon.stub().resolves({ + Body: { + transformToString: sinon.stub().resolves('{}'), + }, + ContentType: 'application/json', + }), + }; + + // Reset AWS_REGION to ensure each test starts fresh + delete context.env.AWS_REGION; + }); + + afterEach(() => { + // Restore BaseSlackClient stub + if (BaseSlackClientStub && BaseSlackClientStub.restore) { + BaseSlackClientStub.restore(); + } + + // Restore scrape client stub + if (scrapeClientStub && scrapeClientStub.restore) { + try { + scrapeClientStub.restore(); + } catch (e) { + // Already restored, ignore + } + scrapeClientStub = null; + } + }); + + it('should detect bot protection from CloudWatch logs and send Slack alert', async function () { + this.timeout(5000); + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + // Make broken-backlinks require scraping + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://zepbound.lilly.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + // Set onboard time to trigger bot protection check + message.taskContext.onboardStartTime = Date.now() - 3600000; + context.env.AWS_REGION = 'us-east-1'; // Production environment + context.env.SPACECAT_BOT_IPS = '3.218.16.42,52.55.82.37,54.172.145.38'; + + // Ensure mockSite returns empty opportunities + mockSite.getOpportunities.resolves([]); + + // Mock ScrapeClient - needed to get jobId for bot protection check + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([ + { + id: 'job-123', + status: 'RUNNING', + startedAt: new Date(Date.now() - 60000).toISOString(), // Started 1 min ago + createdAt: new Date(Date.now() - 60000).toISOString(), + }, + ]), + getScrapeJobUrlResults: sinon.stub().resolves([ + { url: 'https://zepbound.lilly.com/', status: 'COMPLETE' }, + ]), + }; + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); + + // Mock CloudWatch to return bot protection log events + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ + events: [ + { + message: `Bot Protection Detection in Scraper: ${JSON.stringify({ + jobId: 'job-123', + errorCategory: 'bot-protection', + url: 'https://zepbound.lilly.com/', + blockerType: 'cloudflare', + confidence: 0.99, + httpStatus: 403, + })}`, + }, + { + message: `Bot Protection Detection in Scraper: ${JSON.stringify({ + jobId: 'job-123', + errorCategory: 'bot-protection', + url: 'https://zepbound.lilly.com/about', + blockerType: 'cloudflare', + confidence: 0.99, + httpStatus: 403, + })}`, + }, + ], + }); + + const result = await runOpportunityStatusProcessor(message, context); + + // Verify bot protection alert was sent via Slack + expect(mockSlackClient.postMessage).to.have.been.called; + + // Find the bot protection message among all Slack calls + const botProtectionCall = mockSlackClient.postMessage.getCalls().find((call) => { + const args = call.args[0]; // postMessage({ channel, thread_ts, text, ... }) + return args && args.text && args.text.includes('Bot Protection Detected'); + }); + + expect(botProtectionCall).to.exist; + const slackMessage = botProtectionCall.args[0].text; + + expect(slackMessage).to.include('Bot Protection Detected'); + expect(slackMessage).to.include('Cloudflare'); // Formatted blocker type + expect(slackMessage).to.include('2'); // Total count + expect(slackMessage).to.include('403'); // HTTP status + expect(slackMessage).to.include('Spacecat/1.0'); + expect(slackMessage).to.include('3.218.16.42'); // Production IP + expect(slackMessage).to.include('How to Resolve'); // Resolution instructions + + expect(result.status).to.equal(200); + + // Cleanup stubs + cloudWatchStub.restore(); + scrapeClientStub.restore(); + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + }); + + it('should use dev IPs when AWS_REGION is not us-east', async function () { + this.timeout(5000); + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + // Make broken-backlinks require scraping + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://dev-test.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + // Set onboard time to trigger analysis + message.taskContext.onboardStartTime = Date.now() - 3600000; + context.env.AWS_REGION = 'eu-west-1'; // Dev environment (non-us-east) + context.env.S3_SCRAPER_BUCKET_NAME = 'test-bucket'; + context.env.SPACECAT_BOT_IPS = '44.218.57.115,3.225.211.141,44.219.217.174'; + + // Ensure mockSite returns empty opportunities + mockSite.getOpportunities.resolves([]); + + // Mock ScrapeClient - needed to get jobId for bot protection check + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([ + { + id: 'job-dev', + status: 'RUNNING', + startedAt: new Date(Date.now() - 60000).toISOString(), + createdAt: new Date(Date.now() - 60000).toISOString(), + }, + ]), + getScrapeJobUrlResults: sinon.stub().resolves([ + { url: 'https://dev-test.com/', status: 'COMPLETE' }, + ]), + }; + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); + + // Mock CloudWatch to return bot protection log events + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ + events: [ + { + message: `Bot Protection Detection in Scraper: ${JSON.stringify({ + jobId: 'job-dev', + errorCategory: 'bot-protection', + url: 'https://dev-test.com/', + blockerType: 'akamai', + confidence: 0.99, + httpStatus: 403, + })}`, + }, + ], + }); + + const result = await runOpportunityStatusProcessor(message, context); + + // Verify bot protection alert was sent via Slack + expect(mockSlackClient.postMessage).to.have.been.called; + + // Find the bot protection message + const botProtectionCall = mockSlackClient.postMessage.getCalls().find((call) => { + const args = call.args[0]; + return args && args.text && args.text.includes('Bot Protection Detected'); + }); + + expect(botProtectionCall).to.exist; + const slackMessage = botProtectionCall.args[0].text; + + // Should use dev IPs (not prod IPs) + expect(slackMessage).to.include('44.218.57.115'); // Dev IP + expect(slackMessage).to.not.include('3.218.16.42'); // Prod IP should not be present + expect(slackMessage).to.include('Akamai'); // Formatted blocker type + expect(slackMessage).to.include('403'); // HTTP status + + expect(result.status).to.equal(200); + + // Cleanup stubs + cloudWatchStub.restore(); + scrapeClientStub.restore(); + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + }); + + it('should not send bot protection alert when no bot protection logs found', async function () { + this.timeout(5000); + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + + try { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://no-bot-protection.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + // Set onboard time to trigger bot protection check + message.taskContext.onboardStartTime = Date.now() - 3600000; + context.env.AWS_REGION = 'us-east-1'; + + // Ensure mockSite returns empty opportunities + mockSite.getOpportunities.resolves([]); + + // Mock CloudWatch to return EMPTY events (no bot protection) + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ + events: [], // No bot protection events + }); + + const mockJob = { + id: 'job-no-bot', + startedAt: new Date().toISOString(), + }; + + mockScrapeClient.getScrapeJobsByBaseURL.resolves([mockJob]); + + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClient); + + const result = await runOpportunityStatusProcessor(message, context); + + // Should not send bot protection alert (no bot protection logs) + const botProtectionCall = mockSlackClient.postMessage + && mockSlackClient.postMessage.getCalls + ? mockSlackClient.postMessage.getCalls().find((call) => { + const args = call.args[0]; + return args && args.text && args.text.includes('Bot Protection Detected'); + }) + : undefined; + expect(botProtectionCall).to.not.exist; + + expect(result.status).to.equal(200); + + // Cleanup CloudWatch stub + cloudWatchStub.restore(); + } finally { + if (scrapeClientStub && scrapeClientStub.restore) { + try { + scrapeClientStub.restore(); + } catch (e) { + // Already restored + } + scrapeClientStub = null; + } + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + + it('should handle partial bot protection blocking', async () => { + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + try { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://example.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + message.taskContext.onboardStartTime = Date.now() - 3600000; + context.env.S3_SCRAPER_BUCKET_NAME = 'test-bucket'; + context.env.AWS_REGION = 'us-east-1'; + context.env.SPACECAT_BOT_IPS = '3.218.16.42,52.55.82.37,54.172.145.38'; + + // Mock ScrapeClient - needed to get jobId for bot protection check + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([ + { + id: 'job-456', + status: 'RUNNING', + startedAt: new Date(Date.now() - 60000).toISOString(), + createdAt: new Date(Date.now() - 60000).toISOString(), + }, + ]), + getScrapeJobUrlResults: sinon.stub().resolves([ + { url: 'https://example.com/blocked', status: 'COMPLETE' }, + { url: 'https://example.com/also-blocked', status: 'COMPLETE' }, + { url: 'https://example.com/success', status: 'COMPLETE' }, + ]), + }; + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); + + // Mock CloudWatch to return bot protection events for 2 out of 3 URLs + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ + events: [ + { + message: `Bot Protection Detection in Scraper: ${JSON.stringify({ + jobId: 'job-456', + errorCategory: 'bot-protection', + url: 'https://example.com/blocked', + blockerType: 'cloudflare', + confidence: 0.99, + httpStatus: 403, + })}`, + }, + { + message: `Bot Protection Detection in Scraper: ${JSON.stringify({ + jobId: 'job-456', + errorCategory: 'bot-protection', + url: 'https://example.com/also-blocked', + blockerType: 'cloudflare', + confidence: 0.99, + httpStatus: 403, + })}`, + }, + ], + }); + + const result = await runOpportunityStatusProcessor(message, context); + + // Verify bot protection alert was sent via Slack + expect(mockSlackClient.postMessage).to.have.been.called; + + // Find the bot protection message among all Slack calls + const botProtectionCall = mockSlackClient.postMessage.getCalls().find((call) => { + const args = call.args[0]; // postMessage({ channel, thread_ts, text, ... }) + return args && args.text && args.text.includes('Bot Protection Detected'); + }); + + expect(botProtectionCall).to.exist; + const slackMessage = botProtectionCall.args[0].text; + + expect(slackMessage).to.include('Bot Protection Detected'); + expect(slackMessage).to.include('2'); // 2 total blocked URLs + expect(slackMessage).to.include('Cloudflare'); // Formatted blocker type + expect(slackMessage).to.include('403'); // HTTP status + + expect(result.status).to.equal(200); + + // Cleanup stubs + cloudWatchStub.restore(); + scrapeClientStub.restore(); + } finally { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + + it('should not send alert when no bot protection detected', async function () { + this.timeout(5000); + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + + try { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://clean-site.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + message.taskContext.onboardStartTime = Date.now() - 3600000; + + // Mock CloudWatch to return NO bot protection events + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ events: [] }); + + // Mock scrape results - no bot protection + const mockScrapeResults = [ + { + url: 'https://clean-site.com/', + status: 'COMPLETE', + metadata: { + botProtection: { + detected: false, + type: 'none', + blocked: false, + crawlable: true, + }, + }, + }, + { + url: 'https://clean-site.com/page', + status: 'COMPLETE', + metadata: { + botProtection: { + detected: false, + type: 'none', + blocked: false, + crawlable: true, + }, + }, + }, + ]; + + const mockJob = { + id: 'job-789', + startedAt: new Date().toISOString(), + }; + + mockScrapeClient.getScrapeJobsByBaseURL.resolves([mockJob]); + mockScrapeClient.getScrapeJobUrlResults.resolves(mockScrapeResults); + + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClient); + + const result = await runOpportunityStatusProcessor(message, context); + + // Verify scraping was checked exactly once + expect(mockScrapeClient.getScrapeJobsByBaseURL).to.have.been.calledOnce; + expect(mockScrapeClient.getScrapeJobUrlResults).to.have.been.calledOnce; + + // Verify NO bot protection alert was sent via Slack + // postMessage may be called for other messages, but not for bot protection + const botProtectionCall = mockSlackClient.postMessage.getCalls().find((call) => { + const args = call.args[0]; + return args && args.text && args.text.includes('Bot Protection Detected'); + }); + expect(botProtectionCall).to.be.undefined; + + expect(result.status).to.equal(200); + + // Cleanup + cloudWatchStub.restore(); + scrapeClientStub.restore(); + } finally { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + + it('should handle scrapes without bot protection metadata', async () => { + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + + try { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://old-scrape.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + + // Mock scrape results - old format without botProtection field + const mockScrapeResults = [ + { + url: 'https://old-scrape.com/', + status: 'COMPLETE', + metadata: { + // No botProtection field + }, + }, + ]; + + const mockJob = { + id: 'job-old', + startedAt: new Date().toISOString(), + }; + + mockScrapeClient.getScrapeJobsByBaseURL.resolves([mockJob]); + mockScrapeClient.getScrapeJobUrlResults.resolves(mockScrapeResults); + + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClient); + + const result = await runOpportunityStatusProcessor(message, context); + + // Should not crash, and no bot protection alert via Slack + // postMessage may be called for other messages, but not for bot protection + const botProtectionCall = mockSlackClient.postMessage.getCalls().find((call) => { + const args = call.args[0]; + return args && args.text && args.text.includes('Bot Protection Detected'); + }); + expect(botProtectionCall).to.be.undefined; + expect(result.status).to.equal(200); + } finally { + if (scrapeClientStub && scrapeClientStub.restore) { + try { + scrapeClientStub.restore(); + } catch (e) { + // Already restored + } + scrapeClientStub = null; + } + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + + it('should not check bot protection when slackContext is missing', async () => { + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + + try { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://example.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = null; // No slack context + + // Mock scrape results with bot protection + const mockScrapeResults = [ + { + url: 'https://example.com/', + status: 'COMPLETE', + metadata: { + botProtection: { + detected: true, + type: 'cloudflare', + blocked: true, + crawlable: false, + }, + }, + }, + ]; + + const mockJob = { + id: 'job-no-slack', + startedAt: new Date().toISOString(), + }; + + mockScrapeClient.getScrapeJobsByBaseURL.resolves([mockJob]); + mockScrapeClient.getScrapeJobUrlResults.resolves(mockScrapeResults); + + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClient); + + const result = await runOpportunityStatusProcessor(message, context); + + // Should not crash, bot protection checked but not sent to Slack + expect(result.status).to.equal(200); + } finally { + if (scrapeClientStub && scrapeClientStub.restore) { + try { + scrapeClientStub.restore(); + } catch (e) { + // Already restored + } + scrapeClientStub = null; + } + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + + it('should not send alert when all S3 files exist (no missing files)', async () => { + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + + try { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://all-files-exist.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + message.taskContext.onboardStartTime = Date.now() - 3600000; + context.env.S3_SCRAPER_BUCKET_NAME = 'test-bucket'; + context.env.AWS_REGION = 'us-east-1'; + context.env.SPACECAT_BOT_IPS = '3.218.16.42,52.55.82.37,54.172.145.38'; + + mockSite.getOpportunities.resolves([]); + + // Mock scrape results with paths + const mockScrapeResults = [ + { + url: 'https://all-files-exist.com/', + status: 'COMPLETE', + path: 'scrapes/job-all-exist/url-1/scrape.json', + }, + { + url: 'https://all-files-exist.com/page', + status: 'COMPLETE', + path: 'scrapes/job-all-exist/url-2/scrape.json', + }, + ]; + + // Mock S3 client to return valid data (all files exist) + context.s3Client.send.reset(); + context.s3Client.send.onFirstCall().resolves({ + Body: { + transformToString: sinon.stub().resolves(JSON.stringify({ + url: 'https://all-files-exist.com/', + content: 'valid content', + })), + }, + ContentType: 'application/json', + }); + context.s3Client.send.onSecondCall().resolves({ + Body: { + transformToString: sinon.stub().resolves(JSON.stringify({ + url: 'https://all-files-exist.com/page', + content: 'valid content', + })), + }, + ContentType: 'application/json', + }); + + const mockJob = { + id: 'job-all-exist', + startedAt: new Date().toISOString(), + }; + + mockScrapeClient.getScrapeJobsByBaseURL.resolves([mockJob]); + mockScrapeClient.getScrapeJobUrlResults.resolves(mockScrapeResults); + + scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClient); + + const result = await runOpportunityStatusProcessor(message, context); + + // Verify NO bot protection alert was sent (all files exist, no missing files) + const botProtectionCall = mockSlackClient.postMessage.getCalls().find((call) => { + const args = call.args[0]; + return args && args.text && args.text.includes('Bot Protection Detected'); + }); + expect(botProtectionCall).to.be.undefined; + + expect(result.status).to.equal(200); + } finally { + if (scrapeClientStub && scrapeClientStub.restore) { + try { + scrapeClientStub.restore(); + } catch (e) { + // Already restored + } + scrapeClientStub = null; + } + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + + it.skip('should use fallback stats when CloudWatch returns no logs', async function () { + this.timeout(5000); + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + let localScrapeStub = null; + + try { + // Set up broken-backlinks to require scraping + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://no-cw-logs.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + message.taskContext.onboardStartTime = Date.now() - 3600000; + context.env.S3_SCRAPER_BUCKET_NAME = 'test-bucket'; + context.env.AWS_REGION = 'us-east-1'; + context.env.SPACECAT_BOT_IPS = '3.218.16.42,52.55.82.37,54.172.145.38'; + + // Ensure site returns empty opportunities + mockSite.getOpportunities.resolves([]); + + // Mock scrape results WITH bot protection metadata + const mockScrapeResults = [ + { + url: 'https://no-cw-logs.com/blocked', + status: 'COMPLETE', + path: 'scrapes/job-no-cw/url-1/scrape.json', + metadata: { + botProtectionDetected: true, + }, + }, + ]; + + // Mock CloudWatch to return empty events array (no logs found) + const { CloudWatchLogsClient } = await import('@aws-sdk/client-cloudwatch-logs'); + const cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + cloudWatchStub.resolves({ + events: [], // No events found - triggers fallback stats + }); + + const mockJob = { + id: 'job-no-cw', + startedAt: new Date().toISOString(), + }; + + mockScrapeClient.getScrapeJobsByBaseURL.resolves([mockJob]); + mockScrapeClient.getScrapeJobUrlResults.resolves(mockScrapeResults); + + localScrapeStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClient); + + const result = await runOpportunityStatusProcessor(message, context); + + // Verify bot protection alert was sent + expect(mockSlackClient.postMessage).to.have.been.called; + + // Should send alert with fallback "unknown" stats + const botProtectionCall = mockSlackClient.postMessage.getCalls().find((call) => { + const args = call.args[0]; + return args && args.text && args.text.includes('Bot Protection Detected'); + }); + + expect(botProtectionCall).to.exist; + const slackMessage = botProtectionCall.args[0].text; + expect(slackMessage).to.include('unknown'); // Fallback blocker type (lowercase) + + expect(result.status).to.equal(200); + + // Cleanup CloudWatch stub + cloudWatchStub.restore(); + } finally { + if (localScrapeStub && localScrapeStub.restore) { + try { + localScrapeStub.restore(); + } catch (e) { + // Already restored + } + localScrapeStub = null; + } + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + + it('should use fallback stats when no scrape job ID is available', async () => { + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + let localScrapeStub2 = null; + + try { + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + message.siteUrl = 'https://no-job-id.com'; + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.slackContext = { + channelId: 'test-channel', + threadTs: 'test-thread', + }; + message.taskContext.onboardStartTime = Date.now() - 3600000; + context.env.S3_SCRAPER_BUCKET_NAME = 'test-bucket'; + context.env.AWS_REGION = 'us-east-1'; + context.env.SPACECAT_BOT_IPS = '3.218.16.42,52.55.82.37,54.172.145.38'; + + mockSite.getOpportunities.resolves([]); + + const mockScrapeResults = [ + { + url: 'https://no-job-id.com/', + status: 'COMPLETE', + path: 'scrapes/job-missing/url-1/scrape.json', + }, + ]; + + // Mock S3 to reject (missing file) + context.s3Client.send.reset(); + context.s3Client.send.rejects(new Error('NoSuchKey')); + + // Mock getScrapeJobsByBaseURL to throw error (simulating no job ID scenario) + mockScrapeClient.getScrapeJobsByBaseURL.rejects(new Error('Scrape client error')); + mockScrapeClient.getScrapeJobUrlResults.resolves(mockScrapeResults); + + localScrapeStub2 = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClient); + + const result = await runOpportunityStatusProcessor(message, context); + + // Should handle gracefully even without job ID + expect(result.status).to.equal(200); + } finally { + if (localScrapeStub2 && localScrapeStub2.restore) { + try { + localScrapeStub2.restore(); + } catch (e) { + // Already restored + } + localScrapeStub2 = null; + } + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + + // Removed: Too complex and difficult to maintain + }); + + describe('Edge Cases', () => { + it('should handle unknown audit types', async () => { + message.taskContext.auditTypes = ['unknown-audit-type']; + mockSite.getOpportunities.resolves([]); + + const result = await runOpportunityStatusProcessor(message, context); + + expect(result.status).to.equal(200); + }); + + it('should filter opportunities based on audit configuration', async () => { + message.taskContext.auditTypes = ['cwv']; + + const cwvOpp = { + getType: sinon.stub().returns('cwv'), + getSuggestions: sinon.stub().resolves([{ id: 'test' }]), + }; + + const metaTagsOpp = { + getType: sinon.stub().returns('meta-tags'), + getSuggestions: sinon.stub().resolves([]), + }; + + mockSite.getOpportunities.resolves([cwvOpp, metaTagsOpp]); + + const result = await runOpportunityStatusProcessor(message, context); + + expect(result.status).to.equal(200); + expect(cwvOpp.getSuggestions).to.have.been.called; + expect(metaTagsOpp.getSuggestions).to.not.have.been.called; + }); + + it('should handle bot protection without job ID (fallback stats)', async () => { + const dependencyMapModule = await import('../../../src/tasks/opportunity-status-processor/opportunity-dependency-map.js'); + const originalBrokenBacklinks = dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks']; + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = ['scraping']; + + const scrapeModule = await import('@adobe/spacecat-shared-scrape-client'); + const mockScrapeClientLocal = { + getScrapeJobsByBaseURL: sinon.stub().resolves([{ + id: null, // Job with null ID + startedAt: new Date().toISOString(), + }]), + getScrapeJobUrlResults: sinon.stub().resolves([ + { url: 'https://test.com/page1', status: 'COMPLETE', path: 'scrapes/test/url1/scrape.json' }, + { url: 'https://test.com/page2', status: 'FAILED', path: 'scrapes/test/url2/scrape.json' }, + ]), + getScrapeResultPaths: sinon.stub().resolves(new Map([ + ['https://test.com/page1', 'scrapes/test/url1/scrape.json'], + ])), + }; + const scrapeClientStub = sinon.stub(scrapeModule.ScrapeClient, 'createFrom').returns(mockScrapeClientLocal); + + try { + message.taskContext.auditTypes = ['broken-backlinks']; + message.taskContext.onboardStartTime = Date.now() - 3600000; + message.taskContext.slackContext = { channelId: 'test', threadTs: 'test' }; + context.env.S3_SCRAPER_BUCKET_NAME = 'test-bucket'; + context.env.SPACECAT_BOT_IPS = '3.218.16.42,52.55.82.37,54.172.145.38'; + mockSite.getOpportunities.resolves([]); + + // Mock S3: first success, second missing (bot protection without jobId for CloudWatch) + context.s3Client.send.reset(); + context.s3Client.send.onFirstCall().resolves({ + Body: { + transformToString: sinon.stub().resolves(JSON.stringify({ url: 'https://test.com/page1' })), + }, + ContentType: 'application/json', + }); + const noSuchKeyError = new Error('NoSuchKey'); + noSuchKeyError.name = 'NoSuchKey'; + context.s3Client.send.onSecondCall().rejects(noSuchKeyError); + // Additional calls for bot protection check + context.s3Client.send.onCall(2).resolves({ + Body: { + transformToString: sinon.stub().resolves(JSON.stringify({ url: 'https://test.com/page1' })), + }, + ContentType: 'application/json', + }); + context.s3Client.send.onCall(3).rejects(noSuchKeyError); + + const result = await runOpportunityStatusProcessor(message, context); + + expect(result.status).to.equal(200); + // Should use fallback stats (no CloudWatch query due to null jobId) + expect(context.log.info).to.not.have.been.calledWithMatch(/querying CloudWatch logs/); + } finally { + scrapeClientStub.restore(); + dependencyMapModule.OPPORTUNITY_DEPENDENCY_MAP['broken-backlinks'] = originalBrokenBacklinks; + } + }); + }); }); diff --git a/test/utils/cloudwatch-utils.test.js b/test/utils/cloudwatch-utils.test.js new file mode 100644 index 0000000..4e258bf --- /dev/null +++ b/test/utils/cloudwatch-utils.test.js @@ -0,0 +1,347 @@ +/* + * Copyright 2025 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import { expect } from 'chai'; +import sinon from 'sinon'; +import { CloudWatchLogsClient } from '@aws-sdk/client-cloudwatch-logs'; +import { + queryBotProtectionLogs, + aggregateBotProtectionStats, + checkAndAlertBotProtection, + checkAuditExecution, + getAuditFailureReason, +} from '../../src/utils/cloudwatch-utils.js'; + +describe('CloudWatch Utils', () => { + let cloudWatchStub; + let mockContext; + + beforeEach(() => { + cloudWatchStub = sinon.stub(CloudWatchLogsClient.prototype, 'send'); + mockContext = { + env: { + AWS_REGION: 'us-east-1', + SPACECAT_BOT_IPS: '', // Set default empty string to avoid shared library errors + // Slack env vars for say() function + SLACK_BOT_TOKEN: 'test-bot-token', + SLACK_SIGNING_SECRET: 'test-signing-secret', + SLACK_TOKEN_WORKSPACE_INTERNAL: 'test-workspace-token', + SLACK_OPS_CHANNEL_WORKSPACE_INTERNAL: 'test-ops-channel', + }, + log: { + info: sinon.stub(), + debug: sinon.stub(), + warn: sinon.stub(), + error: sinon.stub(), + }, + }; + }); + + afterEach(() => { + sinon.restore(); + }); + + describe('queryBotProtectionLogs', () => { + it('should return empty array when CloudWatch returns no events', async () => { + cloudWatchStub.resolves({ events: [] }); + + const onboardStartTime = Date.now() - 3600000; // 1 hour ago + const result = await queryBotProtectionLogs('test-job-id', mockContext, onboardStartTime); + + expect(result).to.deep.equal([]); + expect(mockContext.log.debug).to.have.been.calledWithMatch(/No bot protection logs found/); + }); + + it('should handle CloudWatch query errors gracefully', async () => { + cloudWatchStub.rejects(new Error('CloudWatch error')); + + const onboardStartTime = Date.now() - 3600000; // 1 hour ago + const result = await queryBotProtectionLogs('test-job-id', mockContext, onboardStartTime); + + expect(result).to.deep.equal([]); + expect(mockContext.log.error).to.have.been.calledWithMatch(/Failed to query CloudWatch logs/); + }); + + it('should handle malformed log messages gracefully', async () => { + cloudWatchStub.resolves({ + events: [ + { message: 'INVALID_LOG_FORMAT no json here' }, // Doesn't match pattern + { message: 'Bot Protection Detection in Scraper: { invalid: json }' }, // Matches pattern but invalid JSON, logs warning + { message: `Bot Protection Detection in Scraper: ${JSON.stringify({ jobId: 'test', httpStatus: 403 })}` }, + ], + }); + + const onboardStartTime = Date.now() - 3600000; // 1 hour ago + const result = await queryBotProtectionLogs('test-job-id', mockContext, onboardStartTime); + + expect(result).to.have.lengthOf(1); + expect(result[0]).to.deep.equal({ jobId: 'test', httpStatus: 403 }); + // Two warnings: first message doesn't match pattern, second matches but has invalid JSON + expect(mockContext.log.warn).to.have.been.calledTwice; + }); + }); + + describe('aggregateBotProtectionStats', () => { + it('should aggregate bot protection statistics', () => { + const events = [ + { + url: 'https://test.com/1', httpStatus: 403, blockerType: 'cloudflare', confidence: 0.99, + }, + { + url: 'https://test.com/2', httpStatus: 403, blockerType: 'cloudflare', confidence: 0.95, + }, + { + url: 'https://test.com/3', httpStatus: 200, blockerType: 'akamai', confidence: 0.8, + }, + ]; + + const result = aggregateBotProtectionStats(events); + + expect(result.totalCount).to.equal(3); + expect(result.highConfidenceCount).to.equal(2); + expect(result.byHttpStatus).to.deep.equal({ 403: 2, 200: 1 }); + expect(result.byBlockerType).to.deep.equal({ cloudflare: 2, akamai: 1 }); + expect(result.urls).to.have.lengthOf(3); + }); + + it('should handle events with missing fields', () => { + const events = [ + { url: 'https://test.com/1' }, + { url: 'https://test.com/2', httpStatus: 403 }, + ]; + + const result = aggregateBotProtectionStats(events); + + expect(result.totalCount).to.equal(2); + expect(result.highConfidenceCount).to.equal(0); + expect(result.byHttpStatus).to.deep.equal({ unknown: 1, 403: 1 }); + expect(result.byBlockerType).to.deep.equal({ unknown: 2 }); + }); + }); + + describe('checkAndAlertBotProtection', () => { + it('should return null when no bot protection logs found', async () => { + cloudWatchStub.resolves({ events: [] }); + + const result = await checkAndAlertBotProtection({ + siteId: 'site-123', + siteUrl: 'https://example.com', + searchStartTime: Date.now() - 3600000, + slackContext: { channelId: 'C123', threadTs: '123.456' }, + context: mockContext, + }); + + expect(result).to.be.null; + }); + + it('should query CloudWatch and aggregate stats when bot protection detected', async () => { + // Mock BaseSlackClient for say() function + const mockSlackClient = { + postMessage: sinon.stub().resolves(), + }; + const BaseSlackClientModule = await import('@adobe/spacecat-shared-slack-client'); + const slackStub = sinon.stub(BaseSlackClientModule.BaseSlackClient, 'createFrom').returns(mockSlackClient); + + const mockEvents = [ + { + message: `Bot Protection Detection in Scraper: ${JSON.stringify({ + url: 'https://example.com/page1', + httpStatus: 403, + blockerType: 'cloudflare', + confidence: 0.99, + })}`, + }, + { + message: `Bot Protection Detection in Scraper: ${JSON.stringify({ + url: 'https://example.com/page2', + httpStatus: 403, + blockerType: 'cloudflare', + confidence: 0.98, + })}`, + }, + ]; + + cloudWatchStub.resolves({ events: mockEvents }); + // Set SPACECAT_BOT_IPS to trigger line 174 + mockContext.env.SPACECAT_BOT_IPS = '1.2.3.4,5.6.7.8'; + + try { + // The function will execute line 174: const botIps = env.SPACECAT_BOT_IPS || ''; + const result = await checkAndAlertBotProtection({ + siteId: 'site-123', + siteUrl: 'https://example.com', + searchStartTime: Date.now() - 3600000, + slackContext: { channelId: 'C123', threadTs: '123.456' }, + context: mockContext, + }); + + // Verify stats are aggregated correctly + expect(result).to.not.be.null; + expect(result.totalCount).to.equal(2); + expect(result.highConfidenceCount).to.equal(2); + expect(result.byHttpStatus).to.deep.equal({ 403: 2 }); + expect(result.byBlockerType).to.deep.equal({ cloudflare: 2 }); + expect(result.urls).to.have.lengthOf(2); + + // Verify warning was logged + expect(mockContext.log.warn).to.have.been.calledWithMatch(/BOT-BLOCKED/); + expect(mockContext.log.warn).to.have.been.calledWithMatch(/2 URLs blocked/); + + // Verify Slack message was sent + expect(mockSlackClient.postMessage).to.have.been.calledOnce; + } finally { + slackStub.restore(); + } + }); + + it('should handle CloudWatch query errors gracefully', async () => { + cloudWatchStub.rejects(new Error('CloudWatch error')); + + const result = await checkAndAlertBotProtection({ + siteId: 'site-456', + siteUrl: 'https://test.com', + searchStartTime: Date.now() - 3600000, + slackContext: { channelId: 'C456', threadTs: '456.789' }, + context: mockContext, + }); + + // Should return null due to error (queryBotProtectionLogs returns [] on error) + expect(result).to.be.null; + expect(mockContext.log.error).to.have.been.calledWithMatch(/Failed to query CloudWatch logs/); + }); + }); + + describe('checkAuditExecution', () => { + it('should return true when audit execution log is found', async () => { + cloudWatchStub.resolves({ + events: [ + { message: 'Received meta-tags audit request for: site-123' }, + ], + }); + + const result = await checkAuditExecution('meta-tags', 'site-123', Date.now() - 3600000, mockContext); + + expect(result).to.be.true; + }); + + it('should return false when no audit execution log is found', async () => { + cloudWatchStub.resolves({ events: [] }); + + const result = await checkAuditExecution('cwv', 'site-456', Date.now() - 3600000, mockContext); + + expect(result).to.be.false; + }); + + it('should return false on CloudWatch error', async () => { + cloudWatchStub.rejects(new Error('CloudWatch error')); + + const result = await checkAuditExecution('broken-backlinks', 'site-789', Date.now() - 3600000, mockContext); + + expect(result).to.be.false; + expect(mockContext.log.error).to.have.been.calledWithMatch(/Error checking audit execution/); + }); + + it('should use default time window when onboardStartTime is not provided', async () => { + cloudWatchStub.resolves({ events: [] }); + + const result = await checkAuditExecution('meta-tags', 'site-123', null, mockContext); + + expect(result).to.be.false; + // Verify the command was called (stub was invoked) + expect(cloudWatchStub).to.have.been.calledOnce; + }); + + it('should use custom log group from environment', async () => { + mockContext.env.AUDIT_WORKER_LOG_GROUP = '/custom/log-group'; + cloudWatchStub.resolves({ events: [] }); + + await checkAuditExecution('meta-tags', 'site-123', Date.now() - 3600000, mockContext); + + expect(cloudWatchStub).to.have.been.calledOnce; + }); + }); + + describe('getAuditFailureReason', () => { + it('should return failure reason when found', async () => { + cloudWatchStub.resolves({ + events: [ + { message: 'meta-tags audit for site-123 failed after 0.12 seconds. Reason: No top pages found in database' }, + ], + }); + + const result = await getAuditFailureReason('meta-tags', 'site-123', Date.now() - 3600000, mockContext); + + expect(result).to.equal('No top pages found in database'); + }); + + it('should return null when no failure log is found', async () => { + cloudWatchStub.resolves({ events: [] }); + + const result = await getAuditFailureReason('cwv', 'site-456', Date.now() - 3600000, mockContext); + + expect(result).to.be.null; + }); + + it('should return entire message as fallback when Reason pattern not found', async () => { + cloudWatchStub.resolves({ + events: [ + { message: 'Some error message without the expected pattern' }, + ], + }); + + const result = await getAuditFailureReason('broken-backlinks', 'site-789', Date.now() - 3600000, mockContext); + + expect(result).to.equal('Some error message without the expected pattern'); + }); + + it('should return null on CloudWatch error', async () => { + cloudWatchStub.rejects(new Error('CloudWatch error')); + + const result = await getAuditFailureReason('meta-tags', 'site-123', Date.now() - 3600000, mockContext); + + expect(result).to.be.null; + expect(mockContext.log.error).to.have.been.calledWithMatch(/Error getting audit failure reason/); + }); + + it('should use default time window when onboardStartTime is not provided', async () => { + cloudWatchStub.resolves({ events: [] }); + + const result = await getAuditFailureReason('meta-tags', 'site-123', null, mockContext); + + expect(result).to.be.null; + expect(cloudWatchStub).to.have.been.calledOnce; + }); + + it('should extract reason with "at" in the error message', async () => { + cloudWatchStub.resolves({ + events: [ + { + message: 'cwv audit for site-456 failed. Reason: Database connection timeout at line 42', + }, + ], + }); + + const result = await getAuditFailureReason('cwv', 'site-456', Date.now() - 3600000, mockContext); + + expect(result).to.equal('Database connection timeout'); + }); + + it('should use custom log group from environment', async () => { + mockContext.env.AUDIT_WORKER_LOG_GROUP = '/custom/log-group'; + cloudWatchStub.resolves({ events: [] }); + + await getAuditFailureReason('meta-tags', 'site-123', Date.now() - 3600000, mockContext); + + expect(cloudWatchStub).to.have.been.calledOnce; + }); + }); +}); diff --git a/test/utils/slack-utils.test.js b/test/utils/slack-utils.test.js index cc168f7..873aee8 100644 --- a/test/utils/slack-utils.test.js +++ b/test/utils/slack-utils.test.js @@ -236,4 +236,190 @@ describe('slack-utils', () => { })).to.be.true; }); }); + + describe('formatHttpStatus', () => { + let formatHttpStatus; + + beforeEach(async () => { + // Import from module - test internal functions via formatBotProtectionSlackMessage + // These are internal functions, test them through the public API + const slackUtilsModule = await import('../../src/utils/slack-utils.js'); + // Test these through formatBotProtectionSlackMessage + formatHttpStatus = slackUtilsModule.formatBotProtectionSlackMessage; + }); + + it('should format known HTTP status codes correctly', () => { + const stats = { + totalCount: 3, + highConfidenceCount: 3, + byHttpStatus: { 403: 1, 200: 1, unknown: 1 }, + byBlockerType: { cloudflare: 3 }, + urls: [ + { url: 'https://test.com/1', httpStatus: 403, blockerType: 'cloudflare' }, + { url: 'https://test.com/2', httpStatus: 200, blockerType: 'cloudflare' }, + { url: 'https://test.com/3', httpStatus: 'unknown', blockerType: 'cloudflare' }, + ], + }; + + const result = formatHttpStatus({ + siteUrl: 'https://test.com', + stats, + allowlistIps: ['1.2.3.4'], + allowlistUserAgent: 'TestBot/1.0', + }); + + expect(result).to.include('🚫 403 Forbidden'); + expect(result).to.include('⚠️ 200 OK (Challenge Page)'); + expect(result).to.include('❓ Unknown Status'); + }); + + it('should handle unknown HTTP status codes with fallback (line 29)', () => { + const stats = { + totalCount: 2, + highConfidenceCount: 2, + byHttpStatus: { 429: 1, 503: 1 }, // Status codes not in the map + byBlockerType: { cloudflare: 2 }, + urls: [ + { url: 'https://test.com/1', httpStatus: 429, blockerType: 'cloudflare' }, + { url: 'https://test.com/2', httpStatus: 503, blockerType: 'cloudflare' }, + ], + }; + + const result = formatHttpStatus({ + siteUrl: 'https://test.com', + stats, + allowlistIps: ['1.2.3.4'], + allowlistUserAgent: 'TestBot/1.0', + }); + + // Should use fallback format for unknown status codes (line 29) + expect(result).to.include('⚠️ 429'); + expect(result).to.include('⚠️ 503'); + }); + }); + + describe('formatBlockerType', () => { + let formatBlockerType; + + beforeEach(async () => { + const slackUtilsModule = await import('../../src/utils/slack-utils.js'); + formatBlockerType = slackUtilsModule.formatBotProtectionSlackMessage; + }); + + it('should format known blocker types correctly', () => { + const stats = { + totalCount: 5, + highConfidenceCount: 5, + byHttpStatus: { 403: 5 }, + byBlockerType: { + cloudflare: 1, akamai: 1, imperva: 1, fastly: 1, unknown: 1, + }, + urls: [ + { url: 'https://test.com/1', httpStatus: 403, blockerType: 'cloudflare' }, + { url: 'https://test.com/2', httpStatus: 403, blockerType: 'akamai' }, + { url: 'https://test.com/3', httpStatus: 403, blockerType: 'imperva' }, + { url: 'https://test.com/4', httpStatus: 403, blockerType: 'fastly' }, + { url: 'https://test.com/5', httpStatus: 403, blockerType: 'unknown' }, + ], + }; + + const result = formatBlockerType({ + siteUrl: 'https://test.com', + stats, + allowlistIps: ['1.2.3.4'], + allowlistUserAgent: 'TestBot/1.0', + }); + + expect(result).to.include('Cloudflare'); + expect(result).to.include('Akamai'); + expect(result).to.include('Imperva'); + expect(result).to.include('Fastly'); + expect(result).to.include('Unknown Blocker'); + }); + + it('should handle unknown blocker types with fallback (line 46)', () => { + const stats = { + totalCount: 2, + highConfidenceCount: 2, + byHttpStatus: { 403: 2 }, + byBlockerType: { incapsula: 1, 'custom-waf': 1 }, // Types not in the map + urls: [ + { url: 'https://test.com/1', httpStatus: 403, blockerType: 'incapsula' }, + { url: 'https://test.com/2', httpStatus: 403, blockerType: 'custom-waf' }, + ], + }; + + const result = formatBlockerType({ + siteUrl: 'https://test.com', + stats, + allowlistIps: ['1.2.3.4'], + allowlistUserAgent: 'TestBot/1.0', + }); + + // Should use fallback format for unknown blocker types (line 46) + expect(result).to.include('incapsula'); + expect(result).to.include('custom-waf'); + }); + }); + + describe('formatBotProtectionSlackMessage', () => { + let formatBotProtectionSlackMessage; + + beforeEach(async () => { + const slackUtilsModule = await import('../../src/utils/slack-utils.js'); + formatBotProtectionSlackMessage = slackUtilsModule.formatBotProtectionSlackMessage; + }); + + it('should format message with sample URLs when count <= 3', () => { + const stats = { + totalCount: 3, + highConfidenceCount: 2, + byHttpStatus: { 403: 3 }, + byBlockerType: { cloudflare: 3 }, + urls: [ + { url: 'https://test.com/1', httpStatus: 403, blockerType: 'cloudflare' }, + { url: 'https://test.com/2', httpStatus: 403, blockerType: 'cloudflare' }, + { url: 'https://test.com/3', httpStatus: 403, blockerType: 'cloudflare' }, + ], + }; + + const result = formatBotProtectionSlackMessage({ + siteUrl: 'https://test.com', + stats, + allowlistIps: ['1.2.3.4', '5.6.7.8'], + allowlistUserAgent: 'TestBot/1.0', + }); + + expect(result).to.be.a('string'); + expect(result).to.include('3 URL'); // Changed: no longer shows "of X" + expect(result).to.not.include('... and'); + }); + + it('should format message with "and X more" when count > 3', () => { + const stats = { + totalCount: 5, + highConfidenceCount: 4, + byHttpStatus: { 403: 5 }, + byBlockerType: { cloudflare: 5 }, + urls: [ + { url: 'https://test.com/1', httpStatus: 403, blockerType: 'cloudflare' }, + { url: 'https://test.com/2', httpStatus: 403, blockerType: 'cloudflare' }, + { url: 'https://test.com/3', httpStatus: 403, blockerType: 'cloudflare' }, + { url: 'https://test.com/4', httpStatus: 403, blockerType: 'cloudflare' }, + { url: 'https://test.com/5', httpStatus: 403, blockerType: 'cloudflare' }, + ], + }; + + const result = formatBotProtectionSlackMessage({ + siteUrl: 'https://test.com', + stats, + allowlistIps: ['1.2.3.4', '5.6.7.8'], + allowlistUserAgent: 'TestBot/1.0', + }); + + expect(result).to.be.a('string'); + expect(result).to.include('5 URL'); // Changed: no longer shows "of X" + expect(result).to.include('... and 2 more URLs'); + }); + }); });