From 325dda03a419354178c6a48a012b7ebc48ff823e Mon Sep 17 00:00:00 2001 From: Michael Harrison Date: Fri, 1 May 2026 15:25:32 +0100 Subject: [PATCH 01/12] CCM-16491: letter authoring product tests --- package-lock.json | 1426 +++++++++++------ project.code-workspace | 2 +- tests/security/lifecycle/auth/setup.ts | 4 +- tests/security/lifecycle/auth/teardown.ts | 4 +- tests/security/lifecycle/templates/setup.ts | 29 +- .../security/lifecycle/templates/teardown.ts | 20 +- .../security/pages/template-mgmt-base-page.ts | 45 +- tests/shared/package.json | 1 + tests/shared/setup-teardown/domain/index.ts | 14 +- .../domain/letter-variant-cache.ts | 21 + .../domain/letter-variant-factory.ts | 24 + tests/shared/setup-teardown/util/index.ts | 1 + tests/shared/setup-teardown/util/lambda.ts | 37 + .../util/parse-setup-teardown-args.ts | 8 +- .../setup-teardown/util/storage-helper.ts | 12 +- tests/shared/tsconfig.json | 5 +- tests/shared/types.ts | 9 +- tests/test-team/config/dev.config.ts | 6 +- tests/test-team/fixtures/clients.ts | 28 +- tests/test-team/fixtures/letter-variants.ts | 14 + tests/test-team/fixtures/users.ts | 4 + tests/test-team/lifecycle/auth/setup.ts | 4 +- tests/test-team/lifecycle/auth/teardown.ts | 4 +- tests/test-team/lifecycle/templates/setup.ts | 86 +- tests/test-team/lifecycle/templates/state.ts | 7 + .../test-team/lifecycle/templates/teardown.ts | 53 +- .../pages/template-mgmt-base-page.ts | 74 +- .../test-team/standard-english-template.docx | Bin 0 -> 85406 bytes tests/test-team/steps/letter-authoring.ts | 443 +++++ tests/test-team/{functions => steps}/login.ts | 0 tests/test-team/steps/message-plans.ts | 594 +++++++ .../template-mgmt-e2e-common-steps.ts | 133 +- .../template-mgmt-cis2-login-e2e.ts | 4 +- .../template-mgmt-copy-e2e.ts | 2 +- .../template-mgmt-delete-e2e.ts | 6 +- .../template-mgmt-email-e2e.ts | 2 +- .../template-mgmt-foreign-letter-e2e.ts | 6 +- .../template-mgmt-letter-e2e.ts | 6 +- .../template-mgmt-nhsapp-e2e.ts | 16 +- .../template-mgmt-sms-e2e.ts | 2 +- .../template-mgmt-copy-e2e.ts | 2 +- .../template-mgmt-delete-e2e.ts | 6 +- .../template-mgmt-email-e2e.ts | 2 +- .../template-mgmt-foreign-letter-e2e.ts | 6 +- .../template-mgmt-letter-authoring-e2e.ts | 136 ++ .../template-mgmt-letter-e2e.ts | 6 +- .../template-mgmt-nhsapp-e2e.ts | 2 +- .../template-mgmt-sms-e2e.ts | 2 +- tests/test-team/tsconfig.json | 7 +- 49 files changed, 2543 insertions(+), 782 deletions(-) create mode 100644 tests/shared/setup-teardown/domain/letter-variant-cache.ts create mode 100644 tests/shared/setup-teardown/domain/letter-variant-factory.ts create mode 100644 tests/shared/setup-teardown/util/lambda.ts create mode 100644 tests/test-team/fixtures/letter-variants.ts create mode 100644 tests/test-team/lifecycle/templates/state.ts create mode 100644 tests/test-team/standard-english-template.docx create mode 100644 tests/test-team/steps/letter-authoring.ts rename tests/test-team/{functions => steps}/login.ts (100%) create mode 100644 tests/test-team/steps/message-plans.ts rename tests/test-team/{functions => steps}/template-mgmt-e2e-common-steps.ts (75%) create mode 100644 tests/test-team/template-mgmt-e2e-tests/templates-with-routing-enabled/template-mgmt-letter-authoring-e2e.ts diff --git a/package-lock.json b/package-lock.json index 7185e223..dcab37a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -846,6 +846,76 @@ "node": ">=20.0.0" } }, + "node_modules/@aws-sdk/client-lambda": { + "version": "3.1039.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.1039.0.tgz", + "integrity": "sha512-G6k9MYrrvINhGhHDNheF9NcJlVQ4vbtyLD6pjsgL+vDwugQB84OR95T7bNI9If5DlOxKrLx9s6BGid1YoWQKYA==", + "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.974.7", + "@aws-sdk/credential-provider-node": "^3.972.38", + "@aws-sdk/middleware-host-header": "^3.972.10", + "@aws-sdk/middleware-logger": "^3.972.10", + "@aws-sdk/middleware-recursion-detection": "^3.972.11", + "@aws-sdk/middleware-user-agent": "^3.972.37", + "@aws-sdk/region-config-resolver": "^3.972.13", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-endpoints": "^3.996.8", + "@aws-sdk/util-user-agent-browser": "^3.972.10", + "@aws-sdk/util-user-agent-node": "^3.973.23", + "@smithy/config-resolver": "^4.4.17", + "@smithy/core": "^3.23.17", + "@smithy/eventstream-serde-browser": "^4.2.14", + "@smithy/eventstream-serde-config-resolver": "^4.3.14", + "@smithy/eventstream-serde-node": "^4.2.14", + "@smithy/fetch-http-handler": "^5.3.17", + "@smithy/hash-node": "^4.2.14", + "@smithy/invalid-dependency": "^4.2.14", + "@smithy/middleware-content-length": "^4.2.14", + "@smithy/middleware-endpoint": "^4.4.32", + "@smithy/middleware-retry": "^4.5.7", + "@smithy/middleware-serde": "^4.2.20", + "@smithy/middleware-stack": "^4.2.14", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/node-http-handler": "^4.6.1", + "@smithy/protocol-http": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.49", + "@smithy/util-defaults-mode-node": "^4.2.54", + "@smithy/util-endpoints": "^3.4.2", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-retry": "^4.3.6", + "@smithy/util-stream": "^4.5.25", + "@smithy/util-utf8": "^4.2.2", + "@smithy/util-waiter": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/client-personalize-events": { "version": "3.982.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-personalize-events/-/client-personalize-events-3.982.0.tgz", @@ -983,92 +1053,71 @@ "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.985.0.tgz", - "integrity": "sha512-81J8iE8MuXhdbMfIz4sWFj64Pe41bFi/uqqmqOC5SlGv+kwoyLsyKS/rH2tW2t5buih4vTUxskRjxlqikTD4oQ==", + "node_modules/@aws-sdk/core": { + "version": "3.974.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.974.7.tgz", + "integrity": "sha512-YhRC90ofz5oolTJZlA8voU/oUrCB2azi8Usx51k8hhB5LpWbYQMMXKUqSqkoL0Cru+RQJgWTHpAfEDDIwfUhJw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/xml-builder": "^3.972.22", + "@smithy/core": "^3.23.17", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/signature-v4": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-retry": "^4.3.6", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", "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.973.7", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.7", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.985.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.5", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.13", - "@smithy/middleware-retry": "^4.4.30", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.9", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.2.32", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/core": { - "version": "3.973.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.7.tgz", - "integrity": "sha512-wNZZQQNlJ+hzD49cKdo+PY6rsTDElO8yDImnrI69p2PLBa7QomeUKAJWYp9xnaR38nlHqWhMHZuYLCQ3oSX+xg==", + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.33", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.33.tgz", + "integrity": "sha512-bJV7eViSJV6GSuuN+VIdNVPdwPsNSf75BiC2v5alPrjR/OCcqgKwSZInKbDFz9mNeizldsyf67jt6YSIiv53Cw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/xml-builder": "^3.972.4", - "@smithy/core": "^3.22.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.5.tgz", - "integrity": "sha512-LxJ9PEO4gKPXzkufvIESUysykPIdrV7+Ocb9yAhbhJLE4TiAYqbCVUE+VuKP1leGR1bBfjWjYgSV5MxprlX3mQ==", + "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1076,21 +1125,35 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.7.tgz", - "integrity": "sha512-L2uOGtvp2x3bTcxFTpSM+GkwFIPd8pHfGWO1764icMbo7e5xJh0nfhx1UwkXLnwvocTNEf8A7jISZLYjUSNaTg==", + "version": "3.972.35", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.35.tgz", + "integrity": "sha512-x/BQGEIdq0oI+4WxLjKmnQvT7CnF9r8ezdGt7wXwxb7ckHXQz0Zmgxt8v3Ne0JaT3R5YefmuybHX6E8EnsDXyA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/types": "^3.973.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.9", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", - "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.11", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/types": "^3.973.8", + "@smithy/fetch-http-handler": "^5.3.17", + "@smithy/node-http-handler": "^4.6.1", + "@smithy/property-provider": "^4.2.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/util-stream": "^4.5.25", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1098,25 +1161,39 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.5.tgz", - "integrity": "sha512-SdDTYE6jkARzOeL7+kudMIM4DaFnP5dZVeatzw849k4bSXDdErDS188bgeNzc/RA2WGrlEpsqHUKP6G7sVXhZg==", + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.37.tgz", + "integrity": "sha512-eUTpmWfd/BKsq9medhCRcu+GRAhFP2Zrn7/2jKDHHOOjCkhrMoTp/t4cEthqFoG7gE0VGp5wUxrXTdvBCmSmJg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/credential-provider-env": "^3.972.33", + "@aws-sdk/credential-provider-http": "^3.972.35", + "@aws-sdk/credential-provider-login": "^3.972.37", + "@aws-sdk/credential-provider-process": "^3.972.33", + "@aws-sdk/credential-provider-sso": "^3.972.37", + "@aws-sdk/credential-provider-web-identity": "^3.972.37", + "@aws-sdk/nested-clients": "^3.997.5", + "@aws-sdk/types": "^3.973.8", + "@smithy/credential-provider-imds": "^4.2.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/credential-provider-env": "^3.972.5", - "@aws-sdk/credential-provider-http": "^3.972.7", - "@aws-sdk/credential-provider-login": "^3.972.5", - "@aws-sdk/credential-provider-process": "^3.972.5", - "@aws-sdk/credential-provider-sso": "^3.972.5", - "@aws-sdk/credential-provider-web-identity": "^3.972.5", - "@aws-sdk/nested-clients": "3.985.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1124,19 +1201,33 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.5.tgz", - "integrity": "sha512-uYq1ILyTSI6ZDCMY5+vUsRM0SOCVI7kaW4wBrehVVkhAxC6y+e9rvGtnoZqCOWL1gKjTMouvsf4Ilhc5NCg1Aw==", + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.37.tgz", + "integrity": "sha512-Ty68y8ISSC+g5Q3D0K8uAaoINwvfaOslnNpsF/LgVUxyosYXHawcK2yV4HLXDVugiTTYLQfJfcw0ce5meAGkKw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/nested-clients": "3.985.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/nested-clients": "^3.997.5", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1144,23 +1235,37 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.6.tgz", - "integrity": "sha512-DZ3CnAAtSVtVz+G+ogqecaErMLgzph4JH5nYbHoBMgBkwTUV+SUcjsjOJwdBJTHu3Dm6l5LBYekZoU2nDqQk2A==", + "version": "3.972.38", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.38.tgz", + "integrity": "sha512-BQ9XYnBDVxR2HuV5huXYQYF/PZMTsY+EnwfGnCU2cA8Zw63XpkOtPY8WqiMIZMQCrKPQQEiFURS/o9CIolRLqg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.33", + "@aws-sdk/credential-provider-http": "^3.972.35", + "@aws-sdk/credential-provider-ini": "^3.972.37", + "@aws-sdk/credential-provider-process": "^3.972.33", + "@aws-sdk/credential-provider-sso": "^3.972.37", + "@aws-sdk/credential-provider-web-identity": "^3.972.37", + "@aws-sdk/types": "^3.973.8", + "@smithy/credential-provider-imds": "^4.2.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.5", - "@aws-sdk/credential-provider-http": "^3.972.7", - "@aws-sdk/credential-provider-ini": "^3.972.5", - "@aws-sdk/credential-provider-process": "^3.972.5", - "@aws-sdk/credential-provider-sso": "^3.972.5", - "@aws-sdk/credential-provider-web-identity": "^3.972.5", - "@aws-sdk/types": "^3.973.1", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1168,17 +1273,31 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.5.tgz", - "integrity": "sha512-HDKF3mVbLnuqGg6dMnzBf1VUOywE12/N286msI9YaK9mEIzdsGCtLTvrDhe3Up0R9/hGFbB+9l21/TwF5L1C6g==", + "version": "3.972.33", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.33.tgz", + "integrity": "sha512-yfjGksI9WQbdMObb0VeLXqzTLI+a0qXLJT9gCDiv0+X/xjPpI3mTz6a5FibrhpuEKIe0gSgvs3MaoFZy5cx4WA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1186,19 +1305,33 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.5.tgz", - "integrity": "sha512-8urj3AoeNeQisjMmMBhFeiY2gxt6/7wQQbEGun0YV/OaOOiXrIudTIEYF8ZfD+NQI6X1FY5AkRsx6O/CaGiybA==", + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.37.tgz", + "integrity": "sha512-fpwE+20ntpp3i9Xb9vUuQfXLDKYHH+5I2V+ZG96SX1nBzrruhy10RXDgmN7t1etOz3c55stlA3TeQASUA451NQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.985.0", - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/token-providers": "3.985.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/nested-clients": "^3.997.5", + "@aws-sdk/token-providers": "3.1039.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1206,18 +1339,32 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.5.tgz", - "integrity": "sha512-OK3cULuJl6c+RcDZfPpaK5o3deTOnKZbxm7pzhFNGA3fI2hF9yDih17fGRazJzGGWaDVlR9ejZrpDef4DJCEsw==", + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.37.tgz", + "integrity": "sha512-aryawqyebf+3WhAFNHfF62rekFpYtVcVN7dQ89qnAWsa4n5hJst8qBG6gXC24WHtW7Nnhkf9ScYnjwo0Brn3bw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/nested-clients": "3.985.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/nested-clients": "^3.997.5", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1296,15 +1443,29 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.3.tgz", - "integrity": "sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.10.tgz", + "integrity": "sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1312,14 +1473,28 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.3.tgz", - "integrity": "sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.10.tgz", + "integrity": "sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1327,16 +1502,30 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.3.tgz", - "integrity": "sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==", + "version": "3.972.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.11.tgz", + "integrity": "sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", + "@aws-sdk/types": "^3.973.8", "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1344,25 +1533,39 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.7.tgz", - "integrity": "sha512-VtZ7tMIw18VzjG+I6D6rh2eLkJfTtByiFoCIauGDtTTPBEUMQUiGaJ/zZrPlCY6BsvLLeFKz3+E5mntgiOWmIg==", + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.36.tgz", + "integrity": "sha512-YhPix+0x/MdQrb1Ug1GDKeS5fqylIy+naz800asX8II4jqfTk2KY2KhmmYCwZcky8YWtRQQwWCGdoqeAnip8Uw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/core": "^3.23.17", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/signature-v4": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-stream": "^4.5.25", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-arn-parser": "^3.972.2", - "@smithy/core": "^3.22.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/signature-v4": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.11", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1370,18 +1573,33 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.7.tgz", - "integrity": "sha512-HUD+geASjXSCyL/DHPQc/Ua7JhldTcIglVAoCV8kiVm99IaFSlAbTvEnyhZwdE6bdFyTL+uIaWLaCFSRsglZBQ==", + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.37.tgz", + "integrity": "sha512-N1oNpdiLoVAWYD3WFBnUi3LlfoDA06ZHo4ozyjbsJNLvILzvt//0CnR8N+CZ0NWeYgVB/5V59ivixHCWCx2ALw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.985.0", - "@smithy/core": "^3.22.1", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-endpoints": "^3.996.8", + "@smithy/core": "^3.23.17", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "@smithy/util-retry": "^4.3.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1389,49 +1607,82 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.985.0.tgz", - "integrity": "sha512-TsWwKzb/2WHafAY0CE7uXgLj0FmnkBTgfioG9HO+7z/zCPcl1+YU+i7dW4o0y+aFxFgxTMG+ExBQpqT/k2ao8g==", + "version": "3.997.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.5.tgz", + "integrity": "sha512-jGFr6DxtcMTmzOkG/a0jCZYv4BBDmeNYVeO+/memSoDkYCJu4Y58xviYmzwJfYyIVSts+X/BVjJm1uGBnwHEMg==", "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.973.7", - "@aws-sdk/middleware-host-header": "^3.972.3", - "@aws-sdk/middleware-logger": "^3.972.3", - "@aws-sdk/middleware-recursion-detection": "^3.972.3", - "@aws-sdk/middleware-user-agent": "^3.972.7", - "@aws-sdk/region-config-resolver": "^3.972.3", - "@aws-sdk/types": "^3.973.1", - "@aws-sdk/util-endpoints": "3.985.0", - "@aws-sdk/util-user-agent-browser": "^3.972.3", - "@aws-sdk/util-user-agent-node": "^3.972.5", - "@smithy/config-resolver": "^4.4.6", - "@smithy/core": "^3.22.1", - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/hash-node": "^4.2.8", - "@smithy/invalid-dependency": "^4.2.8", - "@smithy/middleware-content-length": "^4.2.8", - "@smithy/middleware-endpoint": "^4.4.13", - "@smithy/middleware-retry": "^4.4.30", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/node-http-handler": "^4.4.9", - "@smithy/protocol-http": "^5.3.8", - "@smithy/smithy-client": "^4.11.2", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@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.29", - "@smithy/util-defaults-mode-node": "^4.2.32", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/middleware-host-header": "^3.972.10", + "@aws-sdk/middleware-logger": "^3.972.10", + "@aws-sdk/middleware-recursion-detection": "^3.972.11", + "@aws-sdk/middleware-user-agent": "^3.972.37", + "@aws-sdk/region-config-resolver": "^3.972.13", + "@aws-sdk/signature-v4-multi-region": "^3.996.24", + "@aws-sdk/types": "^3.973.8", + "@aws-sdk/util-endpoints": "^3.996.8", + "@aws-sdk/util-user-agent-browser": "^3.972.10", + "@aws-sdk/util-user-agent-node": "^3.973.23", + "@smithy/config-resolver": "^4.4.17", + "@smithy/core": "^3.23.17", + "@smithy/fetch-http-handler": "^5.3.17", + "@smithy/hash-node": "^4.2.14", + "@smithy/invalid-dependency": "^4.2.14", + "@smithy/middleware-content-length": "^4.2.14", + "@smithy/middleware-endpoint": "^4.4.32", + "@smithy/middleware-retry": "^4.5.7", + "@smithy/middleware-serde": "^4.2.20", + "@smithy/middleware-stack": "^4.2.14", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/node-http-handler": "^4.6.1", + "@smithy/protocol-http": "^5.3.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.49", + "@smithy/util-defaults-mode-node": "^4.2.54", + "@smithy/util-endpoints": "^3.4.2", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-retry": "^4.3.6", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.24", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.24.tgz", + "integrity": "sha512-amP7tLikppN940wbBFISYqiuzVmpzMS9U3mcgtmVLjX4fdWI/SNCvrXv6ZxfVzTT4cT0rPKOLhFah2xLwzREWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "^3.972.36", + "@aws-sdk/types": "^3.973.8", + "@smithy/protocol-http": "^5.3.14", + "@smithy/signature-v4": "^5.3.14", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1439,16 +1690,30 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.3.tgz", - "integrity": "sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==", + "version": "3.972.13", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.13.tgz", + "integrity": "sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/config-resolver": "^4.4.6", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/config-resolver": "^4.4.17", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1474,18 +1739,32 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.985.0.tgz", - "integrity": "sha512-+hwpHZyEq8k+9JL2PkE60V93v2kNhUIv7STFt+EAez1UJsJOQDhc5LpzEX66pNjclI5OTwBROs/DhJjC/BtMjQ==", + "version": "3.1039.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1039.0.tgz", + "integrity": "sha512-NMSFL2HwkAOoCeLCQiqoOq5pT3vVbSjww2QZTuYgYknVwhhv125PSDzZIcL5EYnlxuPWjEOdauZK+FspkZDVdw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.7", - "@aws-sdk/nested-clients": "3.985.0", - "@aws-sdk/types": "^3.973.1", - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@aws-sdk/core": "^3.974.7", + "@aws-sdk/nested-clients": "^3.997.5", + "@aws-sdk/types": "^3.973.8", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1507,9 +1786,9 @@ } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.972.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.2.tgz", - "integrity": "sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==", + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", + "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1536,16 +1815,30 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.985.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.985.0.tgz", - "integrity": "sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==", + "version": "3.996.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.8.tgz", + "integrity": "sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-endpoints": "^3.2.8", + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", + "@smithy/util-endpoints": "^3.4.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -1566,29 +1859,44 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.3.tgz", - "integrity": "sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==", + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.10.tgz", + "integrity": "sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.1", - "@smithy/types": "^4.12.0", + "@aws-sdk/types": "^3.973.8", + "@smithy/types": "^4.14.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.972.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.5.tgz", - "integrity": "sha512-GsUDF+rXyxDZkkJxUsDxnA67FG+kc5W1dnloCFLl6fWzceevsCYzJpASBzT+BPjwUgREE6FngfJYYYMQUY5fZQ==", + "version": "3.973.23", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.23.tgz", + "integrity": "sha512-gGwq8L2Euw0aNG6Ey4EktiAo3fSCVoDy1CaBIthd+oeaKHPXUrNaApMewQ6La5Hv0lcznOtECZaNvYyc5LXXfA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.7", - "@aws-sdk/types": "^3.973.1", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@aws-sdk/middleware-user-agent": "^3.972.37", + "@aws-sdk/types": "^3.973.8", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/types": "^4.14.1", + "@smithy/util-config-provider": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -1603,15 +1911,30 @@ } } }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { + "version": "3.973.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.8.tgz", + "integrity": "sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.4.tgz", - "integrity": "sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==", + "version": "3.972.22", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.22.tgz", + "integrity": "sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", - "fast-xml-parser": "5.3.4", + "@nodable/entities": "2.1.0", + "@smithy/types": "^4.14.1", + "fast-xml-parser": "5.7.2", "tslib": "^2.6.2" }, "engines": { @@ -2111,6 +2434,19 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, "node_modules/@playwright/test": { "version": "1.56.0", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.0.tgz", @@ -2127,32 +2463,18 @@ "node": ">=18" } }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", - "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.12.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@smithy/config-resolver": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", - "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "version": "4.4.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.17.tgz", + "integrity": "sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.8", - "@smithy/util-middleware": "^4.2.8", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/types": "^4.14.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.4.2", + "@smithy/util-middleware": "^4.2.14", "tslib": "^2.6.2" }, "engines": { @@ -2160,21 +2482,21 @@ } }, "node_modules/@smithy/core": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.22.1.tgz", - "integrity": "sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==", + "version": "3.23.17", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.17.tgz", + "integrity": "sha512-x7BlLbUFL8NWCGjMF9C+1N5cVCxcPa7g6Tv9B4A2luWx3be3oU8hQ96wIwxe/s7OhIzvoJH73HAUSg5JXVlEtQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.2.9", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-stream": "^4.5.11", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-stream": "^4.5.25", + "@smithy/util-utf8": "^4.2.2", + "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" }, "engines": { @@ -2182,16 +2504,16 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", - "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.14.tgz", + "integrity": "sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", "tslib": "^2.6.2" }, "engines": { @@ -2199,15 +2521,15 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", - "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.14.tgz", + "integrity": "sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.12.0", - "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/types": "^4.14.1", + "@smithy/util-hex-encoding": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2215,14 +2537,14 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", - "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.14.tgz", + "integrity": "sha512-8IelTCtTctWRbb+0Dcy+C0aICh1qa0qWXqgjcXDmMuCvPJRnv26hiDZoAau2ILOniki65mCPKqOQs/BaWvO4CQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/eventstream-serde-universal": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2230,13 +2552,13 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", - "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.14.tgz", + "integrity": "sha512-sqHiHpYRYo3FJlaIxD1J8PhbcmJAm7IuM16mVnwSkCToD7g00IBZzKuiLNMGmftULmEUX6/UAz8/NN5uMP8bVA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2244,14 +2566,14 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", - "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.14.tgz", + "integrity": "sha512-Ht/8BuGlKfFTy0H3+8eEu0vdpwGztCnaLLXtpXNdQqiR7Hj4vFScU3T436vRAjATglOIPjJXronY+1WxxNLSiw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/eventstream-serde-universal": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2259,14 +2581,14 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", - "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.14.tgz", + "integrity": "sha512-lWyt4T2XQZUZgK3tQ3Wn0w3XBvZsK/vjTuJl6bXbnGZBHH0ZUSONTYiK9TgjTTzU54xQr3DRFwpjmhp0oLm3gg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/eventstream-codec": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2274,16 +2596,16 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", - "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "version": "5.3.17", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.17.tgz", + "integrity": "sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/querystring-builder": "^4.2.8", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/querystring-builder": "^4.2.14", + "@smithy/types": "^4.14.1", + "@smithy/util-base64": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2291,15 +2613,15 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", - "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.14.tgz", + "integrity": "sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.14.1", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2307,13 +2629,13 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", - "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.14.tgz", + "integrity": "sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2321,9 +2643,9 @@ } }, "node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", + "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2400,14 +2722,14 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", - "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.14.tgz", + "integrity": "sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2415,19 +2737,19 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.13.tgz", - "integrity": "sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==", + "version": "4.4.32", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.32.tgz", + "integrity": "sha512-ZZkgyjnJppiZbIm6Qbx92pbXYi1uzenIvGhBSCDlc7NwuAkiqSgS75j1czAD25ZLs2FjMjYy1q7gyRVWG6JA0Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.22.1", - "@smithy/middleware-serde": "^4.2.9", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", - "@smithy/url-parser": "^4.2.8", - "@smithy/util-middleware": "^4.2.8", + "@smithy/core": "^3.23.17", + "@smithy/middleware-serde": "^4.2.20", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", + "@smithy/url-parser": "^4.2.14", + "@smithy/util-middleware": "^4.2.14", "tslib": "^2.6.2" }, "engines": { @@ -2435,20 +2757,21 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.30", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.30.tgz", - "integrity": "sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==", + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.7.tgz", + "integrity": "sha512-bRt6ZImqVSeTk39Nm81K20ObIiAZ3WefY7G6+iz/0tZjs4dgRRjvRX2sgsH+zi6iDCRR/aQvQofLKxxz4rPBZg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/service-error-classification": "^4.2.8", - "@smithy/smithy-client": "^4.11.2", - "@smithy/types": "^4.12.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-retry": "^4.2.8", - "@smithy/uuid": "^1.1.0", + "@smithy/core": "^3.23.17", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/service-error-classification": "^4.3.1", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-retry": "^4.3.6", + "@smithy/uuid": "^1.1.2", "tslib": "^2.6.2" }, "engines": { @@ -2456,14 +2779,15 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", - "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.20.tgz", + "integrity": "sha512-Lx9JMO9vArPtiChE3wbEZ5akMIDQpWQtlu90lhACQmNOXcGXRbaDywMHDzuDZ2OkZzP+9wQfZi3YJT9F67zTQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", + "@smithy/core": "^3.23.17", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2471,13 +2795,13 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", - "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.14.tgz", + "integrity": "sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2485,15 +2809,15 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", - "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.14.tgz", + "integrity": "sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/shared-ini-file-loader": "^4.4.3", - "@smithy/types": "^4.12.0", + "@smithy/property-provider": "^4.2.14", + "@smithy/shared-ini-file-loader": "^4.4.9", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2501,16 +2825,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.9.tgz", - "integrity": "sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.6.1.tgz", + "integrity": "sha512-iB+orM4x3xrr57X3YaXazfKnntl0LHlZB1kcXSGzMV1Tt0+YwEjGlbjk/44qEGtBzXAz6yFDzkYTKSV6Pj2HUg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/querystring-builder": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/protocol-http": "^5.3.14", + "@smithy/querystring-builder": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2518,13 +2841,13 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", - "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.14.tgz", + "integrity": "sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2532,13 +2855,13 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", - "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.14.tgz", + "integrity": "sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2546,14 +2869,14 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", - "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.14.tgz", + "integrity": "sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", - "@smithy/util-uri-escape": "^4.2.0", + "@smithy/types": "^4.14.1", + "@smithy/util-uri-escape": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2561,13 +2884,13 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", - "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.14.tgz", + "integrity": "sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2575,26 +2898,26 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", - "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.3.1.tgz", + "integrity": "sha512-aUQuDGh760ts/8MU+APjIZhlLPKhIIfqyzZaJikLEIMrdxFvxuLYD0WxWzaYWpmLbQlXDe9p7EWM3HsBe0K6Gw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0" + "@smithy/types": "^4.14.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", - "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.9.tgz", + "integrity": "sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2602,19 +2925,19 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", - "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.14.tgz", + "integrity": "sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.8", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-middleware": "^4.2.14", + "@smithy/util-uri-escape": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2622,18 +2945,18 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.11.2.tgz", - "integrity": "sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==", + "version": "4.12.13", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.13.tgz", + "integrity": "sha512-y/Pcj1V9+qG98gyu1gvftHB7rDpdh+7kIBIggs55yGm3JdtBV8GT8IFF3a1qxZ79QnaJHX9GXzvBG6tAd+czJA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.22.1", - "@smithy/middleware-endpoint": "^4.4.13", - "@smithy/middleware-stack": "^4.2.8", - "@smithy/protocol-http": "^5.3.8", - "@smithy/types": "^4.12.0", - "@smithy/util-stream": "^4.5.11", + "@smithy/core": "^3.23.17", + "@smithy/middleware-endpoint": "^4.4.32", + "@smithy/middleware-stack": "^4.2.14", + "@smithy/protocol-http": "^5.3.14", + "@smithy/types": "^4.14.1", + "@smithy/util-stream": "^4.5.25", "tslib": "^2.6.2" }, "engines": { @@ -2641,9 +2964,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", - "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.1.tgz", + "integrity": "sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2654,14 +2977,14 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", - "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.14.tgz", + "integrity": "sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/querystring-parser": "^4.2.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2669,14 +2992,14 @@ } }, "node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2684,9 +3007,9 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2697,9 +3020,9 @@ } }, "node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2710,13 +3033,13 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", + "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", + "@smithy/is-array-buffer": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2724,9 +3047,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2737,15 +3060,15 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.29", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.29.tgz", - "integrity": "sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==", + "version": "4.3.49", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.49.tgz", + "integrity": "sha512-a5bNrdiONYB/qE2BuKegvUMd/+ZDwdg4vsNuuSzYE8qs2EYAdK9CynL+Rzn29PbPiUqoz/cbpRbcLzD5lEevHw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.2", - "@smithy/types": "^4.12.0", + "@smithy/property-provider": "^4.2.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2753,18 +3076,18 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.32", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.32.tgz", - "integrity": "sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==", + "version": "4.2.54", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.54.tgz", + "integrity": "sha512-g1cvrJvOnzeJgEdf7AE4luI7gp6L8weE0y9a9wQUSGtjb8QRHDbCJYuE4Sy0SD9N8RrnNPFsPltAz/OSoBR9Zw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.6", - "@smithy/credential-provider-imds": "^4.2.8", - "@smithy/node-config-provider": "^4.3.8", - "@smithy/property-provider": "^4.2.8", - "@smithy/smithy-client": "^4.11.2", - "@smithy/types": "^4.12.0", + "@smithy/config-resolver": "^4.4.17", + "@smithy/credential-provider-imds": "^4.2.14", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/property-provider": "^4.2.14", + "@smithy/smithy-client": "^4.12.13", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2772,14 +3095,14 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", - "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.4.2.tgz", + "integrity": "sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.8", - "@smithy/types": "^4.12.0", + "@smithy/node-config-provider": "^4.3.14", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2787,9 +3110,9 @@ } }, "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2800,13 +3123,13 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", - "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.14.tgz", + "integrity": "sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2814,14 +3137,14 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", - "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.6.tgz", + "integrity": "sha512-p6/FO1n2KxMeQyna067i0uJ6TSbb165ZhnRtCpWh4Foxqbfc6oW+XITaL8QkFJj3KFnDe2URt4gOhgU06EP9ew==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/service-error-classification": "^4.3.1", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2829,19 +3152,19 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.11", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.11.tgz", - "integrity": "sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==", + "version": "4.5.25", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.25.tgz", + "integrity": "sha512-/PFpG4k8Ze8Ei+mMKj3oiPICYekthuzePZMgZbCqMiXIHHf4n2aZ4Ps0aSRShycFTGuj/J6XldmC0x0DwednIA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.9", - "@smithy/node-http-handler": "^4.4.9", - "@smithy/types": "^4.12.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/fetch-http-handler": "^5.3.17", + "@smithy/node-http-handler": "^4.6.1", + "@smithy/types": "^4.14.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2849,9 +3172,9 @@ } }, "node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", + "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2862,13 +3185,13 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", + "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-buffer-from": "^4.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2876,14 +3199,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", - "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.3.0.tgz", + "integrity": "sha512-JyjYmLAfS+pdxF92o4yLgEoy0zhayKTw73FU1aofLWwLcJw7iSqIY2exGmMTrl/lmZugP5p/zxdFSippJDfKWA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.8", - "@smithy/types": "^4.12.0", + "@smithy/types": "^4.14.1", "tslib": "^2.6.2" }, "engines": { @@ -2891,9 +3213,9 @@ } }, "node_modules/@smithy/uuid": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", - "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3239,10 +3561,26 @@ "node": ">=6" } }, + "node_modules/fast-xml-builder": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", + "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, "node_modules/fast-xml-parser": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.4.tgz", - "integrity": "sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", + "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", "dev": true, "funding": [ { @@ -3252,7 +3590,10 @@ ], "license": "MIT", "dependencies": { - "strnum": "^2.1.0" + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" @@ -3431,6 +3772,22 @@ "dev": true, "license": "MIT" }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/playwright": { "version": "1.56.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.0.tgz", @@ -3537,9 +3894,9 @@ } }, "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", "dev": true, "funding": [ { @@ -3773,6 +4130,7 @@ "@aws-sdk/client-cognito-identity-provider": "3.986.0", "@aws-sdk/client-dynamodb": "3.986.0", "@aws-sdk/client-eventbridge": "^3.986.0", + "@aws-sdk/client-lambda": "^3.986.0", "@aws-sdk/client-ssm": "3.986.0", "@aws-sdk/lib-dynamodb": "3.986.0", "@types/node": "^22.13.1", diff --git a/project.code-workspace b/project.code-workspace index a52565db..308e8fb2 100644 --- a/project.code-workspace +++ b/project.code-workspace @@ -61,7 +61,7 @@ ], "cSpell.language": "en-GB", "editor.wordWrap": "off", - "editor.formatOnSave": false, + "editor.formatOnSave": true, "[plaintext]": { "editor.wordWrap": "off", "editor.formatOnSave": false, diff --git a/tests/security/lifecycle/auth/setup.ts b/tests/security/lifecycle/auth/setup.ts index 5f678a8e..0b635c95 100644 --- a/tests/security/lifecycle/auth/setup.ts +++ b/tests/security/lifecycle/auth/setup.ts @@ -7,13 +7,13 @@ import { import { users } from '../../fixtures/users'; async function main() { - const { lifecycleServiceDir, targetEnvrionment, runId } = + const { lifecycleServiceDir, targetEnvironment, runId } = parseSetupTeardownArgs(process.argv); const stateFile = new StateFile(lifecycleServiceDir, runId); const authHelper = await AuthHelper.init( - targetEnvrionment, + targetEnvironment, 'security', runId ); diff --git a/tests/security/lifecycle/auth/teardown.ts b/tests/security/lifecycle/auth/teardown.ts index 8847652f..d5cc04ee 100644 --- a/tests/security/lifecycle/auth/teardown.ts +++ b/tests/security/lifecycle/auth/teardown.ts @@ -7,14 +7,14 @@ import z from 'zod'; import { users } from '../../fixtures/users'; async function main() { - const { lifecycleServiceDir, targetEnvrionment, runId } = + const { lifecycleServiceDir, targetEnvironment, runId } = parseSetupTeardownArgs(process.argv); const stateFile = new StateFile(lifecycleServiceDir, runId); await stateFile.loadFromDisk(); const authHelper = await AuthHelper.init( - targetEnvrionment, + targetEnvironment, 'security', runId ); diff --git a/tests/security/lifecycle/templates/setup.ts b/tests/security/lifecycle/templates/setup.ts index ec91808e..d06376ac 100644 --- a/tests/security/lifecycle/templates/setup.ts +++ b/tests/security/lifecycle/templates/setup.ts @@ -12,14 +12,13 @@ import { clients } from '../../fixtures/clients'; import { randomUUID } from 'node:crypto'; async function main() { - const { lifecycleServiceDir, targetEnvrionment, runId } = + const { lifecycleServiceDir, targetEnvironment, runId } = parseSetupTeardownArgs(process.argv); const stateFile = new StateFile(lifecycleServiceDir, runId); - const sftpPollingFrequency = await increaseSftpPollingFrequency( - targetEnvrionment - ); + const sftpPollingFrequency = + await increaseSftpPollingFrequency(targetEnvironment); stateFile.setValue( 'initialState', @@ -34,7 +33,7 @@ async function main() { await Promise.all( clientEntries.map(([, { id, config }]) => - createClientConfig(targetEnvrionment, id, config, 'security') + createClientConfig(targetEnvironment, id, config, 'security') ) ); @@ -62,7 +61,11 @@ async function main() { message: 'multi-channel-routing-config-nhsapp-message', } ); - stateFile.setValue('templates', 'multiChannelRoutingConfigNhsApp', multiChannelRoutingConfigNhsAppTemplate); + stateFile.setValue( + 'templates', + 'multiChannelRoutingConfigNhsApp', + multiChannelRoutingConfigNhsAppTemplate + ); const multiChannelRoutingConfigEmailTemplate = TemplateFactory.create( randomUUID(), @@ -74,7 +77,11 @@ async function main() { subject: 'multi-channel-routing-config-email-template-subject', } ); - stateFile.setValue('templates', 'multiChannelRoutingConfigEmail', multiChannelRoutingConfigEmailTemplate); + stateFile.setValue( + 'templates', + 'multiChannelRoutingConfigEmail', + multiChannelRoutingConfigEmailTemplate + ); const multiChannelRoutingConfigSmsTemplate = TemplateFactory.create( randomUUID(), @@ -85,9 +92,13 @@ async function main() { message: 'multi-channel-routing-config-sms-template-message', } ); - stateFile.setValue('templates', 'multiChannelRoutingConfigSms', multiChannelRoutingConfigSmsTemplate); + stateFile.setValue( + 'templates', + 'multiChannelRoutingConfigSms', + multiChannelRoutingConfigSmsTemplate + ); - await new StorageHelper(`nhs-notify-${targetEnvrionment}-app-api-templates`, [ + await new StorageHelper(`nhs-notify-${targetEnvironment}-app-api-templates`, [ smsTemplate, multiChannelRoutingConfigNhsAppTemplate, multiChannelRoutingConfigEmailTemplate, diff --git a/tests/security/lifecycle/templates/teardown.ts b/tests/security/lifecycle/templates/teardown.ts index 106e355c..a5c6d8c1 100644 --- a/tests/security/lifecycle/templates/teardown.ts +++ b/tests/security/lifecycle/templates/teardown.ts @@ -8,7 +8,7 @@ import { import z from 'zod'; async function main() { - const { lifecycleServiceDir, targetEnvrionment, runId } = + const { lifecycleServiceDir, targetEnvironment, runId } = parseSetupTeardownArgs(process.argv); const stateFile = new StateFile(lifecycleServiceDir, runId); @@ -23,7 +23,7 @@ async function main() { ); await restoreSftpPollingFrequency( - targetEnvrionment, + targetEnvironment, initialSftpPollingFrequency ).catch((error) => { exit = 1; @@ -37,7 +37,7 @@ async function main() { ) ); - await deleteClientConfigs(targetEnvrionment, clientIds).catch((error) => { + await deleteClientConfigs(targetEnvironment, clientIds).catch((error) => { exit = 1; console.error(error); }); @@ -50,18 +50,24 @@ async function main() { const deletedTemplates = await Promise.allSettled( [...clientIds, cis2ClientId].map((id) => - deleteClientEntries(id, `nhs-notify-${targetEnvrionment}-app-api-templates`) + deleteClientEntries( + id, + `nhs-notify-${targetEnvironment}-app-api-templates` + ) ) ); const deletedRoutingConfigs = await Promise.allSettled( [...clientIds, cis2ClientId].map((id) => - deleteClientEntries(id, `nhs-notify-${targetEnvrionment}-app-api-routing-configuration`) + deleteClientEntries( + id, + `nhs-notify-${targetEnvironment}-app-api-routing-configuration` + ) ) ); - const failures = [...deletedTemplates, ...deletedRoutingConfigs].flatMap((res) => - res.status === 'rejected' ? [res.reason] : [] + const failures = [...deletedTemplates, ...deletedRoutingConfigs].flatMap( + (res) => (res.status === 'rejected' ? [res.reason] : []) ); if (failures.length) { diff --git a/tests/security/pages/template-mgmt-base-page.ts b/tests/security/pages/template-mgmt-base-page.ts index d3c4c680..88de806f 100644 --- a/tests/security/pages/template-mgmt-base-page.ts +++ b/tests/security/pages/template-mgmt-base-page.ts @@ -1,4 +1,4 @@ -import { Locator, type Page, expect } from "@playwright/test"; +import { Locator, type Page, expect } from '@playwright/test'; export class TemplateMgmtBasePage { readonly page: Page; @@ -37,31 +37,36 @@ export class TemplateMgmtBasePage { this.loginLink = page.locator(`//a[text()='Sign in']`); // Note: doing [class="nhsuk-back-link__link"] will not find the element if it has other class names - this.goBackLink = page.locator('#maincontent').getByRole('link', { name: 'Back to all templates' }); + this.goBackLink = page + .locator('#maincontent') + .getByRole('link', { name: 'Back to all templates' }); - this.pageHeader = page.getByRole("heading", { level: 1 }); + this.pageHeader = page.getByRole('heading', { level: 1 }); - this.errorSummary = page.getByRole("alert", { name: "There is a problem" }); + this.errorSummary = page.getByRole('alert', { name: 'There is a problem' }); - this.errorSummaryHeading = page.getByRole("heading", { + this.errorSummaryHeading = page.getByRole('heading', { level: 2, - name: "There is a problem", + name: 'There is a problem', }); - this.errorSummaryList = this.errorSummary.getByRole("listitem"); + this.errorSummaryList = this.errorSummary.getByRole('listitem'); this.submitButton = page.locator('button.nhsuk-button[type="submit"]'); - this.submitTemplateButton = page.getByText("Submit template"); + this.submitTemplateButton = page.getByText('Submit template'); - this.templateToDelete = page.getByRole('link', { name: 'Test delete', exact: true }); + this.templateToDelete = page.getByRole('link', { + name: 'Test delete', + exact: true, + }); this.templateEdited = (templateName: string) => page.getByRole('link', { name: templateName, exact: true }); this.skipLink = page .locator('[id="skip-link"]') - .and(page.getByText("Skip to main content")); + .and(page.getByText('Skip to main content')); } async navigateTo(url: string) { @@ -77,15 +82,15 @@ export class TemplateMgmtBasePage { } async noTemplatesAvailable() { - return await this.page.getByTestId("no-templates-available").isVisible(); + return await this.page.getByTestId('no-templates-available').isVisible(); } async clickButtonByName(buttonName: string) { - await this.page.getByRole("button", { name: buttonName }).click(); + await this.page.getByRole('button', { name: buttonName }).click(); } - async clickLinkByName(linkName: string) { - await this.page.getByRole("link", { name: linkName, exact: true }).click(); + async clickLinkByName(linkName: string, opts?: { exact?: true }) { + await this.page.getByRole('link', { name: linkName, ...opts }).click(); } async clickSubmitButton() { @@ -93,7 +98,7 @@ export class TemplateMgmtBasePage { } async loadPage(_: string) { - throw new Error("Not implemented"); + throw new Error('Not implemented'); } async clickBackLink() { @@ -110,7 +115,7 @@ export class TemplateMgmtBasePage { async fillTextBox(textBoxName: string, textBoxContent: string) { await this.page - .getByRole("textbox", { name: textBoxName }) + .getByRole('textbox', { name: textBoxName }) .fill(textBoxContent); } @@ -119,7 +124,7 @@ export class TemplateMgmtBasePage { } async checkRadio(radioName: string) { - await this.page.getByRole("radio", { name: radioName }).check(); + await this.page.getByRole('radio', { name: radioName }).check(); } async tableRows() { @@ -129,8 +134,10 @@ export class TemplateMgmtBasePage { } async clickFirstTableRowLink() { - const link = this.page.locator('table:nth-of-type(1) tr:nth-of-type(1) td:nth-of-type(1) a'); - await expect(link).toContainText("COPY"); + const link = this.page.locator( + 'table:nth-of-type(1) tr:nth-of-type(1) td:nth-of-type(1) a' + ); + await expect(link).toContainText('COPY'); await link.click(); } diff --git a/tests/shared/package.json b/tests/shared/package.json index a85fce1b..e0beacb9 100644 --- a/tests/shared/package.json +++ b/tests/shared/package.json @@ -10,6 +10,7 @@ "@aws-sdk/client-cognito-identity-provider": "3.986.0", "@aws-sdk/client-dynamodb": "3.986.0", "@aws-sdk/client-eventbridge": "^3.986.0", + "@aws-sdk/client-lambda": "^3.986.0", "@aws-sdk/client-ssm": "3.986.0", "@aws-sdk/lib-dynamodb": "3.986.0", "@types/node": "^22.13.1", diff --git a/tests/shared/setup-teardown/domain/index.ts b/tests/shared/setup-teardown/domain/index.ts index ef6a8d8c..43b49aeb 100644 --- a/tests/shared/setup-teardown/domain/index.ts +++ b/tests/shared/setup-teardown/domain/index.ts @@ -1,6 +1,8 @@ -export * from './auth-helper' -export * from './delete-client-templates' -export * from './get-cis2-client-id' -export * from './templates-client-config' -export * from './sftp-polling-frequency' -export * from './template-factory' +export * from './auth-helper'; +export * from './delete-client-templates'; +export * from './get-cis2-client-id'; +export * from './letter-variant-cache'; +export * from './letter-variant-factory'; +export * from './templates-client-config'; +export * from './sftp-polling-frequency'; +export * from './template-factory'; diff --git a/tests/shared/setup-teardown/domain/letter-variant-cache.ts b/tests/shared/setup-teardown/domain/letter-variant-cache.ts new file mode 100644 index 00000000..56a4bbbb --- /dev/null +++ b/tests/shared/setup-teardown/domain/letter-variant-cache.ts @@ -0,0 +1,21 @@ +import { + getLambdaEnvironmentVariables, + setLambdaEnvironmentVariables, +} from '../util'; + +export async function getLetterVariantCacheTTL(env: string) { + const vars = await getLambdaEnvironmentVariables( + `nhs-notify-${env}-app-get-template-letter-variants` + ); + + return vars.LETTER_VARIANT_CACHE_TTL_MS; +} + +export async function setLetterVariantCacheTTL(env: string, ttl: string) { + await setLambdaEnvironmentVariables( + `nhs-notify-${env}-app-get-template-letter-variants`, + { + LETTER_VARIANT_CACHE_TTL_MS: ttl, + } + ); +} diff --git a/tests/shared/setup-teardown/domain/letter-variant-factory.ts b/tests/shared/setup-teardown/domain/letter-variant-factory.ts new file mode 100644 index 00000000..257f0dfd --- /dev/null +++ b/tests/shared/setup-teardown/domain/letter-variant-factory.ts @@ -0,0 +1,24 @@ +import { randomUUID } from 'node:crypto'; + +export const LetterVariantFactory = { + create: ({ name }: { name: string }) => { + const id = randomUUID(); + return { + PK: `VARIANT#${id}`, + SK: 'METADATA', + ByScopeIndexPK: 'GLOBAL', + ByScopeIndexSK: `STANDARD#PROD#${id}`, + bothSides: true, + dispatchTime: 'standard', + envelopeSize: 'C4', + id, + maxSheets: 20, + name, + postage: 'economy', + printColour: 'black', + sheetSize: 'A4', + status: 'PROD', + type: 'STANDARD', + }; + }, +}; diff --git a/tests/shared/setup-teardown/util/index.ts b/tests/shared/setup-teardown/util/index.ts index 86317fe8..b947daf8 100644 --- a/tests/shared/setup-teardown/util/index.ts +++ b/tests/shared/setup-teardown/util/index.ts @@ -1,3 +1,4 @@ export * from './parse-setup-teardown-args'; export * from './state-file'; export * from './storage-helper'; +export * from './lambda'; diff --git a/tests/shared/setup-teardown/util/lambda.ts b/tests/shared/setup-teardown/util/lambda.ts new file mode 100644 index 00000000..6e5f0f85 --- /dev/null +++ b/tests/shared/setup-teardown/util/lambda.ts @@ -0,0 +1,37 @@ +import { + LambdaClient, + GetFunctionConfigurationCommand, + UpdateFunctionConfigurationCommand, +} from '@aws-sdk/client-lambda'; + +const client = new LambdaClient({ region: 'eu-west-2' }); + +export async function getLambdaEnvironmentVariables( + functionName: string +): Promise> { + const { Environment } = await client.send( + new GetFunctionConfigurationCommand({ + FunctionName: functionName, + }) + ); + + return Environment?.Variables ?? {}; +} +export async function setLambdaEnvironmentVariables( + functionName: string, + variables: Record +) { + const current = await getLambdaEnvironmentVariables(functionName); + + await client.send( + new UpdateFunctionConfigurationCommand({ + FunctionName: functionName, + Environment: { + Variables: { + ...current, + ...variables, + }, + }, + }) + ); +} diff --git a/tests/shared/setup-teardown/util/parse-setup-teardown-args.ts b/tests/shared/setup-teardown/util/parse-setup-teardown-args.ts index dd9620ec..ced739f6 100644 --- a/tests/shared/setup-teardown/util/parse-setup-teardown-args.ts +++ b/tests/shared/setup-teardown/util/parse-setup-teardown-args.ts @@ -3,22 +3,22 @@ import z from 'zod'; export function parseSetupTeardownArgs(argv: string[]): { lifecycleServiceDir: string; - targetEnvrionment: string; + targetEnvironment: string; runId: string; } { - const [, scriptPath, targetEnvrionment, runId] = argv; + const [, scriptPath, targetEnvironment, runId] = argv; const lifecycleServiceDir = dirname(scriptPath); const parseResult = z .object({ lifecycleServiceDir: z.string(), - targetEnvrionment: z.string(), + targetEnvironment: z.string(), runId: z.string(), }) .safeParse({ lifecycleServiceDir, - targetEnvrionment, + targetEnvironment, runId, }); diff --git a/tests/shared/setup-teardown/util/storage-helper.ts b/tests/shared/setup-teardown/util/storage-helper.ts index ef8dbb14..4d642c97 100644 --- a/tests/shared/setup-teardown/util/storage-helper.ts +++ b/tests/shared/setup-teardown/util/storage-helper.ts @@ -5,10 +5,14 @@ import { PutCommand, } from '@aws-sdk/lib-dynamodb'; -export class StorageHelper { +export class StorageHelper> { private readonly ddbDocClient: DynamoDBDocumentClient; - constructor(private readonly tableName: string, private readonly data: T[]) { + constructor( + private readonly tableName: string, + private readonly keyNames: T[], + private readonly data: U[] + ) { const dynamoClient = new DynamoDBClient({ region: 'eu-west-2' }); this.ddbDocClient = DynamoDBDocumentClient.from(dynamoClient); } @@ -31,9 +35,7 @@ export class StorageHelper { this.ddbDocClient.send( new DeleteCommand({ TableName: this.tableName, - Key: { - id: item.id, - }, + Key: Object.fromEntries(this.keyNames.map((key) => [key, item[key]])), }) ) ); diff --git a/tests/shared/tsconfig.json b/tests/shared/tsconfig.json index be3bbfc0..1af4cb9e 100644 --- a/tests/shared/tsconfig.json +++ b/tests/shared/tsconfig.json @@ -1,4 +1,7 @@ { "extends": "@tsconfig/node20/tsconfig.json", - "include": ["./**/*"] + "include": ["./**/*"], + "compilerOptions": { + "types": ["node"] + } } diff --git a/tests/shared/types.ts b/tests/shared/types.ts index 438c2027..e3a09919 100644 --- a/tests/shared/types.ts +++ b/tests/shared/types.ts @@ -1,7 +1,12 @@ export type StaticClientConfig = { templates: { - campaignIds?: string[]; - features?: { proofing?: boolean; routing?: boolean }; + campaignIds: string[]; + features?: { + proofing?: boolean; + routing?: boolean; + legacyLetters?: boolean; + letterAuthoring?: boolean; + }; }; auth: { name: string; diff --git a/tests/test-team/config/dev.config.ts b/tests/test-team/config/dev.config.ts index 2e99f0b1..be4d5029 100644 --- a/tests/test-team/config/dev.config.ts +++ b/tests/test-team/config/dev.config.ts @@ -18,8 +18,8 @@ export default defineConfig({ ...(process.env.PLAYWRIGHT_ZAP_PROXY && { ignoreHTTPSErrors: true, proxy: { server: process.env.PLAYWRIGHT_ZAP_PROXY }, - acceptDownloads: true - }) + acceptDownloads: true, + }), }, projects: [ @@ -38,7 +38,7 @@ export default defineConfig({ height: 1200, width: 1600, }, - headless: true + headless: true, }, }, ], diff --git a/tests/test-team/fixtures/clients.ts b/tests/test-team/fixtures/clients.ts index 77696d5e..e6c7402a 100644 --- a/tests/test-team/fixtures/clients.ts +++ b/tests/test-team/fixtures/clients.ts @@ -7,7 +7,7 @@ export const clients: Record = { features: { proofing: false, routing: false, - legacyLetters: true + legacyLetters: true, }, }, auth: { @@ -20,7 +20,7 @@ export const clients: Record = { features: { proofing: false, routing: false, - legacyLetters: true + legacyLetters: true, }, }, auth: { @@ -33,7 +33,7 @@ export const clients: Record = { features: { proofing: false, routing: false, - legacyLetters: true + legacyLetters: true, }, }, auth: { @@ -46,7 +46,7 @@ export const clients: Record = { features: { proofing: false, routing: true, - legacyLetters: true + legacyLetters: true, }, }, auth: { @@ -59,7 +59,7 @@ export const clients: Record = { features: { proofing: false, routing: true, - legacyLetters: true + legacyLetters: true, }, }, auth: { @@ -72,11 +72,27 @@ export const clients: Record = { features: { proofing: true, routing: true, - legacyLetters: true + legacyLetters: true, }, }, auth: { name: 'Delete - Routing Enabled', }, }, + LetterAuthoringEnabledProduct: { + templates: { + campaignIds: [ + 'LetterAuthoringEnabled-Campaign', + 'LetterAuthoringEnabled-Campaign2', + ], + features: { + proofing: false, + routing: true, + letterAuthoring: true, + }, + }, + auth: { + name: 'Letter Authoring Enabled', + }, + }, }; diff --git a/tests/test-team/fixtures/letter-variants.ts b/tests/test-team/fixtures/letter-variants.ts new file mode 100644 index 00000000..b937c72f --- /dev/null +++ b/tests/test-team/fixtures/letter-variants.ts @@ -0,0 +1,14 @@ +import z from 'zod'; +import { templatesStateFile } from '../lifecycle/templates/state'; + +const $LetterVariant = z.object({ + name: z.string(), +}); + +export const GLOBAL_LETTER_VARIANT_KEY = 'global-letter-variant'; + +export async function getLetterVariant(key: string) { + const stateFile = await templatesStateFile(); + + return stateFile.getValue('letterVariants', key, $LetterVariant); +} diff --git a/tests/test-team/fixtures/users.ts b/tests/test-team/fixtures/users.ts index 51a5cdcf..08a4fb98 100644 --- a/tests/test-team/fixtures/users.ts +++ b/tests/test-team/fixtures/users.ts @@ -26,4 +26,8 @@ export const users: Record = { clientKey: 'DeleteRoutingEnabledProduct', clientConfig: clients['DeleteRoutingEnabledProduct'].auth, }, + letterAuthoringEnabled: { + clientKey: 'LetterAuthoringEnabledProduct', + clientConfig: clients['LetterAuthoringEnabledProduct'].auth, + }, }; diff --git a/tests/test-team/lifecycle/auth/setup.ts b/tests/test-team/lifecycle/auth/setup.ts index b9f764b1..2d597adc 100644 --- a/tests/test-team/lifecycle/auth/setup.ts +++ b/tests/test-team/lifecycle/auth/setup.ts @@ -7,12 +7,12 @@ import { import { users } from '../../fixtures/users'; async function main() { - const { lifecycleServiceDir, targetEnvrionment, runId } = + const { lifecycleServiceDir, targetEnvironment, runId } = parseSetupTeardownArgs(process.argv); const stateFile = new StateFile(lifecycleServiceDir, runId); - const authHelper = await AuthHelper.init(targetEnvrionment, 'product', runId); + const authHelper = await AuthHelper.init(targetEnvironment, 'product', runId); const createdUserEntries: [string, User][] = await Promise.all( Object.entries(users).map(async ([userKey, config]) => { diff --git a/tests/test-team/lifecycle/auth/teardown.ts b/tests/test-team/lifecycle/auth/teardown.ts index a99bce84..ca665b0c 100644 --- a/tests/test-team/lifecycle/auth/teardown.ts +++ b/tests/test-team/lifecycle/auth/teardown.ts @@ -7,13 +7,13 @@ import z from 'zod'; import { users } from '../../fixtures/users'; async function main() { - const { lifecycleServiceDir, targetEnvrionment, runId } = + const { lifecycleServiceDir, targetEnvironment, runId } = parseSetupTeardownArgs(process.argv); const stateFile = new StateFile(lifecycleServiceDir, runId); await stateFile.loadFromDisk(); - const authHelper = await AuthHelper.init(targetEnvrionment, 'product', runId); + const authHelper = await AuthHelper.init(targetEnvironment, 'product', runId); const usersState = stateFile.getValues( 'users', diff --git a/tests/test-team/lifecycle/templates/setup.ts b/tests/test-team/lifecycle/templates/setup.ts index 70c0f2cf..5e785da4 100644 --- a/tests/test-team/lifecycle/templates/setup.ts +++ b/tests/test-team/lifecycle/templates/setup.ts @@ -1,26 +1,28 @@ import { randomUUID } from 'node:crypto'; import { createClientConfig, + getCis2ClientId, increaseSftpPollingFrequency, - type StaticClientConfig, parseSetupTeardownArgs, StateFile, - getCis2ClientId, - TemplateFactory, StorageHelper, + TemplateFactory, TemplateType, + LetterVariantFactory, + getLetterVariantCacheTTL, + setLetterVariantCacheTTL, } from 'nhs-notify-system-tests-shared'; import { clients } from '../../fixtures/clients'; +import { GLOBAL_LETTER_VARIANT_KEY } from '../../fixtures/letter-variants'; async function main() { - const { lifecycleServiceDir, targetEnvrionment, runId } = + const { lifecycleServiceDir, targetEnvironment, runId } = parseSetupTeardownArgs(process.argv); const stateFile = new StateFile(lifecycleServiceDir, runId); - const sftpPollingFrequency = await increaseSftpPollingFrequency( - targetEnvrionment - ); + const sftpPollingFrequency = + await increaseSftpPollingFrequency(targetEnvironment); stateFile.setValue( 'initialState', @@ -28,6 +30,17 @@ async function main() { sftpPollingFrequency ); + const letterVariantCacheTTL = + await getLetterVariantCacheTTL(targetEnvironment); + + stateFile.setValue( + 'initialState', + 'letterVariantCacheTTL', + letterVariantCacheTTL + ); + + await setLetterVariantCacheTTL(targetEnvironment, '0'); + const clientEntries = Object.entries(clients).map( ([key, config]) => [key, { config: config.templates, id: `${key}${runId}` }] as const @@ -35,17 +48,16 @@ async function main() { await Promise.all( clientEntries.map(([, { id, config }]) => - createClientConfig(targetEnvrionment, id, config, 'product') + createClientConfig(targetEnvironment, id, config, 'product') ) ); - const clientIds = Object.fromEntries(clientEntries.map(([key, { id }]) => [key, id])); - - stateFile.setValues( - 'clientIds', - clientIds, + const clientIds = Object.fromEntries( + clientEntries.map(([key, { id }]) => [key, id]) ); + stateFile.setValues('clientIds', clientIds); + const cis2ClientId = await getCis2ClientId(); stateFile.setValue('cis2', 'notify-client-id', cis2ClientId); @@ -59,7 +71,11 @@ async function main() { message: 'multi-channel-routing-config-nhsapp-message', } ); - stateFile.setValue('templates', 'multiChannelRoutingConfigNhsApp', multiChannelRoutingConfigNhsAppTemplate); + stateFile.setValue( + 'templates', + 'multiChannelRoutingConfigNhsApp', + multiChannelRoutingConfigNhsAppTemplate + ); const multiChannelRoutingConfigEmailTemplate = TemplateFactory.create( randomUUID(), @@ -71,7 +87,11 @@ async function main() { subject: 'multi-channel-routing-config-email-template-subject', } ); - stateFile.setValue('templates', 'multiChannelRoutingConfigEmail', multiChannelRoutingConfigEmailTemplate); + stateFile.setValue( + 'templates', + 'multiChannelRoutingConfigEmail', + multiChannelRoutingConfigEmailTemplate + ); const multiChannelRoutingConfigSmsTemplate = TemplateFactory.create( randomUUID(), @@ -82,13 +102,37 @@ async function main() { message: 'multi-channel-routing-config-sms-template-message', } ); - stateFile.setValue('templates', 'multiChannelRoutingConfigSms', multiChannelRoutingConfigSmsTemplate); + stateFile.setValue( + 'templates', + 'multiChannelRoutingConfigSms', + multiChannelRoutingConfigSmsTemplate + ); + + await new StorageHelper( + `nhs-notify-${targetEnvironment}-app-api-templates`, + ['owner', 'id'], + [ + multiChannelRoutingConfigNhsAppTemplate, + multiChannelRoutingConfigEmailTemplate, + multiChannelRoutingConfigSmsTemplate, + ] + ).seedData(); + + const globalVariant = LetterVariantFactory.create({ + name: `system-tests-global-variant-${runId}`, + }); + + await new StorageHelper( + `nhs-notify-${targetEnvironment}-app-api-letter-variants`, + ['PK', 'SK'], + [globalVariant] + ).seedData(); - await new StorageHelper(`nhs-notify-${targetEnvrionment}-app-api-templates`, [ - multiChannelRoutingConfigNhsAppTemplate, - multiChannelRoutingConfigEmailTemplate, - multiChannelRoutingConfigSmsTemplate, - ]).seedData(); + stateFile.setValue( + 'letterVariants', + GLOBAL_LETTER_VARIANT_KEY, + globalVariant + ); await stateFile.persist(); } diff --git a/tests/test-team/lifecycle/templates/state.ts b/tests/test-team/lifecycle/templates/state.ts new file mode 100644 index 00000000..e9e1e0ef --- /dev/null +++ b/tests/test-team/lifecycle/templates/state.ts @@ -0,0 +1,7 @@ +import { StateFile } from 'nhs-notify-system-tests-shared'; + +export const templatesStateFile = async () => { + const file = new StateFile(__dirname, process.env.RUN_ID); + await file.loadFromDisk(); + return file; +}; diff --git a/tests/test-team/lifecycle/templates/teardown.ts b/tests/test-team/lifecycle/templates/teardown.ts index 106e355c..ac89bbfb 100644 --- a/tests/test-team/lifecycle/templates/teardown.ts +++ b/tests/test-team/lifecycle/templates/teardown.ts @@ -4,11 +4,13 @@ import { StateFile, deleteClientConfigs, deleteClientEntries, + StorageHelper, + setLetterVariantCacheTTL, } from 'nhs-notify-system-tests-shared'; import z from 'zod'; async function main() { - const { lifecycleServiceDir, targetEnvrionment, runId } = + const { lifecycleServiceDir, targetEnvironment, runId } = parseSetupTeardownArgs(process.argv); const stateFile = new StateFile(lifecycleServiceDir, runId); @@ -23,13 +25,27 @@ async function main() { ); await restoreSftpPollingFrequency( - targetEnvrionment, + targetEnvironment, initialSftpPollingFrequency ).catch((error) => { exit = 1; console.error(error); }); + const initialLetterVariantCacheTTL = stateFile.getValue( + 'initialState', + 'letterVariantCacheTTL', + z.string() + ); + + await setLetterVariantCacheTTL( + targetEnvironment, + initialLetterVariantCacheTTL + ).catch((error) => { + exit = 1; + console.error(error); + }); + const clientIds = Object.values( stateFile.getValues( 'clientIds', @@ -37,7 +53,7 @@ async function main() { ) ); - await deleteClientConfigs(targetEnvrionment, clientIds).catch((error) => { + await deleteClientConfigs(targetEnvironment, clientIds).catch((error) => { exit = 1; console.error(error); }); @@ -50,20 +66,43 @@ async function main() { const deletedTemplates = await Promise.allSettled( [...clientIds, cis2ClientId].map((id) => - deleteClientEntries(id, `nhs-notify-${targetEnvrionment}-app-api-templates`) + deleteClientEntries( + id, + `nhs-notify-${targetEnvironment}-app-api-templates` + ) ) ); const deletedRoutingConfigs = await Promise.allSettled( [...clientIds, cis2ClientId].map((id) => - deleteClientEntries(id, `nhs-notify-${targetEnvrionment}-app-api-routing-configuration`) + deleteClientEntries( + id, + `nhs-notify-${targetEnvironment}-app-api-routing-configuration` + ) ) ); - const failures = [...deletedTemplates, ...deletedRoutingConfigs].flatMap((res) => - res.status === 'rejected' ? [res.reason] : [] + const letterVariants = Object.values( + stateFile.getValues( + 'letterVariants', + z.record(z.string(), z.object({ PK: z.string(), SK: z.string() })) + ) ); + const deletedLetterVariants = await Promise.allSettled([ + new StorageHelper( + `nhs-notify-${targetEnvironment}-app-api-letter-variants`, + ['PK', 'SK'], + letterVariants + ).deleteData(), + ]); + + const failures = [ + ...deletedTemplates, + ...deletedRoutingConfigs, + ...deletedLetterVariants, + ].flatMap((res) => (res.status === 'rejected' ? [res.reason] : [])); + if (failures.length) { exit = 1; console.error(new AggregateError(failures)); diff --git a/tests/test-team/pages/template-mgmt-base-page.ts b/tests/test-team/pages/template-mgmt-base-page.ts index 8ba0e9cc..3455f264 100644 --- a/tests/test-team/pages/template-mgmt-base-page.ts +++ b/tests/test-team/pages/template-mgmt-base-page.ts @@ -1,4 +1,4 @@ -import { Locator, type Page, expect } from "@playwright/test"; +import { Locator, type Page, expect } from '@playwright/test'; export class TemplateMgmtBasePage { readonly page: Page; @@ -37,31 +37,36 @@ export class TemplateMgmtBasePage { this.loginLink = page.locator(`//a[text()='Sign in']`); // Note: doing [class="nhsuk-back-link__link"] will not find the element if it has other class names - this.goBackLink = page.locator('#maincontent').getByRole('link', { name: 'Back to all templates' }); + this.goBackLink = page + .locator('#maincontent') + .getByRole('link', { name: 'Back to all templates' }); - this.pageHeader = page.getByRole("heading", { level: 1 }); + this.pageHeader = page.getByRole('heading', { level: 1 }); - this.errorSummary = page.getByRole("alert", { name: "There is a problem" }); + this.errorSummary = page.getByRole('alert', { name: 'There is a problem' }); - this.errorSummaryHeading = page.getByRole("heading", { + this.errorSummaryHeading = page.getByRole('heading', { level: 2, - name: "There is a problem", + name: 'There is a problem', }); - this.errorSummaryList = this.errorSummary.getByRole("listitem"); + this.errorSummaryList = this.errorSummary.getByRole('listitem'); this.submitButton = page.locator('button.nhsuk-button[type="submit"]'); - this.submitTemplateButton = page.getByText("Submit template"); + this.submitTemplateButton = page.getByText('Submit template'); - this.templateToDelete = page.getByRole('link', { name: 'Test delete', exact: true }); + this.templateToDelete = page.getByRole('link', { + name: 'Test delete', + exact: true, + }); this.templateEdited = (templateName: string) => page.getByRole('link', { name: templateName, exact: true }); this.skipLink = page .locator('[id="skip-link"]') - .and(page.getByText("Skip to main content")); + .and(page.getByText('Skip to main content')); } async navigateTo(url: string) { @@ -77,15 +82,15 @@ export class TemplateMgmtBasePage { } async noTemplatesAvailable() { - return await this.page.getByTestId("no-templates-available").isVisible(); + return await this.page.getByTestId('no-templates-available').isVisible(); } async clickButtonByName(buttonName: string) { - await this.page.getByRole("button", { name: buttonName }).click(); + await this.page.getByRole('button', { name: buttonName }).click(); } - async clickLinkByName(linkName: string) { - await this.page.getByRole("link", { name: linkName, exact: true }).click(); + async clickLinkByName(linkName: string, opts?: { exact?: boolean }) { + await this.page.getByRole('link', { name: linkName, ...opts }).click(); } async clickSubmitButton() { @@ -93,7 +98,7 @@ export class TemplateMgmtBasePage { } async loadPage(_: string) { - throw new Error("Not implemented"); + throw new Error('Not implemented'); } async clickBackLink() { @@ -109,13 +114,23 @@ export class TemplateMgmtBasePage { } async fillTextBox(textBoxLabel: string, textBoxContent: string) { - await this.page - .getByLabel(textBoxLabel) - .fill(textBoxContent); + await this.page.getByLabel(textBoxLabel).fill(textBoxContent); } async checkRadio(radioName: string) { - await this.page.getByRole("radio", { name: radioName }).check(); + await this.page.getByRole('radio', { name: radioName }).check(); + } + + async checkCheckbox(label: string) { + await this.page.getByRole('checkbox', { name: label }).check(); + } + + async selectOption(label: string, option: string) { + await this.page.getByLabel(label).selectOption(option); + } + + async setFileInput(label: string, filename: string) { + await this.page.getByLabel(label).setInputFiles(filename); } async tableRows() { @@ -125,12 +140,29 @@ export class TemplateMgmtBasePage { } async clickFirstTableRowLink() { - const link = this.page.locator('table:nth-of-type(1) tr:nth-of-type(1) td:nth-of-type(1) a'); - await expect(link).toContainText("COPY"); + const link = this.page.locator( + 'table:nth-of-type(1) tr:nth-of-type(1) td:nth-of-type(1) a' + ); + await expect(link).toContainText('COPY'); await link.click(); } async logOut() { await this.page.getByTestId('sign-out-link').click(); } + + async clickNavigationLink(name: string) { + await this.page + .getByRole('navigation', { name: 'Menu' }) + .getByRole('link', { name }) + .click(); + } + + getSummaryListValue(label: string) { + const row = this.page.locator('.nhsuk-summary-list__row', { + has: this.page.locator('dt', { hasText: label }), + }); + + return row.locator('dd.nhsuk-summary-list__value'); + } } diff --git a/tests/test-team/standard-english-template.docx b/tests/test-team/standard-english-template.docx new file mode 100644 index 0000000000000000000000000000000000000000..2f88b459ccad4778115ad4880457f9ae58b2c3fc GIT binary patch literal 85406 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