From a4b2702ce12e9d185f3cf0846c7d0bfd0f2b1c46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 10:17:57 -0500 Subject: [PATCH 01/69] Bump @aws-sdk/client-s3 in the dev-minor-dependencies group (#7584) Bumps the dev-minor-dependencies group with 1 update: [@aws-sdk/client-s3](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3). Updates `@aws-sdk/client-s3` from 3.726.0 to 3.726.1 - [Release notes](https://github.com/aws/aws-sdk-js-v3/releases) - [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.726.1/clients/client-s3) --- updated-dependencies: - dependency-name: "@aws-sdk/client-s3" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-minor-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 0606d747c6..da9c11d427 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "cross-spawn": "^7.0.5" }, "dependencies": { - "@aws-sdk/client-s3": "3.726.0", + "@aws-sdk/client-s3": "3.726.1", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 2b090c5090..30a3eebe41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -107,16 +107,16 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-sdk/client-s3@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.726.0.tgz#eb065d900c7c5a04f3bcd36f32b2801a76d6b4ab" - integrity sha512-cxn2WvOCfGrME2xygWbfj/vIf2sIdv/UbQ9zJbN4aK6rpYQf/e/YtY/HIPkejCuw2Iwqm4jfDGFqaUcwu3nFew== +"@aws-sdk/client-s3@3.726.1": + version "3.726.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.726.1.tgz#05e9ae74be18758fc9d05a053777a8bb919fb24c" + integrity sha512-UpOGcob87DiuS2d3fW6vDZg94g57mNiOSkzvR/6GOdvBSlUgk8LLwVzGASB71FdKMl1EGEr4MeD5uKH9JsG+dw== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" "@aws-sdk/client-sso-oidc" "3.726.0" - "@aws-sdk/client-sts" "3.726.0" + "@aws-sdk/client-sts" "3.726.1" "@aws-sdk/core" "3.723.0" "@aws-sdk/credential-provider-node" "3.726.0" "@aws-sdk/middleware-bucket-endpoint" "3.726.0" @@ -260,10 +260,10 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.726.0.tgz#d878419a0bac65f5bf975c4d94efad5029e46932" - integrity sha512-047EqXv2BAn/43eP92zsozPnR3paFFMsj5gjytx9kGNtp+WV0fUZNztCOobtouAxBY0ZQ8Xx5RFnmjpRb6Kjsg== +"@aws-sdk/client-sts@3.726.1": + version "3.726.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.726.1.tgz#49ab471db7e04792db24e181f8bb8c7787739b34" + integrity sha512-qh9Q9Vu1hrM/wMBOBIaskwnE4GTFaZu26Q6WHwyWNfj7J8a40vBxpW16c2vYXHLBtwRKM1be8uRLkmDwghpiNw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" From 4e4712874b2e33c206ebf573bae5961b8f1325e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 10:38:18 -0500 Subject: [PATCH 02/69] Bump the babel group with 3 updates (#7581) Bumps the babel group with 3 updates: [@babel/eslint-parser](https://github.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser), [@babel/parser](https://github.com/babel/babel/tree/HEAD/packages/babel-parser) and [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse). Updates `@babel/eslint-parser` from 7.25.9 to 7.26.5 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.26.5/eslint/babel-eslint-parser) Updates `@babel/parser` from 7.26.3 to 7.26.5 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.26.5/packages/babel-parser) Updates `@babel/traverse` from 7.26.4 to 7.26.5 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.26.5/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/eslint-parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: babel - dependency-name: "@babel/parser" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: babel - dependency-name: "@babel/traverse" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: babel ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mercy --- package.json | 6 +++--- yarn.lock | 52 ++++++++++++++++++++++++++-------------------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index da9c11d427..995aa1824c 100644 --- a/package.json +++ b/package.json @@ -250,11 +250,11 @@ "@4tw/cypress-drag-drop": "^2.2.5", "@babel/cli": "7.26.4", "@babel/core": "7.26.0", - "@babel/eslint-parser": "7.25.9", + "@babel/eslint-parser": "7.26.5", "@babel/helper-call-delegate": "^7.12.13", "@babel/helper-get-function-arity": "^7.16.7", "@babel/helper-string-parser": "^7.25.9", - "@babel/parser": "^7.26.3", + "@babel/parser": "^7.26.5", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", @@ -267,7 +267,7 @@ "@babel/preset-react": "^7.26.3", "@babel/preset-typescript": "^7.26.0", "@babel/register": "^7.25.9", - "@babel/traverse": "^7.26.4", + "@babel/traverse": "^7.26.5", "@cfaester/enzyme-adapter-react-18": "^0.8.0", "@chromatic-com/storybook": "^3.2.3", "@cypress/react18": "^2.0.1", diff --git a/yarn.lock b/yarn.lock index 30a3eebe41..0f86b70a8a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -692,22 +692,22 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c" - integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ== +"@babel/eslint-parser@7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.26.5.tgz#aa669f4d873f9cd617050cf3c40c19cd96307efb" + integrity sha512-Kkm8C8uxI842AwQADxl0GbcG1rupELYLShazYEZO/2DYjhyWXJIOUVOE3tBYm6JXzUCNJOZEzqc4rCW/jsEQYQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== +"@babel/generator@^7.26.0", "@babel/generator@^7.26.5", "@babel/generator@^7.7.2": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -896,12 +896,12 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" + integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== dependencies: - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.5" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -1691,23 +1691,23 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.4": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" - integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== +"@babel/traverse@^7.18.9", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" + integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.3" - "@babel/parser" "^7.26.3" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.5" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.5" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.16.7", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" - integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== +"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.16.7", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" + integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" From 8b72e4684523d4137dbe6663516244f3d23e7113 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:07:40 -0500 Subject: [PATCH 03/69] Bump the dev-minor-dependencies group with 3 updates (#7585) Bumps the dev-minor-dependencies group with 3 updates: [json-schema-to-typescript](https://github.com/bcherny/json-schema-to-typescript), [postcss](https://github.com/postcss/postcss) and [sass](https://github.com/sass/dart-sass). Updates `json-schema-to-typescript` from 15.0.3 to 15.0.4 - [Changelog](https://github.com/bcherny/json-schema-to-typescript/blob/master/CHANGELOG.md) - [Commits](https://github.com/bcherny/json-schema-to-typescript/commits) Updates `postcss` from 8.4.49 to 8.5.0 - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.49...8.5.0) Updates `sass` from 1.83.1 to 1.83.4 - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.83.1...1.83.4) --- updated-dependencies: - dependency-name: json-schema-to-typescript dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: postcss dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-minor-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 6 +++--- yarn.lock | 34 +++++++++++++++++----------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 995aa1824c..a13dce6325 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "isomorphic-fetch": "3.0.0", "jotai": "2.11.0", "json-schema": "^0.4.0", - "json-schema-to-typescript": "^15.0.3", + "json-schema-to-typescript": "^15.0.4", "jvent": "1.0.2", "leaflet": "^1.9.4", "leaflet.gridlayer.googlemutant": "^0.14.1", @@ -370,13 +370,13 @@ "node-polyfill-webpack-plugin": "^4.1.0", "nodemon": "^3.1.9", "plop": "^4.0.1", - "postcss": "8.4.49", + "postcss": "8.5.0", "prettier": "3.4.2", "puppeteer": "^13.5.2", "react-dnd-test-backend": "16.0.1", "redux-mock-store": "^1.5.5", "rtlcss-webpack-plugin": "4.0.7", - "sass": "1.83.1", + "sass": "1.83.4", "sass-loader": "16.0.4", "storybook": "^8.1.11", "stream-mock": "^2.0.5", diff --git a/yarn.lock b/yarn.lock index 0f86b70a8a..1fa56b4975 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11697,10 +11697,10 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-schema-to-typescript@^15.0.3: - version "15.0.3" - resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-15.0.3.tgz#a58bc3e00e4480e76a8ee79471c01233494913be" - integrity sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA== +json-schema-to-typescript@^15.0.4: + version "15.0.4" + resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz#a530c7f17312503b262ae12233749732171840f3" + integrity sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ== dependencies: "@apidevtools/json-schema-ref-parser" "^11.5.5" "@types/json-schema" "^7.0.15" @@ -12627,10 +12627,10 @@ n-gram@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/n-gram/-/n-gram-1.0.1.tgz" -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== natural-compare-lite@^1.4.0: version "1.4.0" @@ -13895,12 +13895,12 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.49, postcss@^8.3.11, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47: - version "8.4.49" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== +postcss@8.5.0, postcss@^8.3.11, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47: + version "8.5.0" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.0.tgz#15244b9fd65f809b2819682456f0e7e1e30c145b" + integrity sha512-27VKOqrYfPncKA2NrFOVhP5MGAfHKLYn/Q0mz9cNQyRAKYi3VNHwYU2qKKqPCqgBmeeJ0uAFB56NumXZ5ZReXg== dependencies: - nanoid "^3.3.7" + nanoid "^3.3.8" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -15127,10 +15127,10 @@ sass-loader@16.0.4: dependencies: neo-async "^2.6.2" -sass@1.83.1: - version "1.83.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.1.tgz#dee1ab94b47a6f9993d3195d36f556bcbda64846" - integrity sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA== +sass@1.83.4: + version "1.83.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.4.tgz#5ccf60f43eb61eeec300b780b8dcb85f16eec6d1" + integrity sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA== dependencies: chokidar "^4.0.0" immutable "^5.0.2" From 6d1db8af05aed1fd60155a1ede3c2719f6d96764 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:44:38 -0500 Subject: [PATCH 04/69] Bump eslint-plugin-react from 7.37.3 to 7.37.4 in the eslint group (#7583) Bumps the eslint group with 1 update: [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react). Updates `eslint-plugin-react` from 7.37.3 to 7.37.4 - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.37.3...v7.37.4) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch dependency-group: eslint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mercy --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a13dce6325..aa67f4b903 100644 --- a/package.json +++ b/package.json @@ -351,7 +351,7 @@ "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "v7.37.3", + "eslint-plugin-react": "v7.37.4", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-storybook": "^0.11.2", "fetch-mock": "^9.11.0", diff --git a/yarn.lock b/yarn.lock index 1fa56b4975..b679f0f572 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8677,10 +8677,10 @@ eslint-plugin-react-hooks@^5.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz#3d34e37d5770866c34b87d5b499f5f0b53bf0854" integrity sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw== -eslint-plugin-react@v7.37.3: - version "7.37.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz#567549e9251533975c4ea9706f986c3a64832031" - integrity sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA== +eslint-plugin-react@v7.37.4: + version "7.37.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz#1b6c80b6175b6ae4b26055ae4d55d04c414c7181" + integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" From ed06afc74b4a657fcdb7c6cb0b617e97808a38f1 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 16 Jan 2025 11:56:16 -0300 Subject: [PATCH 05/69] update package --- package.json | 2 +- yarn.lock | 44 ++++++++++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index aa67f4b903..960c7d406a 100644 --- a/package.json +++ b/package.json @@ -210,7 +210,7 @@ "react-redux": "5.0.6", "react-redux-form": "^1.16.14", "react-render-if-visible": "^2.1.1", - "react-router-dom": "6.27.0", + "react-router-dom": "^7.1.1", "react-table": "^7.8.0", "react-table-sticky": "^1.1.3", "react-tabs": "^6.1.0", diff --git a/yarn.lock b/yarn.lock index b679f0f572..19c76a81c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3038,11 +3038,6 @@ resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz#d1b4befa423f692fa4abf1c79209702e7d8ae4b4" integrity sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA== -"@remix-run/router@1.20.0": - version "1.20.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.20.0.tgz#03554155b45d8b529adf635b2f6ad1165d70d8b4" - integrity sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg== - "@remix-run/router@1.21.0": version "1.21.0" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5" @@ -6913,6 +6908,11 @@ cookie@0.7.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== +cookie@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + cookie@~0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" @@ -14427,20 +14427,22 @@ react-render-if-visible@^2.1.1: resolved "https://registry.yarnpkg.com/react-render-if-visible/-/react-render-if-visible-2.1.1.tgz#b67d8a6d230d8e1e8986212a1d4098425a26810b" integrity sha512-dl6OZkF+ktKi/pMNt5Upn99gSWnOCAQdFp/WBclMsPs4dV/RLeE40lab8tixoHB4UEKsspv0jFR13HF4fxmPHw== -react-router-dom@6.27.0: - version "6.27.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.27.0.tgz#8d7972a425fd75f91c1e1ff67e47240c5752dc3f" - integrity sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g== +react-router-dom@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.1.1.tgz#9e76fb63a762ba5da13032f5fd9e4a24946396b6" + integrity sha512-vSrQHWlJ5DCfyrhgo0k6zViOe9ToK8uT5XGSmnuC2R3/g261IdIMpZVqfjD6vWSXdnf5Czs4VA/V60oVR6/jnA== dependencies: - "@remix-run/router" "1.20.0" - react-router "6.27.0" + react-router "7.1.1" -react-router@6.27.0: - version "6.27.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.27.0.tgz#db292474926c814c996c0ff3ef0162d1f9f60ed4" - integrity sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw== +react-router@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.1.1.tgz#88f5657fa5b8f0b918c7222ec710de0274d00b2e" + integrity sha512-39sXJkftkKWRZ2oJtHhCxmoCrBCULr/HAH4IT5DHlgu/Q0FCPV0S4Lx+abjDTx/74xoZzNYDYbOZWlJjruyuDQ== dependencies: - "@remix-run/router" "1.20.0" + "@types/cookie" "^0.6.0" + cookie "^1.0.1" + set-cookie-parser "^2.6.0" + turbo-stream "2.4.0" react-shallow-renderer@^16.15.0: version "16.15.0" @@ -15240,6 +15242,11 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + set-function-length@^1.2.1, set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -16440,6 +16447,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +turbo-stream@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/turbo-stream/-/turbo-stream-2.4.0.tgz#1e4fca6725e90fa14ac4adb782f2d3759a5695f0" + integrity sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g== + tween-functions@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tween-functions/-/tween-functions-1.2.0.tgz#1ae3a50e7c60bb3def774eac707acbca73bbc3ff" From e052ca798665fbaabec04e53b0ab1de1b9a1d121 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 16 Jan 2025 12:09:59 -0300 Subject: [PATCH 06/69] update package to new name --- package.json | 2 +- yarn.lock | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 960c7d406a..889a18935c 100644 --- a/package.json +++ b/package.json @@ -210,7 +210,7 @@ "react-redux": "5.0.6", "react-redux-form": "^1.16.14", "react-render-if-visible": "^2.1.1", - "react-router-dom": "^7.1.1", + "react-router": "^7.1.1", "react-table": "^7.8.0", "react-table-sticky": "^1.1.3", "react-tabs": "^6.1.0", diff --git a/yarn.lock b/yarn.lock index 19c76a81c1..ef79dd5dc6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14427,14 +14427,7 @@ react-render-if-visible@^2.1.1: resolved "https://registry.yarnpkg.com/react-render-if-visible/-/react-render-if-visible-2.1.1.tgz#b67d8a6d230d8e1e8986212a1d4098425a26810b" integrity sha512-dl6OZkF+ktKi/pMNt5Upn99gSWnOCAQdFp/WBclMsPs4dV/RLeE40lab8tixoHB4UEKsspv0jFR13HF4fxmPHw== -react-router-dom@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.1.1.tgz#9e76fb63a762ba5da13032f5fd9e4a24946396b6" - integrity sha512-vSrQHWlJ5DCfyrhgo0k6zViOe9ToK8uT5XGSmnuC2R3/g261IdIMpZVqfjD6vWSXdnf5Czs4VA/V60oVR6/jnA== - dependencies: - react-router "7.1.1" - -react-router@7.1.1: +react-router@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.1.1.tgz#88f5657fa5b8f0b918c7222ec710de0274d00b2e" integrity sha512-39sXJkftkKWRZ2oJtHhCxmoCrBCULr/HAH4IT5DHlgu/Q0FCPV0S4Lx+abjDTx/74xoZzNYDYbOZWlJjruyuDQ== From 3702a25e65c765bcae979bc5c6c5a88df5a9fea5 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 16 Jan 2025 12:15:32 -0300 Subject: [PATCH 07/69] remove @remix-run/router --- package.json | 1 - yarn.lock | 5 ----- 2 files changed, 6 deletions(-) diff --git a/package.json b/package.json index 889a18935c..65d2fc14b4 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,6 @@ "@huridocs/react-text-selection-handler": "^0.3.0", "@loadable/component": "^5.16.4", "@popperjs/core": "^2.11.8", - "@remix-run/router": "1.21.0", "@sentry/node": "^7.114.0", "@sentry/react": "7.114.0", "@sentry/tracing": "^7.114.0", diff --git a/yarn.lock b/yarn.lock index ef79dd5dc6..bd1ad82017 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3038,11 +3038,6 @@ resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz#d1b4befa423f692fa4abf1c79209702e7d8ae4b4" integrity sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA== -"@remix-run/router@1.21.0": - version "1.21.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5" - integrity sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA== - "@rtsao/scc@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" From 3883fb4ff89f3e20bb2d827cd410c1df31ce5416 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 16 Jan 2025 12:20:30 -0300 Subject: [PATCH 08/69] bulk update imports, types, mocks --- app/react/App/App.js | 2 +- app/react/App/Menu.tsx | 2 +- app/react/App/specs/Menu.spec.js | 4 ++-- .../Attachments/components/ViewDocumentLink.tsx | 2 +- .../components/specs/ViewDocumentLink.spec.tsx | 6 +++--- app/react/Forms/components/MultiSelect.tsx | 2 +- app/react/I18N/components/I18NLink.tsx | 2 +- app/react/I18N/components/I18NMenu.tsx | 2 +- app/react/I18N/components/specs/I18NLink.spec.js | 2 +- app/react/I18N/components/specs/I18NMenu.spec.tsx | 2 +- app/react/Layout/CurrentLocationLink.js | 2 +- app/react/Layout/DocumentsList.js | 2 +- app/react/Layout/specs/CurrentLocationLink.spec.js | 4 ++-- app/react/Library/components/DocumentTypesList.js | 2 +- .../Library/components/FiltersFromProperties.js | 2 +- app/react/Library/components/SearchBar.tsx | 2 +- app/react/Library/components/SortDropdown.tsx | 2 +- .../components/specs/FiltersFromProperties.spec.js | 4 ++-- app/react/Map/specs/LMap.spec.tsx | 4 ++-- app/react/Markdown/components/MarkdownLink.js | 2 +- app/react/Markdown/components/PayPalDonateLink.js | 2 +- app/react/Markdown/components/SearchBox.js | 2 +- app/react/Markdown/components/index.js | 2 +- .../Markdown/components/specs/MarkdownLink.spec.js | 4 ++-- .../components/specs/PayPalDonateLink.spec.js | 4 ++-- .../Markdown/components/specs/SearchBox.spec.js | 4 ++-- app/react/ProtectedRoute.tsx | 2 +- app/react/Routes.tsx | 2 +- app/react/Settings/Settings.js | 2 +- app/react/Settings/components/EntityTypesList.js | 2 +- .../components/specs/EntityTypesList.spec.js | 4 ++-- .../components/specs/MetadataTemplate.spec.js | 4 +--- app/react/V2/Components/Analitycs/Matomo.tsx | 2 +- .../V2/Components/Analitycs/specs/Matomo.spec.tsx | 2 +- .../V2/Components/ErrorHandling/GeneralError.tsx | 2 +- .../Components/ErrorHandling/RouteErrorBoundary.tsx | 2 +- .../ErrorHandling/specs/GeneralError.spec.tsx | 4 ++-- .../ErrorHandling/specs/RouteErrorBoundary.spec.tsx | 4 ++-- .../Components/Layouts/specs/SettingsContent.cy.tsx | 2 +- app/react/V2/Components/UI/Paginator.tsx | 2 +- app/react/V2/Components/UI/Sidepanel.tsx | 2 +- app/react/V2/Routes/Settings/Account/Account.tsx | 2 +- .../Settings/Account/Components/TwoFactorSetup.tsx | 2 +- .../V2/Routes/Settings/ActivityLog/ActivityLog.tsx | 2 +- .../Routes/Settings/ActivityLog/ActivityLogLoader.ts | 2 +- .../V2/Routes/Settings/Collection/Collection.tsx | 2 +- .../Routes/Settings/CustomUploads/CustomUploads.tsx | 2 +- .../CustomUploads/components/DropzoneModal.tsx | 2 +- .../CustomUploads/components/EditFileSidepanel.tsx | 2 +- .../Routes/Settings/Customization/Customization.tsx | 2 +- app/react/V2/Routes/Settings/Dashboard/Dashboard.tsx | 2 +- .../V2/Routes/Settings/Filters/FiltersTable.tsx | 2 +- .../Settings/Filters/components/FiltersSidepanel.tsx | 2 +- app/react/V2/Routes/Settings/IX/IXDashboard.tsx | 2 +- app/react/V2/Routes/Settings/IX/IXSuggestions.tsx | 2 +- .../Settings/IX/components/FiltersSidepanel.tsx | 2 +- .../Routes/Settings/IX/components/SuggestedValue.tsx | 2 +- .../Routes/Settings/IX/components/TableElements.tsx | 2 +- .../V2/Routes/Settings/Languages/LanguagesList.tsx | 2 +- .../V2/Routes/Settings/MenuConfig/MenuConfig.tsx | 2 +- app/react/V2/Routes/Settings/Pages/PageEditor.tsx | 2 +- app/react/V2/Routes/Settings/Pages/PagesList.tsx | 2 +- .../Pages/components/PageEditorComponents.tsx | 2 +- .../Settings/Pages/components/PageListTable.tsx | 2 +- .../Settings/ParagraphExtraction/PXEntities.tsx | 2 +- .../Settings/ParagraphExtraction/PXParagraphs.tsx | 2 +- .../ParagraphExtraction/ParagraphExtraction.tsx | 2 +- .../components/ExtractorModal.tsx | 2 +- .../components/PXEntityTableElements.tsx | 2 +- .../components/PXTableElements.tsx | 2 +- .../ParagraphExtraction/components/ViewParagraph.tsx | 2 +- .../Settings/RelationshipTypes/RelationshipTypes.tsx | 2 +- .../V2/Routes/Settings/Thesauri/EditThesaurus.tsx | 2 +- .../V2/Routes/Settings/Thesauri/ThesauriList.tsx | 2 +- .../V2/Routes/Settings/Thesauri/ThesaurusForm.tsx | 2 +- .../Settings/Thesauri/components/ThesauriTable.tsx | 2 +- .../Thesauri/components/ThesaurusActions.tsx | 2 +- app/react/V2/Routes/Settings/Thesauri/helpers.ts | 2 +- .../Routes/Settings/Thesauri/specs/Thesauri.spec.tsx | 2 +- .../Settings/Translations/EditTranslations.tsx | 2 +- .../Settings/Translations/TranslationsList.tsx | 2 +- .../Translations/components/TableComponents.tsx | 2 +- app/react/V2/Routes/Settings/Users/Users.tsx | 2 +- .../Settings/Users/components/GroupFormSidepanel.tsx | 2 +- .../Settings/Users/components/UserFormSidepanel.tsx | 2 +- .../Routes/Settings/Users/useHandleNotifications.tsx | 2 +- app/react/V2/api/translations/index.ts | 2 +- app/react/Viewer/components/Paginator.js | 2 +- app/react/Viewer/components/specs/Paginator.spec.js | 4 ++-- app/react/Viewer/specs/PDFView.spec.js | 4 ++-- app/react/componentWrappers.tsx | 2 +- app/react/entry-client.tsx | 2 +- app/react/entry-server.tsx | 12 ++++++++---- app/react/getIndexElement.tsx | 2 +- app/react/stories/Paginator.stories.tsx | 2 +- app/react/utils/api.js | 2 +- app/react/utils/routeHelpers.ts | 2 +- app/react/utils/specs/api.spec.js | 4 ++-- 98 files changed, 120 insertions(+), 118 deletions(-) diff --git a/app/react/App/App.js b/app/react/App/App.js index 05d22199c6..39e706e3f0 100644 --- a/app/react/App/App.js +++ b/app/react/App/App.js @@ -1,7 +1,7 @@ /* eslint-disable import/no-named-as-default */ import React, { useState, useMemo } from 'react'; import PropTypes from 'prop-types'; -import { Outlet, useLocation, useParams } from 'react-router-dom'; +import { Outlet, useLocation, useParams } from 'react-router'; import { useAtom } from 'jotai'; import Notifications from 'app/Notifications'; import Cookiepopup from 'app/App/Cookiepopup'; diff --git a/app/react/App/Menu.tsx b/app/react/App/Menu.tsx index a4abf9cbd6..1efa8b303f 100644 --- a/app/react/App/Menu.tsx +++ b/app/react/App/Menu.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useLocation } from 'react-router-dom'; +import { useLocation } from 'react-router'; import { bindActionCreators, Dispatch } from 'redux'; import { connect, ConnectedProps } from 'react-redux'; import { fromJS } from 'immutable'; diff --git a/app/react/App/specs/Menu.spec.js b/app/react/App/specs/Menu.spec.js index 4484bc637e..d2ee88c072 100644 --- a/app/react/App/specs/Menu.spec.js +++ b/app/react/App/specs/Menu.spec.js @@ -3,8 +3,8 @@ import { I18NLink } from 'app/I18N'; import { renderConnected } from 'app/utils/test/renderConnected'; import { Menu } from '../Menu'; -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useLocation: () => ({ search: '?q=(searchTerm:%27asd%27)', }), diff --git a/app/react/Attachments/components/ViewDocumentLink.tsx b/app/react/Attachments/components/ViewDocumentLink.tsx index 8d591f52ea..c0cdfa0af5 100644 --- a/app/react/Attachments/components/ViewDocumentLink.tsx +++ b/app/react/Attachments/components/ViewDocumentLink.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Link, useLocation } from 'react-router-dom'; +import { Link, useLocation } from 'react-router'; import { CurrentLocationLink } from 'app/Layout'; import { EntitySchema } from 'shared/types/entityType'; diff --git a/app/react/Attachments/components/specs/ViewDocumentLink.spec.tsx b/app/react/Attachments/components/specs/ViewDocumentLink.spec.tsx index b2fdfdd276..ead034137d 100644 --- a/app/react/Attachments/components/specs/ViewDocumentLink.spec.tsx +++ b/app/react/Attachments/components/specs/ViewDocumentLink.spec.tsx @@ -1,4 +1,4 @@ -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import React from 'react'; import { shallow } from 'enzyme'; @@ -13,8 +13,8 @@ const mockUseLocation = jest.fn().mockImplementation(() => ({ pathname: `?page=${pathname}`, })); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useLocation: () => mockUseLocation(), })); const renderComponent = (entity: EntitySchema) => { diff --git a/app/react/Forms/components/MultiSelect.tsx b/app/react/Forms/components/MultiSelect.tsx index e437a6cd93..fa48a910e9 100644 --- a/app/react/Forms/components/MultiSelect.tsx +++ b/app/react/Forms/components/MultiSelect.tsx @@ -1,7 +1,7 @@ /* eslint-disable max-classes-per-file */ /* eslint-disable class-methods-use-this,max-lines */ -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import ShowIf from 'app/App/ShowIf'; import { filterOptions } from 'shared/optionsUtils'; import { t, Translate } from 'app/I18N'; diff --git a/app/react/I18N/components/I18NLink.tsx b/app/react/I18N/components/I18NLink.tsx index 338747c73c..5841be31dc 100644 --- a/app/react/I18N/components/I18NLink.tsx +++ b/app/react/I18N/components/I18NLink.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; import { connect } from 'react-redux'; -import { useNavigate, NavLink, useLocation } from 'react-router-dom'; +import { useNavigate, NavLink, useLocation } from 'react-router'; import { omit } from 'lodash'; const defaultProps = { diff --git a/app/react/I18N/components/I18NMenu.tsx b/app/react/I18N/components/I18NMenu.tsx index 0e74a6e592..62ba9e50ac 100644 --- a/app/react/I18N/components/I18NMenu.tsx +++ b/app/react/I18N/components/I18NMenu.tsx @@ -9,7 +9,7 @@ import { actions, Translate, t } from 'app/I18N'; import { IStore } from 'app/istore'; import { NeedAuthorization } from 'app/Auth'; import { useOnClickOutsideElement } from 'app/utils/useOnClickOutsideElementHook'; -import { Location, useLocation } from 'react-router-dom'; +import { Location, useLocation } from 'react-router'; const locationSearch = (location: Location) => { const cleanSearch = location.search.split(/page=\d+|&page=\d+/).join(''); diff --git a/app/react/I18N/components/specs/I18NLink.spec.js b/app/react/I18N/components/specs/I18NLink.spec.js index 7f27c27261..6507c3b318 100644 --- a/app/react/I18N/components/specs/I18NLink.spec.js +++ b/app/react/I18N/components/specs/I18NLink.spec.js @@ -4,8 +4,8 @@ /* eslint-disable max-statements */ import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; +import { MemoryRouter, Route, Routes } from 'react-router'; import { I18NLink } from '../I18NLink'; -import { MemoryRouter, Route, Routes } from 'react-router-dom'; describe('I18NLink', () => { let props; diff --git a/app/react/I18N/components/specs/I18NMenu.spec.tsx b/app/react/I18N/components/specs/I18NMenu.spec.tsx index f8cbb92073..2b214113b1 100644 --- a/app/react/I18N/components/specs/I18NMenu.spec.tsx +++ b/app/react/I18N/components/specs/I18NMenu.spec.tsx @@ -5,7 +5,7 @@ import React from 'react'; import { act, fireEvent, RenderResult, screen } from '@testing-library/react'; import { Provider } from 'react-redux'; import { MockStoreEnhanced } from 'redux-mock-store'; -import { Location, MemoryRouter } from 'react-router-dom'; +import { Location, MemoryRouter } from 'react-router'; import Immutable from 'immutable'; import { defaultState, renderConnectedContainer } from 'app/utils/test/renderConnected'; import { i18NMenuComponent as I18NMenu } from '../I18NMenu'; diff --git a/app/react/Layout/CurrentLocationLink.js b/app/react/Layout/CurrentLocationLink.js index c79893e946..d2d4dd0069 100644 --- a/app/react/Layout/CurrentLocationLink.js +++ b/app/react/Layout/CurrentLocationLink.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { Link, useLocation } from 'react-router-dom'; +import { Link, useLocation } from 'react-router'; const validProps = props => { const { to, ...valid } = props; diff --git a/app/react/Layout/DocumentsList.js b/app/react/Layout/DocumentsList.js index 80347d1b24..7301476c9e 100644 --- a/app/react/Layout/DocumentsList.js +++ b/app/react/Layout/DocumentsList.js @@ -1,7 +1,7 @@ /* eslint-disable max-lines */ import PropTypes from 'prop-types'; import React, { Component } from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { toUrlParams } from 'shared/JSONRequest'; import rison from 'rison-node'; import { SearchBar } from 'app/Library/components/SearchBar'; diff --git a/app/react/Layout/specs/CurrentLocationLink.spec.js b/app/react/Layout/specs/CurrentLocationLink.spec.js index 24a7179137..b7faf931b3 100644 --- a/app/react/Layout/specs/CurrentLocationLink.spec.js +++ b/app/react/Layout/specs/CurrentLocationLink.spec.js @@ -2,8 +2,8 @@ import React from 'react'; import { shallow } from 'enzyme'; import { CurrentLocationLink } from '../CurrentLocationLink'; -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useLocation: () => ({ pathname: 'pathanem', search: 'param=value¶m2=value2' }), })); diff --git a/app/react/Library/components/DocumentTypesList.js b/app/react/Library/components/DocumentTypesList.js index 97dead0228..bb5a62e167 100644 --- a/app/react/Library/components/DocumentTypesList.js +++ b/app/react/Library/components/DocumentTypesList.js @@ -3,7 +3,7 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import Immutable, { is } from 'immutable'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import rison from 'rison-node'; import ShowIf from 'app/App/ShowIf'; import { withRouter } from 'app/componentWrappers'; diff --git a/app/react/Library/components/FiltersFromProperties.js b/app/react/Library/components/FiltersFromProperties.js index a882070574..6cc8f86a5a 100644 --- a/app/react/Library/components/FiltersFromProperties.js +++ b/app/react/Library/components/FiltersFromProperties.js @@ -1,6 +1,6 @@ import React from 'react'; import { connect } from 'react-redux'; -import { useLocation } from 'react-router-dom'; +import { useLocation } from 'react-router'; import rison from 'rison-node'; import Immutable from 'immutable'; import PropTypes from 'prop-types'; diff --git a/app/react/Library/components/SearchBar.tsx b/app/react/Library/components/SearchBar.tsx index a5b2fa4434..e8155c0000 100644 --- a/app/react/Library/components/SearchBar.tsx +++ b/app/react/Library/components/SearchBar.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import { bindActionCreators, Dispatch } from 'redux'; import { actions as formActions } from 'react-redux-form'; import { connect, ConnectedProps } from 'react-redux'; -import { useLocation, useNavigate } from 'react-router-dom'; +import { useLocation, useNavigate } from 'react-router'; import { Icon } from 'UI'; import { diff --git a/app/react/Library/components/SortDropdown.tsx b/app/react/Library/components/SortDropdown.tsx index 59f43f5df3..977bb4c686 100644 --- a/app/react/Library/components/SortDropdown.tsx +++ b/app/react/Library/components/SortDropdown.tsx @@ -3,7 +3,7 @@ import { bindActionCreators, Dispatch } from 'redux'; import { connect, ConnectedProps } from 'react-redux'; import { actions } from 'react-redux-form'; import { risonDecodeOrIgnore } from 'app/utils'; -import { useLocation, useSearchParams } from 'react-router-dom'; +import { useLocation, useSearchParams } from 'react-router'; import { Icon } from 'UI'; import { I18NLink, t } from 'app/I18N'; import { wrapDispatch } from 'app/Multireducer'; diff --git a/app/react/Library/components/specs/FiltersFromProperties.spec.js b/app/react/Library/components/specs/FiltersFromProperties.spec.js index e67b805e0d..12356b4c7e 100644 --- a/app/react/Library/components/specs/FiltersFromProperties.spec.js +++ b/app/react/Library/components/specs/FiltersFromProperties.spec.js @@ -12,8 +12,8 @@ import SelectFilter from '../SelectFilter'; import TextFilter from '../TextFilter'; import { defaultProperties } from './fixtures/FiltersFromPropertiesFixtures'; -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useLocation: () => jest.fn(), })); jest.mock('app/I18N', () => ({ diff --git a/app/react/Map/specs/LMap.spec.tsx b/app/react/Map/specs/LMap.spec.tsx index ee2a055cce..4104fd57db 100644 --- a/app/react/Map/specs/LMap.spec.tsx +++ b/app/react/Map/specs/LMap.spec.tsx @@ -12,8 +12,8 @@ jest.mock('app/Map/GoogleMapLayer', () => ({ getGoogleLayer: jest.fn(), })); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useRouteError: () => () => undefined, })); diff --git a/app/react/Markdown/components/MarkdownLink.js b/app/react/Markdown/components/MarkdownLink.js index 1e5518b976..db5077cfda 100644 --- a/app/react/Markdown/components/MarkdownLink.js +++ b/app/react/Markdown/components/MarkdownLink.js @@ -1,4 +1,4 @@ -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { isClient } from 'app/utils'; import PropTypes from 'prop-types'; import React from 'react'; diff --git a/app/react/Markdown/components/PayPalDonateLink.js b/app/react/Markdown/components/PayPalDonateLink.js index 02a730bd7f..2d17679266 100644 --- a/app/react/Markdown/components/PayPalDonateLink.js +++ b/app/react/Markdown/components/PayPalDonateLink.js @@ -1,4 +1,4 @@ -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import PropTypes from 'prop-types'; import React from 'react'; diff --git a/app/react/Markdown/components/SearchBox.js b/app/react/Markdown/components/SearchBox.js index 046658a37e..4bf5ea0942 100644 --- a/app/react/Markdown/components/SearchBox.js +++ b/app/react/Markdown/components/SearchBox.js @@ -1,5 +1,5 @@ import { Form, Field } from 'react-redux-form'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import React from 'react'; import PropTypes from 'prop-types'; import rison from 'rison-node'; diff --git a/app/react/Markdown/components/index.js b/app/react/Markdown/components/index.js index f6d1eb5466..a434d35a37 100644 --- a/app/react/Markdown/components/index.js +++ b/app/react/Markdown/components/index.js @@ -1,6 +1,6 @@ import loadable from '@loadable/component'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { Icon } from 'UI'; import Counter from './Counter'; import ContactForm from './ContactForm'; diff --git a/app/react/Markdown/components/specs/MarkdownLink.spec.js b/app/react/Markdown/components/specs/MarkdownLink.spec.js index db0ac42da4..da5a28b495 100644 --- a/app/react/Markdown/components/specs/MarkdownLink.spec.js +++ b/app/react/Markdown/components/specs/MarkdownLink.spec.js @@ -2,8 +2,8 @@ import React from 'react'; import { shallow } from 'enzyme'; import MarkdownLink from '../MarkdownLink.js'; -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), // eslint-disable-next-line jsx-a11y/anchor-has-content, react/prop-types Link: props => , })); diff --git a/app/react/Markdown/components/specs/PayPalDonateLink.spec.js b/app/react/Markdown/components/specs/PayPalDonateLink.spec.js index e872cf3c32..bd75f78ccb 100644 --- a/app/react/Markdown/components/specs/PayPalDonateLink.spec.js +++ b/app/react/Markdown/components/specs/PayPalDonateLink.spec.js @@ -2,8 +2,8 @@ import React from 'react'; import { shallow } from 'enzyme'; import PayPalDonateLink from '../PayPalDonateLink.js'; -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), // eslint-disable-next-line jsx-a11y/anchor-has-content, react/prop-types Link: props => , })); diff --git a/app/react/Markdown/components/specs/SearchBox.spec.js b/app/react/Markdown/components/specs/SearchBox.spec.js index 4d5fc8a7af..77284d7b11 100644 --- a/app/react/Markdown/components/specs/SearchBox.spec.js +++ b/app/react/Markdown/components/specs/SearchBox.spec.js @@ -8,8 +8,8 @@ import SearchBox from '../SearchBox'; const mockUseNavigate = jest.fn(); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useNavigate: () => mockUseNavigate, })); diff --git a/app/react/ProtectedRoute.tsx b/app/react/ProtectedRoute.tsx index b313c3d0b9..6b9267c0f2 100644 --- a/app/react/ProtectedRoute.tsx +++ b/app/react/ProtectedRoute.tsx @@ -1,5 +1,5 @@ import React, { ReactElement } from 'react'; -import { Navigate, Outlet } from 'react-router-dom'; +import { Navigate, Outlet } from 'react-router'; import { store } from 'app/store'; import { ClientSettings } from 'app/apiResponseTypes'; diff --git a/app/react/Routes.tsx b/app/react/Routes.tsx index fa26bd2bdc..8240e25f09 100644 --- a/app/react/Routes.tsx +++ b/app/react/Routes.tsx @@ -1,6 +1,6 @@ /* eslint-disable max-lines */ import React from 'react'; -import { createRoutesFromElements, Route } from 'react-router-dom'; +import { createRoutesFromElements, Route } from 'react-router'; import { IncomingHttpHeaders } from 'http'; import { App } from 'app/App/App'; import { LibraryCards } from 'app/Library/Library'; diff --git a/app/react/Settings/Settings.js b/app/react/Settings/Settings.js index bd63f1fb2a..a949448cc9 100644 --- a/app/react/Settings/Settings.js +++ b/app/react/Settings/Settings.js @@ -1,6 +1,6 @@ import React from 'react'; import { Helmet } from 'react-helmet'; -import { Outlet } from 'react-router-dom'; +import { Outlet } from 'react-router'; import { withOutlet, withRouter } from 'app/componentWrappers'; import RouteHandler from 'app/App/RouteHandler'; import { actions } from 'app/BasicReducer'; diff --git a/app/react/Settings/components/EntityTypesList.js b/app/react/Settings/components/EntityTypesList.js index a2f22ab80f..5ee215c7f0 100644 --- a/app/react/Settings/components/EntityTypesList.js +++ b/app/react/Settings/components/EntityTypesList.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { withContext } from 'app/componentWrappers'; import { deleteTemplate, diff --git a/app/react/Settings/components/specs/EntityTypesList.spec.js b/app/react/Settings/components/specs/EntityTypesList.spec.js index 6bf69ece91..d00516c397 100644 --- a/app/react/Settings/components/specs/EntityTypesList.spec.js +++ b/app/react/Settings/components/specs/EntityTypesList.spec.js @@ -3,8 +3,8 @@ import { shallow } from 'enzyme'; import Immutable from 'immutable'; import { EntityTypesList } from '../EntityTypesList'; -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), // eslint-disable-next-line jsx-a11y/anchor-has-content, react/prop-types Link: props => , })); diff --git a/app/react/Templates/components/specs/MetadataTemplate.spec.js b/app/react/Templates/components/specs/MetadataTemplate.spec.js index 7a09fcd319..9ce6e6fcb4 100644 --- a/app/react/Templates/components/specs/MetadataTemplate.spec.js +++ b/app/react/Templates/components/specs/MetadataTemplate.spec.js @@ -2,6 +2,7 @@ * @jest-environment jsdom */ import React, { Component } from 'react'; +import { BrowserRouter } from 'react-router'; import { DragDropContext } from 'react-dnd-old'; import { Provider } from 'react-redux'; import { modelReducer, formReducer, Field, Control } from 'react-redux-form'; @@ -11,10 +12,8 @@ import Immutable from 'immutable'; import thunk from 'redux-thunk'; import { shallow } from 'enzyme'; import { TestBackend } from 'react-dnd-test-backend'; - import entitiesApi from 'app/Entities/EntitiesAPI'; import pagesApi from 'app/Pages/PagesAPI'; - import { MetadataTemplate, dropTarget, @@ -22,7 +21,6 @@ import { } from 'app/Templates/components/MetadataTemplate'; import MetadataProperty from 'app/Templates/components/MetadataProperty'; import { dragSource } from 'app/Templates/components/PropertyOption'; -import { BrowserRouter } from 'react-router-dom'; import * as templateActions from '../../actions/templateActions'; function sourceTargetTestContext(Target, Source, actions) { diff --git a/app/react/V2/Components/Analitycs/Matomo.tsx b/app/react/V2/Components/Analitycs/Matomo.tsx index 48cd3a9689..8d755133eb 100644 --- a/app/react/V2/Components/Analitycs/Matomo.tsx +++ b/app/react/V2/Components/Analitycs/Matomo.tsx @@ -1,7 +1,7 @@ /* eslint-disable max-statements */ import { useEffect, useRef } from 'react'; import { useAtomValue } from 'jotai'; -import { useLocation } from 'react-router-dom'; +import { useLocation } from 'react-router'; import { globalMatomoAtom, settingsAtom } from 'V2/atoms'; import { isClient } from 'app/utils'; diff --git a/app/react/V2/Components/Analitycs/specs/Matomo.spec.tsx b/app/react/V2/Components/Analitycs/specs/Matomo.spec.tsx index ff77abe57b..1abfe2de45 100644 --- a/app/react/V2/Components/Analitycs/specs/Matomo.spec.tsx +++ b/app/react/V2/Components/Analitycs/specs/Matomo.spec.tsx @@ -4,7 +4,7 @@ import React from 'react'; import { render } from '@testing-library/react'; -import { MemoryRouter } from 'react-router-dom'; +import { MemoryRouter } from 'react-router'; import { globalMatomoAtom, settingsAtom } from 'V2/atoms'; import { TestAtomStoreProvider } from 'V2/testing'; import { Matomo } from '../Matomo'; diff --git a/app/react/V2/Components/ErrorHandling/GeneralError.tsx b/app/react/V2/Components/ErrorHandling/GeneralError.tsx index 28009af0f8..0a7d605395 100644 --- a/app/react/V2/Components/ErrorHandling/GeneralError.tsx +++ b/app/react/V2/Components/ErrorHandling/GeneralError.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { Helmet } from 'react-helmet'; -import { useParams, useSearchParams } from 'react-router-dom'; +import { useParams, useSearchParams } from 'react-router'; import { has } from 'lodash'; import Footer from 'app/App/Footer'; import { searchParamsFromSearchParams } from 'app/utils/routeHelpers'; diff --git a/app/react/V2/Components/ErrorHandling/RouteErrorBoundary.tsx b/app/react/V2/Components/ErrorHandling/RouteErrorBoundary.tsx index c7b25677a2..ee4165fc1f 100644 --- a/app/react/V2/Components/ErrorHandling/RouteErrorBoundary.tsx +++ b/app/react/V2/Components/ErrorHandling/RouteErrorBoundary.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useRouteError } from 'react-router-dom'; +import { useRouteError } from 'react-router'; import { ErrorFallback } from './ErrorFallback'; interface ErrorBoundaryProps { diff --git a/app/react/V2/Components/ErrorHandling/specs/GeneralError.spec.tsx b/app/react/V2/Components/ErrorHandling/specs/GeneralError.spec.tsx index 7729981fcf..1df90ee549 100644 --- a/app/react/V2/Components/ErrorHandling/specs/GeneralError.spec.tsx +++ b/app/react/V2/Components/ErrorHandling/specs/GeneralError.spec.tsx @@ -22,8 +22,8 @@ const mockUseParams = jest.fn().mockImplementation(() => ({ errorCode, })); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useLocation: () => ({ search: '?q=(requestId:%271234%27)', }), diff --git a/app/react/V2/Components/ErrorHandling/specs/RouteErrorBoundary.spec.tsx b/app/react/V2/Components/ErrorHandling/specs/RouteErrorBoundary.spec.tsx index 045d622746..e724b806ac 100644 --- a/app/react/V2/Components/ErrorHandling/specs/RouteErrorBoundary.spec.tsx +++ b/app/react/V2/Components/ErrorHandling/specs/RouteErrorBoundary.spec.tsx @@ -10,8 +10,8 @@ let error: any = null; const mockUseRouteError = jest.fn().mockImplementation(() => error); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useRouteError: () => mockUseRouteError(), })); diff --git a/app/react/V2/Components/Layouts/specs/SettingsContent.cy.tsx b/app/react/V2/Components/Layouts/specs/SettingsContent.cy.tsx index 40f4b33491..b33784c763 100644 --- a/app/react/V2/Components/Layouts/specs/SettingsContent.cy.tsx +++ b/app/react/V2/Components/Layouts/specs/SettingsContent.cy.tsx @@ -1,6 +1,6 @@ import React from 'react'; import 'cypress-axe'; -import { BrowserRouter } from 'react-router-dom'; +import { BrowserRouter } from 'react-router'; import { Provider } from 'react-redux'; import { mount } from '@cypress/react18'; import { LEGACY_createStore as createStore } from 'V2/testing'; diff --git a/app/react/V2/Components/UI/Paginator.tsx b/app/react/V2/Components/UI/Paginator.tsx index fc988cd970..490ca191d3 100644 --- a/app/react/V2/Components/UI/Paginator.tsx +++ b/app/react/V2/Components/UI/Paginator.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { ChevronLeftIcon, ChevronRightIcon } from '@heroicons/react/20/solid'; import { Translate } from 'app/I18N'; diff --git a/app/react/V2/Components/UI/Sidepanel.tsx b/app/react/V2/Components/UI/Sidepanel.tsx index 8c997388d8..70e6bee133 100644 --- a/app/react/V2/Components/UI/Sidepanel.tsx +++ b/app/react/V2/Components/UI/Sidepanel.tsx @@ -1,7 +1,7 @@ /* eslint-disable react/no-multi-comp */ import React from 'react'; import { Transition } from '@headlessui/react'; -import { useParams } from 'react-router-dom'; +import { useParams } from 'react-router'; import { XMarkIcon } from '@heroicons/react/20/solid'; import { availableLanguages } from 'shared/language'; import { Translate } from 'app/I18N'; diff --git a/app/react/V2/Routes/Settings/Account/Account.tsx b/app/react/V2/Routes/Settings/Account/Account.tsx index f036e0d266..7b93bead71 100644 --- a/app/react/V2/Routes/Settings/Account/Account.tsx +++ b/app/react/V2/Routes/Settings/Account/Account.tsx @@ -2,7 +2,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React, { useRef, useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router-dom'; +import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router'; import { useForm } from 'react-hook-form'; import { useSetAtom } from 'jotai'; import { ClientUserSchema } from 'app/apiResponseTypes'; diff --git a/app/react/V2/Routes/Settings/Account/Components/TwoFactorSetup.tsx b/app/react/V2/Routes/Settings/Account/Components/TwoFactorSetup.tsx index f4243421fb..18135674d4 100644 --- a/app/react/V2/Routes/Settings/Account/Components/TwoFactorSetup.tsx +++ b/app/react/V2/Routes/Settings/Account/Components/TwoFactorSetup.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; import api from 'app/utils/api'; -import { useRevalidator } from 'react-router-dom'; +import { useRevalidator } from 'react-router'; import { useSetAtom } from 'jotai'; import { RequestParams } from 'app/utils/RequestParams'; diff --git a/app/react/V2/Routes/Settings/ActivityLog/ActivityLog.tsx b/app/react/V2/Routes/Settings/ActivityLog/ActivityLog.tsx index e8c5f43174..9b3e1bbaa7 100644 --- a/app/react/V2/Routes/Settings/ActivityLog/ActivityLog.tsx +++ b/app/react/V2/Routes/Settings/ActivityLog/ActivityLog.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/jsx-props-no-spreading */ import React, { useEffect, useState } from 'react'; -import { useLoaderData, useLocation, useSearchParams } from 'react-router-dom'; +import { useLoaderData, useLocation, useSearchParams } from 'react-router'; import { Row, SortingState } from '@tanstack/react-table'; import { FunnelIcon } from '@heroicons/react/24/outline'; import { useAtomValue } from 'jotai'; diff --git a/app/react/V2/Routes/Settings/ActivityLog/ActivityLogLoader.ts b/app/react/V2/Routes/Settings/ActivityLog/ActivityLogLoader.ts index 160fd9af6f..8738a1d04c 100644 --- a/app/react/V2/Routes/Settings/ActivityLog/ActivityLogLoader.ts +++ b/app/react/V2/Routes/Settings/ActivityLog/ActivityLogLoader.ts @@ -1,5 +1,5 @@ /* eslint-disable react/jsx-props-no-spreading */ -import { LoaderFunction, SetURLSearchParams, createSearchParams, Location } from 'react-router-dom'; +import { LoaderFunction, SetURLSearchParams, createSearchParams, Location } from 'react-router'; import { IncomingHttpHeaders } from 'http'; import _, { isArray, isEqual, isObject } from 'lodash'; import moment from 'moment'; diff --git a/app/react/V2/Routes/Settings/Collection/Collection.tsx b/app/react/V2/Routes/Settings/Collection/Collection.tsx index 059b3f4559..112309876e 100644 --- a/app/react/V2/Routes/Settings/Collection/Collection.tsx +++ b/app/react/V2/Routes/Settings/Collection/Collection.tsx @@ -4,7 +4,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router-dom'; +import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router'; import { useForm } from 'react-hook-form'; import { useSetAtom } from 'jotai'; import { isUndefined } from 'lodash'; diff --git a/app/react/V2/Routes/Settings/CustomUploads/CustomUploads.tsx b/app/react/V2/Routes/Settings/CustomUploads/CustomUploads.tsx index 51382e40c3..ad78aead3e 100644 --- a/app/react/V2/Routes/Settings/CustomUploads/CustomUploads.tsx +++ b/app/react/V2/Routes/Settings/CustomUploads/CustomUploads.tsx @@ -2,7 +2,7 @@ /* eslint-disable no-spaced-func */ /* eslint-disable max-statements */ import React, { useEffect, useState } from 'react'; -import { LoaderFunction, useBlocker, useLoaderData, useRevalidator } from 'react-router-dom'; +import { LoaderFunction, useBlocker, useLoaderData, useRevalidator } from 'react-router'; import { IncomingHttpHeaders } from 'http'; import { useSetAtom } from 'jotai'; import { Translate } from 'app/I18N'; diff --git a/app/react/V2/Routes/Settings/CustomUploads/components/DropzoneModal.tsx b/app/react/V2/Routes/Settings/CustomUploads/components/DropzoneModal.tsx index 258665d1f2..f92f2ea73e 100644 --- a/app/react/V2/Routes/Settings/CustomUploads/components/DropzoneModal.tsx +++ b/app/react/V2/Routes/Settings/CustomUploads/components/DropzoneModal.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { useRevalidator } from 'react-router-dom'; +import { useRevalidator } from 'react-router'; import { useSetAtom } from 'jotai'; import { FetchResponseError } from 'shared/JSONRequest'; import { Translate } from 'app/I18N'; diff --git a/app/react/V2/Routes/Settings/CustomUploads/components/EditFileSidepanel.tsx b/app/react/V2/Routes/Settings/CustomUploads/components/EditFileSidepanel.tsx index 261ee75166..bfc19b2678 100644 --- a/app/react/V2/Routes/Settings/CustomUploads/components/EditFileSidepanel.tsx +++ b/app/react/V2/Routes/Settings/CustomUploads/components/EditFileSidepanel.tsx @@ -1,7 +1,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React from 'react'; import { useForm } from 'react-hook-form'; -import { useRevalidator } from 'react-router-dom'; +import { useRevalidator } from 'react-router'; import { useSetAtom } from 'jotai'; import { FileType } from 'shared/types/fileType'; import { Translate } from 'app/I18N'; diff --git a/app/react/V2/Routes/Settings/Customization/Customization.tsx b/app/react/V2/Routes/Settings/Customization/Customization.tsx index 7d816ca927..2b17e49424 100644 --- a/app/react/V2/Routes/Settings/Customization/Customization.tsx +++ b/app/react/V2/Routes/Settings/Customization/Customization.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { LoaderFunction, useBlocker, useLoaderData } from 'react-router-dom'; +import { LoaderFunction, useBlocker, useLoaderData } from 'react-router'; import { IncomingHttpHeaders } from 'http'; import { useSetAtom } from 'jotai'; import { FetchResponseError } from 'shared/JSONRequest'; diff --git a/app/react/V2/Routes/Settings/Dashboard/Dashboard.tsx b/app/react/V2/Routes/Settings/Dashboard/Dashboard.tsx index 3115dd7f92..a150db2c52 100644 --- a/app/react/V2/Routes/Settings/Dashboard/Dashboard.tsx +++ b/app/react/V2/Routes/Settings/Dashboard/Dashboard.tsx @@ -2,7 +2,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData } from 'react-router-dom'; +import { LoaderFunction, useLoaderData } from 'react-router'; import { Translate } from 'app/I18N'; import { SettingsContent } from 'app/V2/Components/Layouts/SettingsContent'; diff --git a/app/react/V2/Routes/Settings/Filters/FiltersTable.tsx b/app/react/V2/Routes/Settings/Filters/FiltersTable.tsx index 59d55131ca..fdb75c9eb2 100644 --- a/app/react/V2/Routes/Settings/Filters/FiltersTable.tsx +++ b/app/react/V2/Routes/Settings/Filters/FiltersTable.tsx @@ -1,6 +1,6 @@ /* eslint-disable max-statements */ import React, { useEffect, useMemo, useRef, useState } from 'react'; -import { LoaderFunction, useBlocker, useLoaderData, useRevalidator } from 'react-router-dom'; +import { LoaderFunction, useBlocker, useLoaderData, useRevalidator } from 'react-router'; import { useSetAtom } from 'jotai'; import { IncomingHttpHeaders } from 'http'; import { RowSelectionState } from '@tanstack/react-table'; diff --git a/app/react/V2/Routes/Settings/Filters/components/FiltersSidepanel.tsx b/app/react/V2/Routes/Settings/Filters/components/FiltersSidepanel.tsx index 3421cd5aef..f6a6f4339d 100644 --- a/app/react/V2/Routes/Settings/Filters/components/FiltersSidepanel.tsx +++ b/app/react/V2/Routes/Settings/Filters/components/FiltersSidepanel.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { useForm, Controller } from 'react-hook-form'; import { useAtomValue } from 'jotai'; -import { useLoaderData } from 'react-router-dom'; +import { useLoaderData } from 'react-router'; import uniqueID from 'shared/uniqueID'; import { Translate } from 'app/I18N'; import { ClientTemplateSchema } from 'app/istore'; diff --git a/app/react/V2/Routes/Settings/IX/IXDashboard.tsx b/app/react/V2/Routes/Settings/IX/IXDashboard.tsx index 214dce49ae..d8a49eebc4 100644 --- a/app/react/V2/Routes/Settings/IX/IXDashboard.tsx +++ b/app/react/V2/Routes/Settings/IX/IXDashboard.tsx @@ -1,7 +1,7 @@ /* eslint-disable max-statements */ import React, { useMemo, useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router-dom'; +import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router'; import { useSetAtom } from 'jotai'; import * as extractorsAPI from 'app/V2/api/ix/extractors'; import * as templatesAPI from 'V2/api/templates'; diff --git a/app/react/V2/Routes/Settings/IX/IXSuggestions.tsx b/app/react/V2/Routes/Settings/IX/IXSuggestions.tsx index e71a3c7ec6..8b3acd3c44 100644 --- a/app/react/V2/Routes/Settings/IX/IXSuggestions.tsx +++ b/app/react/V2/Routes/Settings/IX/IXSuggestions.tsx @@ -9,7 +9,7 @@ import { useNavigate, useRevalidator, useSearchParams, -} from 'react-router-dom'; +} from 'react-router'; import { SortingState } from '@tanstack/react-table'; import { useSetAtom } from 'jotai'; import * as extractorsAPI from 'app/V2/api/ix/extractors'; diff --git a/app/react/V2/Routes/Settings/IX/components/FiltersSidepanel.tsx b/app/react/V2/Routes/Settings/IX/components/FiltersSidepanel.tsx index 8f96df6399..3d20ab8224 100644 --- a/app/react/V2/Routes/Settings/IX/components/FiltersSidepanel.tsx +++ b/app/react/V2/Routes/Settings/IX/components/FiltersSidepanel.tsx @@ -6,7 +6,7 @@ import { Translate } from 'app/I18N'; import { Button, Card, Sidepanel } from 'V2/Components/UI'; import { Checkbox } from 'app/V2/Components/Forms'; import { useForm } from 'react-hook-form'; -import { useSearchParams } from 'react-router-dom'; +import { useSearchParams } from 'react-router'; interface FiltersSidepanelProps { showSidepanel: boolean; diff --git a/app/react/V2/Routes/Settings/IX/components/SuggestedValue.tsx b/app/react/V2/Routes/Settings/IX/components/SuggestedValue.tsx index 25dbee9c36..7a044f3a63 100644 --- a/app/react/V2/Routes/Settings/IX/components/SuggestedValue.tsx +++ b/app/react/V2/Routes/Settings/IX/components/SuggestedValue.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { useParams } from 'react-router-dom'; +import { useParams } from 'react-router'; import { usePopper } from 'react-popper'; import { useAtomValue } from 'jotai'; import { Popover } from '@headlessui/react'; diff --git a/app/react/V2/Routes/Settings/IX/components/TableElements.tsx b/app/react/V2/Routes/Settings/IX/components/TableElements.tsx index ff249a3d71..63e46fc655 100644 --- a/app/react/V2/Routes/Settings/IX/components/TableElements.tsx +++ b/app/react/V2/Routes/Settings/IX/components/TableElements.tsx @@ -2,7 +2,7 @@ /* eslint-disable react/no-multi-comp */ import React from 'react'; import { Cell, CellContext, Row, createColumnHelper } from '@tanstack/react-table'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { CheckCircleIcon } from '@heroicons/react/24/outline'; import { Translate } from 'app/I18N'; import { Button, Pill } from 'V2/Components/UI'; diff --git a/app/react/V2/Routes/Settings/Languages/LanguagesList.tsx b/app/react/V2/Routes/Settings/Languages/LanguagesList.tsx index d122a99742..96025c7027 100644 --- a/app/react/V2/Routes/Settings/Languages/LanguagesList.tsx +++ b/app/react/V2/Routes/Settings/Languages/LanguagesList.tsx @@ -1,7 +1,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React, { useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { useLoaderData, LoaderFunction } from 'react-router-dom'; +import { useLoaderData, LoaderFunction } from 'react-router'; import { useAtomValue } from 'jotai'; import { intersectionBy, keyBy, merge, values } from 'lodash'; import { Row, createColumnHelper } from '@tanstack/react-table'; diff --git a/app/react/V2/Routes/Settings/MenuConfig/MenuConfig.tsx b/app/react/V2/Routes/Settings/MenuConfig/MenuConfig.tsx index b6412639ad..92dde189db 100644 --- a/app/react/V2/Routes/Settings/MenuConfig/MenuConfig.tsx +++ b/app/react/V2/Routes/Settings/MenuConfig/MenuConfig.tsx @@ -2,7 +2,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React, { useState, useRef, useEffect } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData, useRevalidator, useBlocker } from 'react-router-dom'; +import { LoaderFunction, useLoaderData, useRevalidator, useBlocker } from 'react-router'; import { Row, RowSelectionState } from '@tanstack/react-table'; import { useSetAtom } from 'jotai'; import { cloneDeep, isEqual } from 'lodash'; diff --git a/app/react/V2/Routes/Settings/Pages/PageEditor.tsx b/app/react/V2/Routes/Settings/Pages/PageEditor.tsx index 0c96a21739..b8f0726a46 100644 --- a/app/react/V2/Routes/Settings/Pages/PageEditor.tsx +++ b/app/react/V2/Routes/Settings/Pages/PageEditor.tsx @@ -10,7 +10,7 @@ import { useLoaderData, useNavigate, useRevalidator, -} from 'react-router-dom'; +} from 'react-router'; import { useForm } from 'react-hook-form'; import { useSetAtom } from 'jotai'; import { debounce } from 'lodash'; diff --git a/app/react/V2/Routes/Settings/Pages/PagesList.tsx b/app/react/V2/Routes/Settings/Pages/PagesList.tsx index 860927c1d1..4b5f67fc7a 100644 --- a/app/react/V2/Routes/Settings/Pages/PagesList.tsx +++ b/app/react/V2/Routes/Settings/Pages/PagesList.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/no-multi-comp */ import React, { useState } from 'react'; -import { Link, LoaderFunction, useLoaderData, useRevalidator } from 'react-router-dom'; +import { Link, LoaderFunction, useLoaderData, useRevalidator } from 'react-router'; import { createColumnHelper } from '@tanstack/react-table'; import { IncomingHttpHeaders } from 'http'; import { useSetAtom } from 'jotai'; diff --git a/app/react/V2/Routes/Settings/Pages/components/PageEditorComponents.tsx b/app/react/V2/Routes/Settings/Pages/components/PageEditorComponents.tsx index 660ec9b3f7..1857df2957 100644 --- a/app/react/V2/Routes/Settings/Pages/components/PageEditorComponents.tsx +++ b/app/react/V2/Routes/Settings/Pages/components/PageEditorComponents.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/no-multi-comp */ import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { InformationCircleIcon, ExclamationTriangleIcon } from '@heroicons/react/20/solid'; import { Translate } from 'app/I18N'; diff --git a/app/react/V2/Routes/Settings/Pages/components/PageListTable.tsx b/app/react/V2/Routes/Settings/Pages/components/PageListTable.tsx index c18637a126..9193597d2b 100644 --- a/app/react/V2/Routes/Settings/Pages/components/PageListTable.tsx +++ b/app/react/V2/Routes/Settings/Pages/components/PageListTable.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/no-multi-comp */ import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { kebabCase } from 'lodash'; import { CellContext } from '@tanstack/react-table'; import { Button, Pill } from 'app/V2/Components/UI'; diff --git a/app/react/V2/Routes/Settings/ParagraphExtraction/PXEntities.tsx b/app/react/V2/Routes/Settings/ParagraphExtraction/PXEntities.tsx index e6104a2522..33e56c89f4 100644 --- a/app/react/V2/Routes/Settings/ParagraphExtraction/PXEntities.tsx +++ b/app/react/V2/Routes/Settings/ParagraphExtraction/PXEntities.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useMemo, useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData } from 'react-router-dom'; +import { LoaderFunction, useLoaderData } from 'react-router'; import * as pxEntitiesApi from 'app/V2/api/paragraphExtractor/entities'; import { SettingsContent } from 'V2/Components/Layouts/SettingsContent'; import { Table } from 'V2/Components/UI'; diff --git a/app/react/V2/Routes/Settings/ParagraphExtraction/PXParagraphs.tsx b/app/react/V2/Routes/Settings/ParagraphExtraction/PXParagraphs.tsx index 7845d66c3e..4c8a61293e 100644 --- a/app/react/V2/Routes/Settings/ParagraphExtraction/PXParagraphs.tsx +++ b/app/react/V2/Routes/Settings/ParagraphExtraction/PXParagraphs.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useMemo, useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData } from 'react-router-dom'; +import { LoaderFunction, useLoaderData } from 'react-router'; import * as pxParagraphApi from 'app/V2/api/paragraphExtractor/paragraphs'; import { SettingsContent } from 'V2/Components/Layouts/SettingsContent'; import { Table, Button } from 'V2/Components/UI'; diff --git a/app/react/V2/Routes/Settings/ParagraphExtraction/ParagraphExtraction.tsx b/app/react/V2/Routes/Settings/ParagraphExtraction/ParagraphExtraction.tsx index ce73466cb3..10ab988f92 100644 --- a/app/react/V2/Routes/Settings/ParagraphExtraction/ParagraphExtraction.tsx +++ b/app/react/V2/Routes/Settings/ParagraphExtraction/ParagraphExtraction.tsx @@ -1,7 +1,7 @@ /* eslint-disable max-statements */ import React, { useMemo, useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router-dom'; +import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router'; import * as extractorsAPI from 'app/V2/api/paragraphExtractor/extractors'; import { SettingsContent } from 'V2/Components/Layouts/SettingsContent'; import { Button, Table, ConfirmationModal } from 'V2/Components/UI'; diff --git a/app/react/V2/Routes/Settings/ParagraphExtraction/components/ExtractorModal.tsx b/app/react/V2/Routes/Settings/ParagraphExtraction/components/ExtractorModal.tsx index 05221b45c7..a5e49012c7 100644 --- a/app/react/V2/Routes/Settings/ParagraphExtraction/components/ExtractorModal.tsx +++ b/app/react/V2/Routes/Settings/ParagraphExtraction/components/ExtractorModal.tsx @@ -8,7 +8,7 @@ import { Translate } from 'app/I18N'; import { Template } from 'app/apiResponseTypes'; import { ParagraphExtractorApiPayload } from '../types'; import { NoQualifiedTemplatesMessage } from './NoQualifiedTemplate'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; interface ExtractorModalProps { setShowModal: React.Dispatch>; diff --git a/app/react/V2/Routes/Settings/ParagraphExtraction/components/PXEntityTableElements.tsx b/app/react/V2/Routes/Settings/ParagraphExtraction/components/PXEntityTableElements.tsx index f3ab7a235d..080cc70351 100644 --- a/app/react/V2/Routes/Settings/ParagraphExtraction/components/PXEntityTableElements.tsx +++ b/app/react/V2/Routes/Settings/ParagraphExtraction/components/PXEntityTableElements.tsx @@ -2,7 +2,7 @@ /* eslint-disable react/no-multi-comp */ import React from 'react'; import { CellContext, createColumnHelper } from '@tanstack/react-table'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { Translate } from 'app/I18N'; import { Button, Pill } from 'V2/Components/UI'; import { PXEntityTable } from '../types'; diff --git a/app/react/V2/Routes/Settings/ParagraphExtraction/components/PXTableElements.tsx b/app/react/V2/Routes/Settings/ParagraphExtraction/components/PXTableElements.tsx index 34f1907aeb..2a3635cc05 100644 --- a/app/react/V2/Routes/Settings/ParagraphExtraction/components/PXTableElements.tsx +++ b/app/react/V2/Routes/Settings/ParagraphExtraction/components/PXTableElements.tsx @@ -2,7 +2,7 @@ /* eslint-disable react/no-multi-comp */ import React from 'react'; import { CellContext, createColumnHelper } from '@tanstack/react-table'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { Translate } from 'app/I18N'; import { Button, Pill } from 'V2/Components/UI'; import { PXTable } from '../types'; diff --git a/app/react/V2/Routes/Settings/ParagraphExtraction/components/ViewParagraph.tsx b/app/react/V2/Routes/Settings/ParagraphExtraction/components/ViewParagraph.tsx index b76a9d50d5..8bcedb4b4b 100644 --- a/app/react/V2/Routes/Settings/ParagraphExtraction/components/ViewParagraph.tsx +++ b/app/react/V2/Routes/Settings/ParagraphExtraction/components/ViewParagraph.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { Translate } from 'app/I18N'; import { PXParagraphTable } from '../types'; import { DisplayPills } from './DisplayPills'; diff --git a/app/react/V2/Routes/Settings/RelationshipTypes/RelationshipTypes.tsx b/app/react/V2/Routes/Settings/RelationshipTypes/RelationshipTypes.tsx index 284edc3479..e00d5f00e7 100644 --- a/app/react/V2/Routes/Settings/RelationshipTypes/RelationshipTypes.tsx +++ b/app/react/V2/Routes/Settings/RelationshipTypes/RelationshipTypes.tsx @@ -2,7 +2,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React, { useEffect, useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router-dom'; +import { LoaderFunction, useLoaderData, useRevalidator } from 'react-router'; import { Row } from '@tanstack/react-table'; import { useSetAtom, useAtomValue } from 'jotai'; import { Translate } from 'app/I18N'; diff --git a/app/react/V2/Routes/Settings/Thesauri/EditThesaurus.tsx b/app/react/V2/Routes/Settings/Thesauri/EditThesaurus.tsx index f4bc769f75..42ba24df11 100644 --- a/app/react/V2/Routes/Settings/Thesauri/EditThesaurus.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/EditThesaurus.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/jsx-props-no-spreading */ import React, { useCallback, useMemo, useState } from 'react'; -import { Location, useBlocker, useLoaderData, useNavigate } from 'react-router-dom'; +import { Location, useBlocker, useLoaderData, useNavigate } from 'react-router'; import { useForm } from 'react-hook-form'; import { useAtomValue, useSetAtom } from 'jotai'; import { Row } from '@tanstack/react-table'; diff --git a/app/react/V2/Routes/Settings/Thesauri/ThesauriList.tsx b/app/react/V2/Routes/Settings/Thesauri/ThesauriList.tsx index 777def9121..1b1f11caf7 100644 --- a/app/react/V2/Routes/Settings/Thesauri/ThesauriList.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/ThesauriList.tsx @@ -1,6 +1,6 @@ import React, { useMemo, useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { Link, LoaderFunction, useLoaderData, useRevalidator } from 'react-router-dom'; +import { Link, LoaderFunction, useLoaderData, useRevalidator } from 'react-router'; import { useSetAtom, useAtomValue } from 'jotai'; import { Translate } from 'app/I18N'; import ThesauriAPI from 'app/V2/api/thesauri'; diff --git a/app/react/V2/Routes/Settings/Thesauri/ThesaurusForm.tsx b/app/react/V2/Routes/Settings/Thesauri/ThesaurusForm.tsx index 6ebf60c14c..93831f4285 100644 --- a/app/react/V2/Routes/Settings/Thesauri/ThesaurusForm.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/ThesaurusForm.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/jsx-props-no-spreading */ import React from 'react'; -import { useNavigate, useRevalidator } from 'react-router-dom'; +import { useNavigate, useRevalidator } from 'react-router'; import { SubmitHandler, UseFormReturn } from 'react-hook-form'; import { useAtom, useSetAtom } from 'jotai'; import { isEqual, remove } from 'lodash'; diff --git a/app/react/V2/Routes/Settings/Thesauri/components/ThesauriTable.tsx b/app/react/V2/Routes/Settings/Thesauri/components/ThesauriTable.tsx index 6a2323f802..bcb1677042 100644 --- a/app/react/V2/Routes/Settings/Thesauri/components/ThesauriTable.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/components/ThesauriTable.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router'; import { Row } from '@tanstack/react-table'; import { Translate } from 'app/I18N'; import { Table } from 'app/V2/Components/UI'; diff --git a/app/react/V2/Routes/Settings/Thesauri/components/ThesaurusActions.tsx b/app/react/V2/Routes/Settings/Thesauri/components/ThesaurusActions.tsx index 352c618f3e..f18a032245 100644 --- a/app/react/V2/Routes/Settings/Thesauri/components/ThesaurusActions.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/components/ThesaurusActions.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/no-multi-comp */ import React, { Dispatch, SetStateAction } from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { Translate } from 'app/I18N'; import { Button, ConfirmationModal } from 'app/V2/Components/UI'; import { ConfirmationCallback } from '../helpers'; diff --git a/app/react/V2/Routes/Settings/Thesauri/helpers.ts b/app/react/V2/Routes/Settings/Thesauri/helpers.ts index 0b62859fa3..a005f5fdf6 100644 --- a/app/react/V2/Routes/Settings/Thesauri/helpers.ts +++ b/app/react/V2/Routes/Settings/Thesauri/helpers.ts @@ -1,5 +1,5 @@ import { SetStateAction } from 'react'; -import { LoaderFunction } from 'react-router-dom'; +import { LoaderFunction } from 'react-router'; import { IncomingHttpHeaders } from 'http'; import { Row, RowSelectionState } from '@tanstack/react-table'; import { assign, isEqual, orderBy, remove } from 'lodash'; diff --git a/app/react/V2/Routes/Settings/Thesauri/specs/Thesauri.spec.tsx b/app/react/V2/Routes/Settings/Thesauri/specs/Thesauri.spec.tsx index e698e641b3..70ff458de9 100644 --- a/app/react/V2/Routes/Settings/Thesauri/specs/Thesauri.spec.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/specs/Thesauri.spec.tsx @@ -13,7 +13,7 @@ import { render, cleanup, } from '@testing-library/react/pure'; -import { createMemoryRouter, RouterProvider } from 'react-router-dom'; +import { createMemoryRouter, RouterProvider } from 'react-router'; import { Provider } from 'react-redux'; import { has } from 'lodash'; import { fromJS } from 'immutable'; diff --git a/app/react/V2/Routes/Settings/Translations/EditTranslations.tsx b/app/react/V2/Routes/Settings/Translations/EditTranslations.tsx index 69dc388a81..85865dfab0 100644 --- a/app/react/V2/Routes/Settings/Translations/EditTranslations.tsx +++ b/app/react/V2/Routes/Settings/Translations/EditTranslations.tsx @@ -9,7 +9,7 @@ import { Link, ActionFunction, useFetcher, -} from 'react-router-dom'; +} from 'react-router'; import { InformationCircleIcon } from '@heroicons/react/20/solid'; import { IncomingHttpHeaders } from 'http'; import { useForm } from 'react-hook-form'; diff --git a/app/react/V2/Routes/Settings/Translations/TranslationsList.tsx b/app/react/V2/Routes/Settings/Translations/TranslationsList.tsx index c4a450c4d5..d3f477a85a 100644 --- a/app/react/V2/Routes/Settings/Translations/TranslationsList.tsx +++ b/app/react/V2/Routes/Settings/Translations/TranslationsList.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { IncomingHttpHeaders } from 'http'; -import { useLoaderData, LoaderFunction } from 'react-router-dom'; +import { useLoaderData, LoaderFunction } from 'react-router'; import { createColumnHelper } from '@tanstack/react-table'; import { Translate } from 'app/I18N'; import { ClientTranslationContextSchema, ClientTranslationSchema } from 'app/istore'; diff --git a/app/react/V2/Routes/Settings/Translations/components/TableComponents.tsx b/app/react/V2/Routes/Settings/Translations/components/TableComponents.tsx index 3d12001da0..afc18e1f17 100644 --- a/app/react/V2/Routes/Settings/Translations/components/TableComponents.tsx +++ b/app/react/V2/Routes/Settings/Translations/components/TableComponents.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/no-multi-comp */ import React from 'react'; -import { Link } from 'react-router-dom'; +import { Link } from 'react-router'; import { CellContext } from '@tanstack/react-table'; import { Translate } from 'app/I18N'; import { Button, Pill } from 'V2/Components/UI'; diff --git a/app/react/V2/Routes/Settings/Users/Users.tsx b/app/react/V2/Routes/Settings/Users/Users.tsx index 52a73c3099..4029732d14 100644 --- a/app/react/V2/Routes/Settings/Users/Users.tsx +++ b/app/react/V2/Routes/Settings/Users/Users.tsx @@ -1,7 +1,7 @@ /* eslint-disable max-lines */ import React, { useRef, useState } from 'react'; import { IncomingHttpHeaders } from 'http'; -import { ActionFunction, LoaderFunction, useFetcher, useLoaderData } from 'react-router-dom'; +import { ActionFunction, LoaderFunction, useFetcher, useLoaderData } from 'react-router'; import { Translate } from 'app/I18N'; import { Button, ConfirmationModal, Table, Tabs } from 'V2/Components/UI'; import * as usersAPI from 'V2/api/users'; diff --git a/app/react/V2/Routes/Settings/Users/components/GroupFormSidepanel.tsx b/app/react/V2/Routes/Settings/Users/components/GroupFormSidepanel.tsx index faa6286c12..492747ca68 100644 --- a/app/react/V2/Routes/Settings/Users/components/GroupFormSidepanel.tsx +++ b/app/react/V2/Routes/Settings/Users/components/GroupFormSidepanel.tsx @@ -1,7 +1,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React from 'react'; import { useForm } from 'react-hook-form'; -import { useFetcher } from 'react-router-dom'; +import { useFetcher } from 'react-router'; import { Translate } from 'app/I18N'; import { Button, Card, Sidepanel } from 'V2/Components/UI'; import { InputField, MultiSelect } from 'V2/Components/Forms'; diff --git a/app/react/V2/Routes/Settings/Users/components/UserFormSidepanel.tsx b/app/react/V2/Routes/Settings/Users/components/UserFormSidepanel.tsx index acd63c9e65..daf4e97066 100644 --- a/app/react/V2/Routes/Settings/Users/components/UserFormSidepanel.tsx +++ b/app/react/V2/Routes/Settings/Users/components/UserFormSidepanel.tsx @@ -3,7 +3,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React, { useEffect, useRef, useState } from 'react'; import { useForm } from 'react-hook-form'; -import { useFetcher } from 'react-router-dom'; +import { useFetcher } from 'react-router'; import { FetchResponseError } from 'shared/JSONRequest'; import { t, Translate } from 'app/I18N'; import { InputField, Select, MultiSelect } from 'V2/Components/Forms'; diff --git a/app/react/V2/Routes/Settings/Users/useHandleNotifications.tsx b/app/react/V2/Routes/Settings/Users/useHandleNotifications.tsx index 327aaa467b..2fc97e396e 100644 --- a/app/react/V2/Routes/Settings/Users/useHandleNotifications.tsx +++ b/app/react/V2/Routes/Settings/Users/useHandleNotifications.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react'; -import { useFetchers } from 'react-router-dom'; +import { useFetchers } from 'react-router'; import { useSetAtom } from 'jotai'; import { last } from 'lodash'; import { Translate } from 'app/I18N'; diff --git a/app/react/V2/api/translations/index.ts b/app/react/V2/api/translations/index.ts index 66a2c9026e..035f87cf9c 100644 --- a/app/react/V2/api/translations/index.ts +++ b/app/react/V2/api/translations/index.ts @@ -1,4 +1,4 @@ -import { Params } from 'react-router-dom'; +import { Params } from 'react-router'; import { IncomingHttpHeaders } from 'http'; import { I18NApi } from 'app/I18N'; import { ClientTranslationSchema } from 'app/istore'; diff --git a/app/react/Viewer/components/Paginator.js b/app/react/Viewer/components/Paginator.js index f98a73f3a7..abb19055c2 100644 --- a/app/react/Viewer/components/Paginator.js +++ b/app/react/Viewer/components/Paginator.js @@ -1,7 +1,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import PropTypes from 'prop-types'; import React from 'react'; -import { useSearchParams } from 'react-router-dom'; +import { useSearchParams } from 'react-router'; import { Translate } from 'app/I18N'; import { CurrentLocationLink } from 'app/Layout'; import { searchParamsFromSearchParams } from 'app/utils/routeHelpers'; diff --git a/app/react/Viewer/components/specs/Paginator.spec.js b/app/react/Viewer/components/specs/Paginator.spec.js index 15ee01a937..86c2593b71 100644 --- a/app/react/Viewer/components/specs/Paginator.spec.js +++ b/app/react/Viewer/components/specs/Paginator.spec.js @@ -17,8 +17,8 @@ const mockUseSearchParams = jest.fn().mockImplementation(() => { return [params]; }); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useSearchParams: () => mockUseSearchParams(), useLocation: () => mockUseLocation(), // eslint-disable-next-line jsx-a11y/anchor-has-content, react/prop-types diff --git a/app/react/Viewer/specs/PDFView.spec.js b/app/react/Viewer/specs/PDFView.spec.js index 32ae116b5d..893dee9916 100644 --- a/app/react/Viewer/specs/PDFView.spec.js +++ b/app/react/Viewer/specs/PDFView.spec.js @@ -48,8 +48,8 @@ const mockUseSearchParams = jest.fn().mockImplementation(() => { return [params]; }); const mockNavigate = jest.fn().mockImplementation(path => path); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), useSearchParams: () => mockUseSearchParams(), useLocation: () => mockUseLocation(), useNavigate: () => path => mockNavigate(path), diff --git a/app/react/componentWrappers.tsx b/app/react/componentWrappers.tsx index 04b3607ffe..5660171136 100644 --- a/app/react/componentWrappers.tsx +++ b/app/react/componentWrappers.tsx @@ -8,7 +8,7 @@ import { useOutlet, useParams, useSearchParams, -} from 'react-router-dom'; +} from 'react-router'; import { AppMainContext } from './App/AppMainContext'; import { searchParamsFromSearchParams } from './utils/routeHelpers'; diff --git a/app/react/entry-client.tsx b/app/react/entry-client.tsx index bedeb6d758..22407899fd 100644 --- a/app/react/entry-client.tsx +++ b/app/react/entry-client.tsx @@ -8,7 +8,7 @@ import { matchRoutes, useLocation, useNavigationType, -} from 'react-router-dom'; +} from 'react-router'; import { Provider } from 'jotai'; import { Provider as ReduxProvider } from 'react-redux'; import type { RequestError } from 'V2/shared/errorUtils'; diff --git a/app/react/entry-server.tsx b/app/react/entry-server.tsx index 4780605e83..3b7442dc58 100644 --- a/app/react/entry-server.tsx +++ b/app/react/entry-server.tsx @@ -3,8 +3,13 @@ import { Request as ExpressRequest, Response } from 'express'; // eslint-disable-next-line node/no-restricted-import import fs from 'fs'; -import { AgnosticDataRouteObject, createStaticHandler } from '@remix-run/router'; -import { matchRoutes, RouteObject } from 'react-router-dom'; +import { + createStaticHandler, + createStaticRouter, + matchRoutes, + RouteObject, + StaticRouterProvider, +} from 'react-router'; import React from 'react'; import ReactDOMServer from 'react-dom/server'; import { Helmet } from 'react-helmet'; @@ -13,7 +18,6 @@ import { omit, isEmpty } from 'lodash'; import { Provider as ReduxProvider } from 'react-redux'; import api from 'app/utils/api'; import { RequestParams } from 'app/utils/RequestParams'; -import { createStaticRouter, StaticRouterProvider } from 'react-router-dom/server'; import { FetchResponseError } from 'shared/JSONRequest'; import { ClientSettings } from 'app/apiResponseTypes'; import translationsApi, { IndexedTranslations } from '../api/i18n/translations'; @@ -253,7 +257,7 @@ const getSSRProperties = async ( language?: string ) => { const { reduxStore, atomStoreData } = await prepareStores(req, settings, language); - const { query } = createStaticHandler(routes as AgnosticDataRouteObject[]); + const { query } = createStaticHandler(routes); const { fetchRequest, ssrError } = createFetchRequest(req); const staticHandleContext = await query(fetchRequest); const router = createStaticRouter(routes, staticHandleContext as any); diff --git a/app/react/getIndexElement.tsx b/app/react/getIndexElement.tsx index 7b7c481810..125a0d52a8 100644 --- a/app/react/getIndexElement.tsx +++ b/app/react/getIndexElement.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Navigate } from 'react-router-dom'; +import { Navigate } from 'react-router'; import { ClientSettings } from 'app/apiResponseTypes'; import { validateHomePageRoute } from './utils/routeHelpers'; import { PageView } from './Pages/PageView'; diff --git a/app/react/stories/Paginator.stories.tsx b/app/react/stories/Paginator.stories.tsx index 9664ce3461..8e34d60a4a 100644 --- a/app/react/stories/Paginator.stories.tsx +++ b/app/react/stories/Paginator.stories.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { MemoryRouter } from 'react-router-dom'; +import { MemoryRouter } from 'react-router'; import { Provider } from 'react-redux'; import type { Meta, StoryObj } from '@storybook/react'; import { Paginator } from 'app/V2/Components/UI'; diff --git a/app/react/utils/api.js b/app/react/utils/api.js index 4e5776d68c..1ec002174e 100644 --- a/app/react/utils/api.js +++ b/app/react/utils/api.js @@ -1,4 +1,4 @@ -import { redirect } from 'react-router-dom'; +import { redirect } from 'react-router'; import { isClient } from 'app/utils'; import { notify } from 'app/Notifications/actions/notificationsActions'; import { store } from 'app/store'; diff --git a/app/react/utils/routeHelpers.ts b/app/react/utils/routeHelpers.ts index 8422cc0cc7..daa7e59807 100644 --- a/app/react/utils/routeHelpers.ts +++ b/app/react/utils/routeHelpers.ts @@ -1,4 +1,4 @@ -import { Location } from 'react-router-dom'; +import { Location } from 'react-router'; import { risonDecodeOrIgnore } from 'app/utils'; import { isArray } from 'lodash'; diff --git a/app/react/utils/specs/api.spec.js b/app/react/utils/specs/api.spec.js index d7cea4c5fc..aac853f4a0 100644 --- a/app/react/utils/specs/api.spec.js +++ b/app/react/utils/specs/api.spec.js @@ -11,8 +11,8 @@ import * as notifyActions from 'app/Notifications/actions/notificationsActions'; const mockRedirect = jest.fn(); -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), +jest.mock('react-router', () => ({ + ...jest.requireActual('react-router'), redirect: jest.fn().mockImplementation(path => mockRedirect(path)), })); From f4b1ad8d9532b50966bee95f1b5a2f01af9ab02d Mon Sep 17 00:00:00 2001 From: John Date: Thu, 16 Jan 2025 12:29:21 -0300 Subject: [PATCH 09/69] add missing import update --- app/react/utils/test/renderConnected.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/react/utils/test/renderConnected.tsx b/app/react/utils/test/renderConnected.tsx index d83b8c37e6..d2f27e8a53 100644 --- a/app/react/utils/test/renderConnected.tsx +++ b/app/react/utils/test/renderConnected.tsx @@ -1,12 +1,11 @@ import React from 'react'; import { mount, ReactWrapper, shallow } from 'enzyme'; import configureStore, { MockStore, MockStoreCreator } from 'redux-mock-store'; -import { InitialEntry } from '@remix-run/router'; +import { BrowserRouter, MemoryRouter, InitialEntry } from 'react-router'; import { ConnectedComponent, Provider } from 'react-redux'; import thunk from 'redux-thunk'; import Immutable from 'immutable'; import { render, RenderResult } from '@testing-library/react'; -import { BrowserRouter, MemoryRouter } from 'react-router-dom'; const middlewares = [thunk]; const mockStoreCreator: MockStoreCreator = configureStore(middlewares); From 44d9ebbacb99789f354b61178505f6adb91aa042 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 16 Jan 2025 12:29:37 -0300 Subject: [PATCH 10/69] update dependabot ignores --- .github/dependabot.yml | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 697fd9b5bf..3f4d12e43a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,33 +5,32 @@ updates: schedule: interval: daily ignore: - - dependency-name: "@types/*" - - dependency-name: "@sentry/node" #6880 - versions: [">= 7.114.0"] + - dependency-name: '@types/*' + - dependency-name: '@sentry/node' #6880 + versions: ['>= 7.114.0'] - dependency-name: flowbite #Flowbite & flowbite-datepicker upgrade #6993 - versions: [">= 2.3.1"] + versions: ['>= 2.3.1'] - dependency-name: flowbite-datepicker #Flowbite & flowbite-datepicker upgrade #6993 - versions: [">= 1.2.8"] + versions: ['>= 1.2.8'] - dependency-name: flowbite-react #Flowbite & flowbite-datepicker upgrade #6993 - versions: [">= 0.10.1"] + versions: ['>= 0.10.1'] - dependency-name: Mongoose #Mongoose upgrade #7017 - versions: [">= 8.4.3"] + versions: ['>= 8.4.3'] - dependency-name: cookie - - dependency-name: "@socket.io*" + - dependency-name: '@socket.io*' - dependency-name: bootstrap - dependency-name: express-prom-bundle - dependency-name: immutable - dependency-name: otplib - dependency-name: redux - dependency-name: redux-thunk - - dependency-name: "@typescript-eslint/eslint-plugin" - - dependency-name: "@typescript-eslint/parser" + - dependency-name: '@typescript-eslint/eslint-plugin' + - dependency-name: '@typescript-eslint/parser' - dependency-name: eslint #6784 - dependency-name: fetch-mock - - dependency-name: react-router-dom - dependency-name: react-datepicker - dependency-name: recharts - - dependency-name: "@headlessui/react" + - dependency-name: '@headlessui/react' - dependency-name: react-player open-pull-requests-limit: 5 labels: @@ -41,19 +40,19 @@ updates: babel: applies-to: version-updates patterns: - - "@babel*" + - '@babel*' storybook: applies-to: version-updates patterns: - - "@storybook*" + - '@storybook*' sentry: applies-to: version-updates patterns: - - "@sentry*" + - '@sentry*' dnd-kit: applies-to: version-updates patterns: - - "@dnd-kit*" + - '@dnd-kit*' socket.io: applies-to: version-updates patterns: @@ -70,9 +69,9 @@ updates: applies-to: version-updates update-types: [minor, patch] patterns: - - "*" + - '*' dev-major-dependencies: applies-to: version-updates update-types: [major] patterns: - - "*" + - '*' From 0cce9e8bfe298fa8a1b9968b15238784b69669f4 Mon Sep 17 00:00:00 2001 From: Joan Gallego Girona Date: Fri, 17 Jan 2025 10:11:56 +0100 Subject: [PATCH 11/69] Update mongoose and mongodb driver (#7588) * Update mongoose and mongodb driver * update mongoose and mongodb driver to latest version * fix ts types * fix ts type errors * use mongodb db instead of mongoose useDb use the mongodb one for all v2 things and tests --- app/api/auth/privateInstanceMiddleware.js | 1 - .../common.v2/database/CollectionWrapper.ts | 57 ++++++++++-- app/api/common.v2/database/MongoDataSource.ts | 10 +-- .../database/SessionScopedCollection.ts | 9 +- .../common.v2/database/SyncedCollection.ts | 12 ++- .../database/getConnectionForCurrentTenant.ts | 18 +++- .../database/specs/MongoResultSet.spec.ts | 20 +++-- app/api/config.ts | 3 + .../database/MongoEntitiesDataSource.ts | 2 +- ...ons-for-v2-relationships-migration.spec.ts | 4 +- .../18-fix-malformed-metadata/index.js | 2 +- app/api/odm/DB.ts | 5 ++ app/api/odm/MultiTenantMongooseModel.ts | 8 +- app/api/odm/model.ts | 17 +++- app/api/odm/specs/DB.spec.ts | 5 +- .../odm/specs/EntitiesUpdateLogHelper.spec.ts | 2 +- app/api/odm/specs/model_multi_tenant.spec.ts | 7 +- .../MongoRelationshipTypesDataSource.ts | 5 +- .../specs/PDFSegmentation.spec.ts | 6 +- app/api/stats/routes.ts | 6 +- .../stats/specs/RetrieveStatsService.spec.ts | 2 +- app/api/sync/syncConfig.ts | 3 +- app/api/sync/synchronizer.ts | 4 +- app/api/tenants/specs/tenantsContext.spec.ts | 3 +- app/api/tenants/specs/tenantsModel.spec.ts | 3 +- app/api/tenants/tenantsModel.ts | 10 ++- app/api/updatelogs/updatelogsModel.ts | 2 + app/api/utils/testing_db.ts | 9 +- docker-compose.yml | 1 - package.json | 4 +- yarn.lock | 90 +++++++------------ 31 files changed, 194 insertions(+), 136 deletions(-) diff --git a/app/api/auth/privateInstanceMiddleware.js b/app/api/auth/privateInstanceMiddleware.js index fe0f898edf..167f80a644 100644 --- a/app/api/auth/privateInstanceMiddleware.js +++ b/app/api/auth/privateInstanceMiddleware.js @@ -18,7 +18,6 @@ export default function (req, res, next) { if (req.user || req.url.match(allowedRoutesMatch)) { return next(); } - return settings .get() .then(result => { diff --git a/app/api/common.v2/database/CollectionWrapper.ts b/app/api/common.v2/database/CollectionWrapper.ts index 0b96f0ba76..56ab0b119a 100644 --- a/app/api/common.v2/database/CollectionWrapper.ts +++ b/app/api/common.v2/database/CollectionWrapper.ts @@ -27,6 +27,8 @@ import { OrderedBulkOperation, UnorderedBulkOperation, ListSearchIndexesCursor, + IndexDescriptionCompact, + IndexDescriptionInfo, } from 'mongodb'; export abstract class CollectionWrapper { @@ -127,20 +129,12 @@ export abstract class CollectionWrapper { throw new Error('Method not implemented.'); } - async indexInformation(_options?: IndexInformationOptions | undefined): Promise { - throw new Error('Method not implemented.'); - } - async estimatedDocumentCount( _options?: EstimatedDocumentCountOptions | undefined ): Promise { throw new Error('Method not implemented.'); } - async indexes(_options?: IndexInformationOptions | undefined): Promise { - throw new Error('Method not implemented.'); - } - watch>( _pipeline?: Document[] | undefined, _options?: ChangeStreamOptions | undefined @@ -175,6 +169,10 @@ export abstract class CollectionWrapper { throw new Error('Method not implemented.'); } + get timeoutMS(): number | undefined { + throw new Error('Method not implemented.'); + } + async dropSearchIndex(): Promise { throw new Error('Method not implemented.'); } @@ -182,4 +180,47 @@ export abstract class CollectionWrapper { async updateSearchIndex(): Promise { throw new Error('Method not implemented.'); } + + async indexInformation( + options: IndexInformationOptions & { + full: true; + } + ): Promise; + + async indexInformation( + options: IndexInformationOptions & { + full?: false; + } + ): Promise; + + async indexInformation(): Promise; + + async indexInformation( + options?: IndexInformationOptions + ): Promise { + return this.collection.indexInformation({ + ...options, + full: options?.full ?? false, + }); + } + + async indexes( + options: IndexInformationOptions & { full?: true } + ): Promise; + + async indexes( + options: IndexInformationOptions & { full: false } + ): Promise; + + async indexes( + options: IndexInformationOptions + ): Promise; + + async indexes(options?: ListIndexesOptions): Promise; + + async indexes( + options?: IndexInformationOptions + ): Promise { + return this.collection.indexes(options); + } } diff --git a/app/api/common.v2/database/MongoDataSource.ts b/app/api/common.v2/database/MongoDataSource.ts index 3399d1f67b..66c29dbf47 100644 --- a/app/api/common.v2/database/MongoDataSource.ts +++ b/app/api/common.v2/database/MongoDataSource.ts @@ -4,7 +4,7 @@ import { MongoTransactionManager } from './MongoTransactionManager'; import { SessionScopedCollection } from './SessionScopedCollection'; import { SyncedCollection } from './SyncedCollection'; -export abstract class MongoDataSource { +export abstract class MongoDataSource { private db: Db; protected abstract collectionName: string; @@ -17,9 +17,9 @@ export abstract class MongoDataSource { } protected getCollection(collectionName = this.collectionName) { - return new SyncedCollection( - new SessionScopedCollection( - this.db.collection(collectionName), + return new SyncedCollection( + new SessionScopedCollection( + this.db.collection(collectionName), this.transactionManager ), this.transactionManager, @@ -45,6 +45,6 @@ export abstract class MongoDataSource { } protected createBulkStream() { - return new BulkWriteStream(this.getCollection()); + return new BulkWriteStream(this.getCollection()); } } diff --git a/app/api/common.v2/database/SessionScopedCollection.ts b/app/api/common.v2/database/SessionScopedCollection.ts index 7c13c203aa..3bf0f0173a 100644 --- a/app/api/common.v2/database/SessionScopedCollection.ts +++ b/app/api/common.v2/database/SessionScopedCollection.ts @@ -72,8 +72,8 @@ export class SessionScopedCollection } async bulkWrite( - operations: AnyBulkWriteOperation[], - options?: BulkWriteOptions | undefined + operations: ReadonlyArray>, + options?: BulkWriteOptions ): Promise { return this.collection.bulkWrite(operations, this.appendSession(options)); } @@ -130,10 +130,7 @@ export class SessionScopedCollection return this.collection.find(filter || {}, this.appendSession(options)); } - async countDocuments( - filter?: Document | undefined, - options?: CountDocumentsOptions | undefined - ): Promise { + async countDocuments(filter?: Filter, options?: CountDocumentsOptions): Promise { return this.collection.countDocuments(filter, this.appendSession(options)); } diff --git a/app/api/common.v2/database/SyncedCollection.ts b/app/api/common.v2/database/SyncedCollection.ts index ffd8f2cd5b..031483a7c3 100644 --- a/app/api/common.v2/database/SyncedCollection.ts +++ b/app/api/common.v2/database/SyncedCollection.ts @@ -121,17 +121,15 @@ export class SyncedCollection } async bulkWrite( - operations: AnyBulkWriteOperation[], + operations: ReadonlyArray>, options?: BulkWriteOptions | undefined ): Promise { const updateConditions = operations .map((op: any) => op.updateOne?.filter || op.updateMany?.filter) .filter((op: any) => op); - const deleteConditions = operations .map((op: any) => op.deleteOne?.filter || op.deleteMany?.filter) .filter((op: any) => op); - await this.upsertSyncLogs(deleteConditions, true); const result = await this.collection.bulkWrite(operations, options); await Promise.all([ @@ -145,8 +143,8 @@ export class SyncedCollection async updateOne( filter: Filter, - update: UpdateFilter | Partial, - options?: UpdateOptions | undefined + update: UpdateFilter | Document[], + options?: UpdateOptions ): Promise> { const result = await this.collection.updateOne(filter, update, options); await this.upsertSyncLogs([filter]); @@ -204,8 +202,8 @@ export class SyncedCollection } async countDocuments( - filter?: Document | undefined, - options?: CountDocumentsOptions | undefined + filter?: Filter, + options?: CountDocumentsOptions ): Promise { return this.collection.countDocuments(filter, options); } diff --git a/app/api/common.v2/database/getConnectionForCurrentTenant.ts b/app/api/common.v2/database/getConnectionForCurrentTenant.ts index e34c9781bd..72e763da64 100644 --- a/app/api/common.v2/database/getConnectionForCurrentTenant.ts +++ b/app/api/common.v2/database/getConnectionForCurrentTenant.ts @@ -9,11 +9,25 @@ function getTenant(): Tenant { } function getConnection(): Db { - return DB.connectionForDB(getTenant().dbName).db; + if (config.env_feature_flags.use_mongodb_instead_of_mongoose) { + return DB.mongodb_Db(getTenant().dbName); + } + const { db } = DB.connectionForDB(getTenant().dbName); + if (!db) { + throw new Error('DB object is undefined'); + } + return db; } function getSharedConnection(): Db { - return DB.connectionForDB(config.SHARED_DB).db; + if (config.env_feature_flags.use_mongodb_instead_of_mongoose) { + return DB.mongodb_Db(getTenant().dbName); + } + const { db } = DB.connectionForDB(config.SHARED_DB); + if (!db) { + throw new Error('DB object is undefined'); + } + return db; } function getClient(): MongoClient { diff --git a/app/api/common.v2/database/specs/MongoResultSet.spec.ts b/app/api/common.v2/database/specs/MongoResultSet.spec.ts index 6335a7b0e9..0b4ba58d89 100644 --- a/app/api/common.v2/database/specs/MongoResultSet.spec.ts +++ b/app/api/common.v2/database/specs/MongoResultSet.spec.ts @@ -111,7 +111,9 @@ describe('when built from a $type cursor', () => { const cursor = buildCursor(); const resultSet = new MongoResultSet(cursor!, elem => elem.name); expect(await resultSet.find(item => item.startsWith('doc2'))).toBe('doc2'); - expect(cursor?.closed).toBe(true); + //Due to a mongodb driver bug this is failing but its not affecting us for now, + //im leaving this as false so we know in case it gets fixed + expect(cursor?.closed).toBe(false); }); it('should return null if no item matches the query', async () => { @@ -134,7 +136,9 @@ describe('when built from a $type cursor', () => { const cursor = buildCursor(); const resultSet = new MongoResultSet(cursor!, elem => elem.name); expect(await resultSet.every(item => item.startsWith('doc1'))).toBe(false); - expect(cursor?.closed).toBe(true); + //Due to a mongodb driver bug this is failing but its not affecting us for now, + //im leaving this as false so we know in case it gets fixed + expect(cursor?.closed).toBe(false); }); it('should return true if there are no items', async () => { @@ -150,7 +154,9 @@ describe('when built from a $type cursor', () => { const cursor = buildCursor(); const resultSet = new MongoResultSet(cursor!, elem => elem.name); expect(await resultSet.some(item => item === 'doc3')).toBe(true); - expect(cursor?.closed).toBe(true); + //Due to a mongodb driver bug this is failing but its not affecting us for now, + //im leaving this as false so we know in case it gets fixed + expect(cursor?.closed).toBe(false); }); it('should return false if it is false for every item', async () => { @@ -219,7 +225,9 @@ describe('when built from a $type cursor', () => { } }); expect(visited).toEqual(['doc1', 'doc2']); - expect(cursor?.closed).toBe(true); + //Due to a mongodb driver bug this is failing but its not affecting us for now, + //im leaving this as false so we know in case it gets fixed + expect(cursor?.closed).toBe(false); }); }); @@ -272,7 +280,9 @@ describe('when built from a $type cursor', () => { ['doc1', 'doc2'], ['doc3', 'doc4'], ]); - expect(cursor?.closed).toBe(true); + //Due to a mongodb driver bug this is failing but its not affecting us for now, + //im leaving this as false so we know in case it gets fixed + expect(cursor?.closed).toBe(false); }); }); diff --git a/app/api/config.ts b/app/api/config.ts index 4131b97a7a..ef7bb655d6 100644 --- a/app/api/config.ts +++ b/app/api/config.ts @@ -93,4 +93,7 @@ export const config = { }, githubToken: process.env.GITHUB_TOKEN || '', queueName: QUEUE_NAME || 'uwazi_jobs', + env_feature_flags: { + use_mongodb_instead_of_mongoose: process.env.MONGO_NOT_MONGOOSE || false, + }, }; diff --git a/app/api/entities.v2/database/MongoEntitiesDataSource.ts b/app/api/entities.v2/database/MongoEntitiesDataSource.ts index 7dea6751b4..e580f99bd9 100644 --- a/app/api/entities.v2/database/MongoEntitiesDataSource.ts +++ b/app/api/entities.v2/database/MongoEntitiesDataSource.ts @@ -5,6 +5,7 @@ import { MongoResultSet } from 'api/common.v2/database/MongoResultSet'; import { MongoTransactionManager } from 'api/common.v2/database/MongoTransactionManager'; import entities from 'api/entities/entities'; import v1EntitiesModel from 'api/entities/entitiesModel'; +import { search } from 'api/search'; import { MongoSettingsDataSource } from 'api/settings.v2/database/MongoSettingsDataSource'; import { MongoTemplatesDataSource } from 'api/templates.v2/database/MongoTemplatesDataSource'; import { Db } from 'mongodb'; @@ -13,7 +14,6 @@ import { EntitiesDataSource } from '../contracts/EntitiesDataSource'; import { Entity, EntityMetadata, MetadataValue } from '../model/Entity'; import { EntityMappers } from './EntityMapper'; import { EntityDBO, EntityJoinTemplate } from './schemas/EntityTypes'; -import { search } from 'api/search'; export class MongoEntitiesDataSource extends MongoDataSource diff --git a/app/api/migrations/migrations/141-add-collections-for-v2-relationships-migration/specs/141-add-collections-for-v2-relationships-migration.spec.ts b/app/api/migrations/migrations/141-add-collections-for-v2-relationships-migration/specs/141-add-collections-for-v2-relationships-migration.spec.ts index 4841b8b340..d26a0c9f7b 100644 --- a/app/api/migrations/migrations/141-add-collections-for-v2-relationships-migration/specs/141-add-collections-for-v2-relationships-migration.spec.ts +++ b/app/api/migrations/migrations/141-add-collections-for-v2-relationships-migration/specs/141-add-collections-for-v2-relationships-migration.spec.ts @@ -55,12 +55,12 @@ describe('migration add collections for v2 relationships migration', () => { }); it('should set unique index on the migration fields', async () => { - const relCollection = await db.collection('relationshipMigrationFields'); + const relCollection = db.collection('relationshipMigrationFields'); const indexInfo = await relCollection.indexInformation({ full: true }); const uniqueIndex = indexInfo.find( (index: any) => index.name === 'sourceTemplate_1_relationType_1_targetTemplate_1' ); - expect(uniqueIndex.unique).toBe(true); + expect(uniqueIndex?.unique).toBe(true); }); it('should check if a reindex is needed', async () => { diff --git a/app/api/migrations/migrations/18-fix-malformed-metadata/index.js b/app/api/migrations/migrations/18-fix-malformed-metadata/index.js index 1237854c83..9f91d31d71 100644 --- a/app/api/migrations/migrations/18-fix-malformed-metadata/index.js +++ b/app/api/migrations/migrations/18-fix-malformed-metadata/index.js @@ -24,7 +24,7 @@ const findLabel = (value, propertyData, thesauriById, translation) => { [] ); - const thesaurusElement = flattenedValues.find(v => v.id === value.toString()); + const thesaurusElement = flattenedValues.find(v => v.id.toString() === value.toString()); if (thesaurusElement) { const context = translation.contexts.find( ctx => ctx.id.toString() === propertyData.content.toString() diff --git a/app/api/odm/DB.ts b/app/api/odm/DB.ts index 948ceee3cb..4a1c50a2c0 100644 --- a/app/api/odm/DB.ts +++ b/app/api/odm/DB.ts @@ -1,5 +1,6 @@ import mongoose, { Connection, ConnectOptions } from 'mongoose'; import { config } from 'api/config'; +import { DbOptions } from 'mongodb'; let connection: Connection; @@ -25,6 +26,10 @@ const DB = { return this.getConnection().useDb(dbName, options); }, + mongodb_Db(dbName: string, options?: DbOptions) { + return this.getConnection().getClient().db(dbName, options); + }, + getConnection() { return connection; }, diff --git a/app/api/odm/MultiTenantMongooseModel.ts b/app/api/odm/MultiTenantMongooseModel.ts index 1da4ebc474..99862a4d99 100644 --- a/app/api/odm/MultiTenantMongooseModel.ts +++ b/app/api/odm/MultiTenantMongooseModel.ts @@ -1,5 +1,5 @@ import { BulkWriteOptions } from 'mongodb'; -import mongoose, { Schema } from 'mongoose'; +import mongoose, { ProjectionType, Schema } from 'mongoose'; import { DataType, UwaziFilterQuery, @@ -36,7 +36,11 @@ class MultiTenantMongooseModel { return this.dbForCurrentTenant().findById(id, select, { lean: true }); } - find(query: UwaziFilterQuery>, select = '', options = {}) { + find( + query: UwaziFilterQuery>, + select: ProjectionType> = {}, + options = {} + ) { return this.dbForCurrentTenant().find(query, select, options); } diff --git a/app/api/odm/model.ts b/app/api/odm/model.ts index 26ace86cad..0c9a22096e 100644 --- a/app/api/odm/model.ts +++ b/app/api/odm/model.ts @@ -153,10 +153,21 @@ export class OdmModel implements SyncDBDataSource { }); const existingIds = new Set( ( - await this.db.find({ _id: { $in: ids } } as UwaziFilterQuery>, '_id', { - lean: true, + await this.db.find( + { _id: { $in: ids } }, + { _id: 1 }, + { + lean: true, + } + ) + ) + .map(d => { + if (d._id) { + return d._id.toString(); + } + return null; }) - ).map(d => d._id.toString()) + .filter((id): id is string => typeof id === 'string') ); const existingData = dataArray.filter(d => d._id && existingIds.has(d._id.toString())); diff --git a/app/api/odm/specs/DB.spec.ts b/app/api/odm/specs/DB.spec.ts index 85ac82fd1d..85b78f9a22 100644 --- a/app/api/odm/specs/DB.spec.ts +++ b/app/api/odm/specs/DB.spec.ts @@ -7,6 +7,7 @@ import { testingTenants } from 'api/utils/testingTenants'; import { config } from 'api/config'; import { DB } from '../DB'; import { instanceModel } from '../model'; +import testingDB from 'api/utils/testing_db'; const testSchema = new mongoose.Schema({ name: { type: String, index: true }, @@ -27,8 +28,8 @@ describe('DB', () => { beforeEach(async () => { const uri = config.DBHOST; await DB.connect(`${uri}_DB_spec_ts`); - db1 = DB.getConnection().useDb('db1').db; - db2 = DB.getConnection().useDb('db2').db; + db1 = testingDB.db('db1'); + db2 = testingDB.db('db2'); }); afterAll(async () => { diff --git a/app/api/odm/specs/EntitiesUpdateLogHelper.spec.ts b/app/api/odm/specs/EntitiesUpdateLogHelper.spec.ts index 0cfd6e04f1..c7f1945334 100644 --- a/app/api/odm/specs/EntitiesUpdateLogHelper.spec.ts +++ b/app/api/odm/specs/EntitiesUpdateLogHelper.spec.ts @@ -51,7 +51,7 @@ describe('EntitiesUpdateLogHelper', () => { fixtureFactory.id('files-thumbnail1'), fixtureFactory.id('files-document1'), ].forEach(id => { - const original = fixtures.updatelogs.find(log => log._id.toString() === id.toString()); + const original = fixtures.updatelogs.find(log => log._id!.toString() === id.toString()); const current = logs.find(log => log._id.toString() === id.toString()); expect(current!.timestamp).toBeGreaterThan(original!.timestamp! as number); diff --git a/app/api/odm/specs/model_multi_tenant.spec.ts b/app/api/odm/specs/model_multi_tenant.spec.ts index c6234e4139..e3c9c36543 100644 --- a/app/api/odm/specs/model_multi_tenant.spec.ts +++ b/app/api/odm/specs/model_multi_tenant.spec.ts @@ -5,7 +5,6 @@ import { config } from 'api/config'; import { testingTenants } from 'api/utils/testingTenants'; import { instanceModel } from 'api/odm'; import testingDB from 'api/utils/testing_db'; -import { DB } from '../DB'; const testSchema = new mongoose.Schema({ name: String, @@ -23,9 +22,9 @@ describe('ODM Model multi-tenant', () => { beforeAll(async () => { await testingDB.connect({ defaultTenant: false }); - defaultDB = DB.connectionForDB(config.defaultTenant.dbName).db; - db1 = DB.connectionForDB('db1').db; - db2 = DB.connectionForDB('db2').db; + defaultDB = testingDB.db(config.defaultTenant.dbName); + db1 = testingDB.db('db1'); + db2 = testingDB.db('db2'); }); beforeEach(async () => { diff --git a/app/api/relationshiptypes.v2/database/MongoRelationshipTypesDataSource.ts b/app/api/relationshiptypes.v2/database/MongoRelationshipTypesDataSource.ts index 115b504e50..d7e59df44f 100644 --- a/app/api/relationshiptypes.v2/database/MongoRelationshipTypesDataSource.ts +++ b/app/api/relationshiptypes.v2/database/MongoRelationshipTypesDataSource.ts @@ -7,8 +7,9 @@ import { mapRelationshipTypeToApp } from './mappings/RelationshipTypeMappers'; import { RelationshipType } from '../model/RelationshipType'; export class MongoRelationshipTypesDataSource - extends MongoDataSource - implements RelationshipTypesDataSource { // eslint-disable-line + extends MongoDataSource + implements RelationshipTypesDataSource +{ protected collectionName = 'relationtypes'; async typesExist(ids: string[]): Promise { diff --git a/app/api/services/pdfsegmentation/specs/PDFSegmentation.spec.ts b/app/api/services/pdfsegmentation/specs/PDFSegmentation.spec.ts index 745b7dd882..623b783a3c 100644 --- a/app/api/services/pdfsegmentation/specs/PDFSegmentation.spec.ts +++ b/app/api/services/pdfsegmentation/specs/PDFSegmentation.spec.ts @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ /* eslint-disable max-lines */ -import { fixturer } from 'api/utils/testing_db'; +import testingDB, { fixturer } from 'api/utils/testing_db'; import { fixturesOneFile, fixturesOtherFile, @@ -79,8 +79,8 @@ describe('PDFSegmentation', () => { beforeEach(async () => { segmentPdfs = new PDFSegmentation(); - dbOne = DB.connectionForDB(tenantOne.dbName).db; - dbTwo = DB.connectionForDB(tenantTwo.dbName).db; + dbOne = testingDB.db(tenantOne.dbName); + dbTwo = testingDB.db(tenantTwo.dbName); tenants.tenants = { tenantOne }; fileA = await fs.readFile(`app/api/services/pdfsegmentation/specs/uploads/${fixturesPdfNameA}`); diff --git a/app/api/stats/routes.ts b/app/api/stats/routes.ts index 4f2f9695ce..3d1a081a20 100644 --- a/app/api/stats/routes.ts +++ b/app/api/stats/routes.ts @@ -1,13 +1,11 @@ import { Application } from 'express'; import needsAuthorization from 'api/auth/authMiddleware'; import { RetrieveStatsService } from 'api/stats/services/RetrieveStatsService'; -import { tenants } from 'api/tenants'; -import { DB } from 'api/odm'; +import { getConnection } from 'api/common.v2/database/getConnectionForCurrentTenant'; export default (app: Application) => { app.get('/api/stats', needsAuthorization(['admin']), async (_req, res, _next) => { - const { db } = DB.connectionForDB(tenants.current().dbName); - const action = new RetrieveStatsService(db); + const action = new RetrieveStatsService(getConnection()); const stats = await action.execute(); res.json(stats); diff --git a/app/api/stats/specs/RetrieveStatsService.spec.ts b/app/api/stats/specs/RetrieveStatsService.spec.ts index 8036b8c6b1..ec3f166894 100644 --- a/app/api/stats/specs/RetrieveStatsService.spec.ts +++ b/app/api/stats/specs/RetrieveStatsService.spec.ts @@ -10,7 +10,7 @@ describe('RetrieveStats', () => { let db: Db; beforeAll(async () => { - db = (await testingDB.connect()).db; + db = (await testingDB.connect()).db as Db; }); beforeEach(async () => { diff --git a/app/api/sync/syncConfig.ts b/app/api/sync/syncConfig.ts index aec4e60baa..15e9f367fc 100644 --- a/app/api/sync/syncConfig.ts +++ b/app/api/sync/syncConfig.ts @@ -1,4 +1,3 @@ -import { DataType } from 'api/odm'; import { SyncConfig } from 'api/sync/syncWorker'; import templatesModel from 'api/templates/templatesModel'; import { model as updateLog, UpdateLog } from 'api/updatelogs'; @@ -163,7 +162,7 @@ export const createSyncConfig = async ( return changes; }, - async shouldSync(change: DataType) { + async shouldSync(change: UpdateLog) { if (change.deleted) return { skip: true }; const templatesConfig = this.config.templates || {}; diff --git a/app/api/sync/synchronizer.ts b/app/api/sync/synchronizer.ts index f7c7552fae..da71ac9e3c 100644 --- a/app/api/sync/synchronizer.ts +++ b/app/api/sync/synchronizer.ts @@ -22,7 +22,7 @@ const uploadFile = async ( }; export const synchronizer = { - async syncDelete(change: DataType, url: string, cookie: string) { + async syncDelete(change: UpdateLog, url: string, cookie: string) { await this.syncData( { url, @@ -40,7 +40,7 @@ export const synchronizer = { change, data, cookie, - }: { url: string; change: DataType; data: DataType; cookie: string }, + }: { url: string; change: UpdateLog; data: DataType; cookie: string }, action: keyof typeof request ) { await request[action]( diff --git a/app/api/tenants/specs/tenantsContext.spec.ts b/app/api/tenants/specs/tenantsContext.spec.ts index 5378623a4d..68610c1fee 100644 --- a/app/api/tenants/specs/tenantsContext.spec.ts +++ b/app/api/tenants/specs/tenantsContext.spec.ts @@ -1,4 +1,3 @@ -import { DB } from 'api/odm/DB'; import { Db } from 'mongodb'; import testingDB from 'api/utils/testing_db'; import { testingEnvironment } from 'api/utils/testingEnvironment'; @@ -26,7 +25,7 @@ describe('tenantsContext', () => { beforeAll(async () => { await testingDB.connect(); testingEnvironment.setRequestId(); - db = DB.connectionForDB(config.SHARED_DB).db; + db = testingDB.db(config.SHARED_DB); await db.collection('tenants').deleteMany({}); await db.collection('tenants').insertMany([ diff --git a/app/api/tenants/specs/tenantsModel.spec.ts b/app/api/tenants/specs/tenantsModel.spec.ts index 5d5c057ae7..84d94ee36b 100644 --- a/app/api/tenants/specs/tenantsModel.spec.ts +++ b/app/api/tenants/specs/tenantsModel.spec.ts @@ -1,5 +1,4 @@ import { config } from 'api/config'; -import { DB } from 'api/odm/DB'; import { Db, ObjectId } from 'mongodb'; import { Model } from 'mongoose'; import waitForExpect from 'wait-for-expect'; @@ -17,7 +16,7 @@ describe('tenantsModel', () => { beforeAll(async () => { await testingDB.connect(); testingEnvironment.setRequestId(); - db = DB.connectionForDB(config.SHARED_DB).db; + db = testingDB.db(config.SHARED_DB); }); beforeEach(async () => { diff --git a/app/api/tenants/tenantsModel.ts b/app/api/tenants/tenantsModel.ts index f8929762b2..ea5d228bb6 100644 --- a/app/api/tenants/tenantsModel.ts +++ b/app/api/tenants/tenantsModel.ts @@ -76,15 +76,19 @@ class TenantsModel extends EventEmitter { } async initialize() { - const collections = (await this.tenantsDB.db.listCollections().toArray()).map(c => c.name); + const { db } = this.tenantsDB; + if (!db) { + throw new Error('Tenants db is undefined'); + } + const collections = (await db.listCollections().toArray()).map(c => c.name); if (collections.includes(this.collectionName)) { - await this.tenantsDB.db.command({ + await db.command({ collMod: this.collectionName, validator: schemaValidator, }); } else { - await this.tenantsDB.db.createCollection(this.collectionName, { + await db.createCollection(this.collectionName, { validator: schemaValidator, }); } diff --git a/app/api/updatelogs/updatelogsModel.ts b/app/api/updatelogs/updatelogsModel.ts index 29c579b2ef..a11a5e117a 100644 --- a/app/api/updatelogs/updatelogsModel.ts +++ b/app/api/updatelogs/updatelogsModel.ts @@ -1,6 +1,7 @@ import mongoose from 'mongoose'; import { MultiTenantMongooseModel } from 'api/odm/MultiTenantMongooseModel'; import { ObjectIdSchema } from 'shared/types/commonTypes'; +import { ObjectId } from 'mongodb'; const updateLogSchema = new mongoose.Schema({ timestamp: { type: Number, index: true }, @@ -11,6 +12,7 @@ const updateLogSchema = new mongoose.Schema({ updateLogSchema.index({ namespace: 1, timestamp: 1 }); export interface UpdateLog extends mongoose.Document { + _id: ObjectId; timestamp: number; namespace: string; mongoId: ObjectIdSchema; diff --git a/app/api/utils/testing_db.ts b/app/api/utils/testing_db.ts index cfe6e55020..43c814e49c 100644 --- a/app/api/utils/testing_db.ts +++ b/app/api/utils/testing_db.ts @@ -81,6 +81,7 @@ const testingDB: { mongodb: Db | null; dbName: string; UserInContextMockFactory: UserInContextMockFactory; + db: (dbName: string) => Db; connect: (options?: { defaultTenant: boolean } | undefined) => Promise; disconnect: () => Promise; tearDown: () => Promise; @@ -108,7 +109,7 @@ const testingDB: { .basename(expect.getState().testPath || '') .replace(/[.-]/g, '_')}`.substring(0, 63); await initMongoServer(this.dbName); - mongodb = mongooseConnection.db; + mongodb = this.db(this.dbName); this.mongodb = mongodb; if (options.defaultTenant) { @@ -124,6 +125,10 @@ const testingDB: { return mongooseConnection; }, + db(dbName: string) { + return DB.mongodb_Db(dbName); + }, + async tearDown() { await this.disconnect(); }, @@ -148,7 +153,7 @@ const testingDB: { await this.connect(); let optionalMongo: Db | null = null; if (dbName) { - optionalMongo = DB.connectionForDB(dbName).db; + optionalMongo = DB.connectionForDB(dbName).getClient().db(dbName); } await fixturer.clearAllAndLoad(optionalMongo || mongodb, fixtures); await this.createIndices(); diff --git a/docker-compose.yml b/docker-compose.yml index 268bf3289c..3d77ee5311 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3' services: elasticsearch: build: diff --git a/package.json b/package.json index dc6db343da..9e27476f02 100644 --- a/package.json +++ b/package.json @@ -175,8 +175,8 @@ "moment-timezone": "0.5.46", "monaco-editor": "0.50.0", "monaco-editor-webpack-plugin": "^7.1.0", - "mongodb": "6.3.0", - "mongoose": "8.1.2", + "mongodb": "6.12.0", + "mongoose": "8.9.4", "multer": "^1.4.5-lts.1", "node-uuid": "^1.4.7", "nodemailer": "6.9.16", diff --git a/yarn.lock b/yarn.lock index a9c2c490f5..8d6852daa7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2823,10 +2823,10 @@ dependencies: "@types/mdx" "^2.0.0" -"@mongodb-js/saslprep@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz#022fa36620a7287d17acd05c4aae1e5f390d250d" - integrity sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw== +"@mongodb-js/saslprep@^1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz#e974bab8eca9faa88677d4ea4da8d09a52069004" + integrity sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw== dependencies: sparse-bitfield "^3.0.3" @@ -6098,10 +6098,10 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" -bson@^6.2.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.5.0.tgz#fc4828d065e64e48ea442b1a23099b2e52f7ff0b" - integrity sha512-DXf1BTAS8vKyR90BO4x5v3rKVarmkdkzwOrnYDFdjAY694ILNDkmA3uRh1xXJEl+C1DAh8XCvAQ+Gh3kzubtpg== +bson@^6.10.1: + version "6.10.1" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.1.tgz#dcd04703178f5ecf5b25de04edd2a95ec79385d3" + integrity sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA== buffer-crc32@^1.0.0: version "1.0.0" @@ -11424,10 +11424,10 @@ jvent@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/jvent/-/jvent-1.0.2.tgz" -kareem@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.5.1.tgz#7b8203e11819a8e77a34b3517d3ead206764d15d" - integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== +kareem@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" + integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== keyv@^4.0.0: version "4.3.3" @@ -12203,27 +12203,27 @@ mongodb-connection-string-url@^3.0.0: "@types/whatwg-url" "^11.0.2" whatwg-url "^13.0.0" -mongodb@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.3.0.tgz#ec9993b19f7ed2ea715b903fcac6171c9d1d38ca" - integrity sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA== +mongodb@6.12.0, mongodb@~6.12.0: + version "6.12.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.12.0.tgz#8b0bda1b18cbb3f0aec8ab4119c5dc535a43c444" + integrity sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA== dependencies: - "@mongodb-js/saslprep" "^1.1.0" - bson "^6.2.0" + "@mongodb-js/saslprep" "^1.1.9" + bson "^6.10.1" mongodb-connection-string-url "^3.0.0" -mongoose@8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.1.2.tgz#f8a91da3e8c4b7489d4cbf35c20cd6908bbfcbce" - integrity sha512-5KMq7k6KmFCIB8/YMKMFsWdsdNkBwuARDRHDRpp5GKC78eT0LwHIaMEKo6gDUg3zBuMoy9OdcM/6f4dkW06C/A== +mongoose@8.9.4: + version "8.9.4" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.9.4.tgz#de93b9ec27a9384d013312e835667e540fd1dcef" + integrity sha512-DndoI01aV/q40P9DiYDXsYjhj8vZjmmuFwcC3Tro5wFznoE1z6Fe2JgMnbLR6ghglym5ziYizSfAJykp+UPZWg== dependencies: - bson "^6.2.0" - kareem "2.5.1" - mongodb "6.3.0" + bson "^6.10.1" + kareem "2.6.3" + mongodb "~6.12.0" mpath "0.9.0" mquery "5.0.0" ms "2.1.3" - sift "16.0.1" + sift "17.1.3" mpath@0.9.0: version "0.9.0" @@ -14945,12 +14945,7 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -sift@16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" - integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== - -sift@^17.1.3: +sift@17.1.3, sift@^17.1.3: version "17.1.3" resolved "https://registry.yarnpkg.com/sift/-/sift-17.1.3.tgz#9d2000d4d41586880b0079b5183d839c7a142bf7" integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ== @@ -15289,16 +15284,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15402,14 +15388,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -16782,7 +16761,7 @@ world-countries@5.0.0: resolved "https://registry.yarnpkg.com/world-countries/-/world-countries-5.0.0.tgz#6f75ebcce3d5224d84e9117eaf0d75a7726b6501" integrity sha512-wAfOT9Y5i/xnxNOdKJKXdOCw9Q3yQLahBUeuRol+s+o20F6h2a4tLEbJ1lBCYwEQ30Sf9Meqeipk1gib3YwF5w== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -16800,15 +16779,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From f22f917fb219b363b136177fcd53c4eb86cc679e Mon Sep 17 00:00:00 2001 From: Daneryl Date: Fri, 17 Jan 2025 10:12:01 +0100 Subject: [PATCH 12/69] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9e27476f02..1c1d4d5db3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uwazi", - "version": "1.195.0", + "version": "1.195.1", "description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.", "keywords": [ "react" From 584ca4778af47adabdc4f434bfb69103454fa351 Mon Sep 17 00:00:00 2001 From: Joan Gallego Girona Date: Fri, 17 Jan 2025 13:04:46 +0100 Subject: [PATCH 13/69] Revert "Update mongoose and mongodb driver (#7588)" (#7594) This reverts commit 0cce9e8bfe298fa8a1b9968b15238784b69669f4. --- app/api/auth/privateInstanceMiddleware.js | 1 + .../common.v2/database/CollectionWrapper.ts | 57 ++---------- app/api/common.v2/database/MongoDataSource.ts | 10 +-- .../database/SessionScopedCollection.ts | 9 +- .../common.v2/database/SyncedCollection.ts | 12 +-- .../database/getConnectionForCurrentTenant.ts | 18 +--- .../database/specs/MongoResultSet.spec.ts | 20 ++--- app/api/config.ts | 3 - .../database/MongoEntitiesDataSource.ts | 2 +- ...ons-for-v2-relationships-migration.spec.ts | 4 +- .../18-fix-malformed-metadata/index.js | 2 +- app/api/odm/DB.ts | 5 -- app/api/odm/MultiTenantMongooseModel.ts | 8 +- app/api/odm/model.ts | 17 +--- app/api/odm/specs/DB.spec.ts | 5 +- .../odm/specs/EntitiesUpdateLogHelper.spec.ts | 2 +- app/api/odm/specs/model_multi_tenant.spec.ts | 7 +- .../MongoRelationshipTypesDataSource.ts | 5 +- .../specs/PDFSegmentation.spec.ts | 6 +- app/api/stats/routes.ts | 6 +- .../stats/specs/RetrieveStatsService.spec.ts | 2 +- app/api/sync/syncConfig.ts | 3 +- app/api/sync/synchronizer.ts | 4 +- app/api/tenants/specs/tenantsContext.spec.ts | 3 +- app/api/tenants/specs/tenantsModel.spec.ts | 3 +- app/api/tenants/tenantsModel.ts | 10 +-- app/api/updatelogs/updatelogsModel.ts | 2 - app/api/utils/testing_db.ts | 9 +- docker-compose.yml | 1 + package.json | 4 +- yarn.lock | 90 ++++++++++++------- 31 files changed, 136 insertions(+), 194 deletions(-) diff --git a/app/api/auth/privateInstanceMiddleware.js b/app/api/auth/privateInstanceMiddleware.js index 167f80a644..fe0f898edf 100644 --- a/app/api/auth/privateInstanceMiddleware.js +++ b/app/api/auth/privateInstanceMiddleware.js @@ -18,6 +18,7 @@ export default function (req, res, next) { if (req.user || req.url.match(allowedRoutesMatch)) { return next(); } + return settings .get() .then(result => { diff --git a/app/api/common.v2/database/CollectionWrapper.ts b/app/api/common.v2/database/CollectionWrapper.ts index 56ab0b119a..0b96f0ba76 100644 --- a/app/api/common.v2/database/CollectionWrapper.ts +++ b/app/api/common.v2/database/CollectionWrapper.ts @@ -27,8 +27,6 @@ import { OrderedBulkOperation, UnorderedBulkOperation, ListSearchIndexesCursor, - IndexDescriptionCompact, - IndexDescriptionInfo, } from 'mongodb'; export abstract class CollectionWrapper { @@ -129,12 +127,20 @@ export abstract class CollectionWrapper { throw new Error('Method not implemented.'); } + async indexInformation(_options?: IndexInformationOptions | undefined): Promise { + throw new Error('Method not implemented.'); + } + async estimatedDocumentCount( _options?: EstimatedDocumentCountOptions | undefined ): Promise { throw new Error('Method not implemented.'); } + async indexes(_options?: IndexInformationOptions | undefined): Promise { + throw new Error('Method not implemented.'); + } + watch>( _pipeline?: Document[] | undefined, _options?: ChangeStreamOptions | undefined @@ -169,10 +175,6 @@ export abstract class CollectionWrapper { throw new Error('Method not implemented.'); } - get timeoutMS(): number | undefined { - throw new Error('Method not implemented.'); - } - async dropSearchIndex(): Promise { throw new Error('Method not implemented.'); } @@ -180,47 +182,4 @@ export abstract class CollectionWrapper { async updateSearchIndex(): Promise { throw new Error('Method not implemented.'); } - - async indexInformation( - options: IndexInformationOptions & { - full: true; - } - ): Promise; - - async indexInformation( - options: IndexInformationOptions & { - full?: false; - } - ): Promise; - - async indexInformation(): Promise; - - async indexInformation( - options?: IndexInformationOptions - ): Promise { - return this.collection.indexInformation({ - ...options, - full: options?.full ?? false, - }); - } - - async indexes( - options: IndexInformationOptions & { full?: true } - ): Promise; - - async indexes( - options: IndexInformationOptions & { full: false } - ): Promise; - - async indexes( - options: IndexInformationOptions - ): Promise; - - async indexes(options?: ListIndexesOptions): Promise; - - async indexes( - options?: IndexInformationOptions - ): Promise { - return this.collection.indexes(options); - } } diff --git a/app/api/common.v2/database/MongoDataSource.ts b/app/api/common.v2/database/MongoDataSource.ts index 66c29dbf47..3399d1f67b 100644 --- a/app/api/common.v2/database/MongoDataSource.ts +++ b/app/api/common.v2/database/MongoDataSource.ts @@ -4,7 +4,7 @@ import { MongoTransactionManager } from './MongoTransactionManager'; import { SessionScopedCollection } from './SessionScopedCollection'; import { SyncedCollection } from './SyncedCollection'; -export abstract class MongoDataSource { +export abstract class MongoDataSource { private db: Db; protected abstract collectionName: string; @@ -17,9 +17,9 @@ export abstract class MongoDataSource { } protected getCollection(collectionName = this.collectionName) { - return new SyncedCollection( - new SessionScopedCollection( - this.db.collection(collectionName), + return new SyncedCollection( + new SessionScopedCollection( + this.db.collection(collectionName), this.transactionManager ), this.transactionManager, @@ -45,6 +45,6 @@ export abstract class MongoDataSource { } protected createBulkStream() { - return new BulkWriteStream(this.getCollection()); + return new BulkWriteStream(this.getCollection()); } } diff --git a/app/api/common.v2/database/SessionScopedCollection.ts b/app/api/common.v2/database/SessionScopedCollection.ts index 3bf0f0173a..7c13c203aa 100644 --- a/app/api/common.v2/database/SessionScopedCollection.ts +++ b/app/api/common.v2/database/SessionScopedCollection.ts @@ -72,8 +72,8 @@ export class SessionScopedCollection } async bulkWrite( - operations: ReadonlyArray>, - options?: BulkWriteOptions + operations: AnyBulkWriteOperation[], + options?: BulkWriteOptions | undefined ): Promise { return this.collection.bulkWrite(operations, this.appendSession(options)); } @@ -130,7 +130,10 @@ export class SessionScopedCollection return this.collection.find(filter || {}, this.appendSession(options)); } - async countDocuments(filter?: Filter, options?: CountDocumentsOptions): Promise { + async countDocuments( + filter?: Document | undefined, + options?: CountDocumentsOptions | undefined + ): Promise { return this.collection.countDocuments(filter, this.appendSession(options)); } diff --git a/app/api/common.v2/database/SyncedCollection.ts b/app/api/common.v2/database/SyncedCollection.ts index 031483a7c3..ffd8f2cd5b 100644 --- a/app/api/common.v2/database/SyncedCollection.ts +++ b/app/api/common.v2/database/SyncedCollection.ts @@ -121,15 +121,17 @@ export class SyncedCollection } async bulkWrite( - operations: ReadonlyArray>, + operations: AnyBulkWriteOperation[], options?: BulkWriteOptions | undefined ): Promise { const updateConditions = operations .map((op: any) => op.updateOne?.filter || op.updateMany?.filter) .filter((op: any) => op); + const deleteConditions = operations .map((op: any) => op.deleteOne?.filter || op.deleteMany?.filter) .filter((op: any) => op); + await this.upsertSyncLogs(deleteConditions, true); const result = await this.collection.bulkWrite(operations, options); await Promise.all([ @@ -143,8 +145,8 @@ export class SyncedCollection async updateOne( filter: Filter, - update: UpdateFilter | Document[], - options?: UpdateOptions + update: UpdateFilter | Partial, + options?: UpdateOptions | undefined ): Promise> { const result = await this.collection.updateOne(filter, update, options); await this.upsertSyncLogs([filter]); @@ -202,8 +204,8 @@ export class SyncedCollection } async countDocuments( - filter?: Filter, - options?: CountDocumentsOptions + filter?: Document | undefined, + options?: CountDocumentsOptions | undefined ): Promise { return this.collection.countDocuments(filter, options); } diff --git a/app/api/common.v2/database/getConnectionForCurrentTenant.ts b/app/api/common.v2/database/getConnectionForCurrentTenant.ts index 72e763da64..e34c9781bd 100644 --- a/app/api/common.v2/database/getConnectionForCurrentTenant.ts +++ b/app/api/common.v2/database/getConnectionForCurrentTenant.ts @@ -9,25 +9,11 @@ function getTenant(): Tenant { } function getConnection(): Db { - if (config.env_feature_flags.use_mongodb_instead_of_mongoose) { - return DB.mongodb_Db(getTenant().dbName); - } - const { db } = DB.connectionForDB(getTenant().dbName); - if (!db) { - throw new Error('DB object is undefined'); - } - return db; + return DB.connectionForDB(getTenant().dbName).db; } function getSharedConnection(): Db { - if (config.env_feature_flags.use_mongodb_instead_of_mongoose) { - return DB.mongodb_Db(getTenant().dbName); - } - const { db } = DB.connectionForDB(config.SHARED_DB); - if (!db) { - throw new Error('DB object is undefined'); - } - return db; + return DB.connectionForDB(config.SHARED_DB).db; } function getClient(): MongoClient { diff --git a/app/api/common.v2/database/specs/MongoResultSet.spec.ts b/app/api/common.v2/database/specs/MongoResultSet.spec.ts index 0b4ba58d89..6335a7b0e9 100644 --- a/app/api/common.v2/database/specs/MongoResultSet.spec.ts +++ b/app/api/common.v2/database/specs/MongoResultSet.spec.ts @@ -111,9 +111,7 @@ describe('when built from a $type cursor', () => { const cursor = buildCursor(); const resultSet = new MongoResultSet(cursor!, elem => elem.name); expect(await resultSet.find(item => item.startsWith('doc2'))).toBe('doc2'); - //Due to a mongodb driver bug this is failing but its not affecting us for now, - //im leaving this as false so we know in case it gets fixed - expect(cursor?.closed).toBe(false); + expect(cursor?.closed).toBe(true); }); it('should return null if no item matches the query', async () => { @@ -136,9 +134,7 @@ describe('when built from a $type cursor', () => { const cursor = buildCursor(); const resultSet = new MongoResultSet(cursor!, elem => elem.name); expect(await resultSet.every(item => item.startsWith('doc1'))).toBe(false); - //Due to a mongodb driver bug this is failing but its not affecting us for now, - //im leaving this as false so we know in case it gets fixed - expect(cursor?.closed).toBe(false); + expect(cursor?.closed).toBe(true); }); it('should return true if there are no items', async () => { @@ -154,9 +150,7 @@ describe('when built from a $type cursor', () => { const cursor = buildCursor(); const resultSet = new MongoResultSet(cursor!, elem => elem.name); expect(await resultSet.some(item => item === 'doc3')).toBe(true); - //Due to a mongodb driver bug this is failing but its not affecting us for now, - //im leaving this as false so we know in case it gets fixed - expect(cursor?.closed).toBe(false); + expect(cursor?.closed).toBe(true); }); it('should return false if it is false for every item', async () => { @@ -225,9 +219,7 @@ describe('when built from a $type cursor', () => { } }); expect(visited).toEqual(['doc1', 'doc2']); - //Due to a mongodb driver bug this is failing but its not affecting us for now, - //im leaving this as false so we know in case it gets fixed - expect(cursor?.closed).toBe(false); + expect(cursor?.closed).toBe(true); }); }); @@ -280,9 +272,7 @@ describe('when built from a $type cursor', () => { ['doc1', 'doc2'], ['doc3', 'doc4'], ]); - //Due to a mongodb driver bug this is failing but its not affecting us for now, - //im leaving this as false so we know in case it gets fixed - expect(cursor?.closed).toBe(false); + expect(cursor?.closed).toBe(true); }); }); diff --git a/app/api/config.ts b/app/api/config.ts index ef7bb655d6..4131b97a7a 100644 --- a/app/api/config.ts +++ b/app/api/config.ts @@ -93,7 +93,4 @@ export const config = { }, githubToken: process.env.GITHUB_TOKEN || '', queueName: QUEUE_NAME || 'uwazi_jobs', - env_feature_flags: { - use_mongodb_instead_of_mongoose: process.env.MONGO_NOT_MONGOOSE || false, - }, }; diff --git a/app/api/entities.v2/database/MongoEntitiesDataSource.ts b/app/api/entities.v2/database/MongoEntitiesDataSource.ts index e580f99bd9..7dea6751b4 100644 --- a/app/api/entities.v2/database/MongoEntitiesDataSource.ts +++ b/app/api/entities.v2/database/MongoEntitiesDataSource.ts @@ -5,7 +5,6 @@ import { MongoResultSet } from 'api/common.v2/database/MongoResultSet'; import { MongoTransactionManager } from 'api/common.v2/database/MongoTransactionManager'; import entities from 'api/entities/entities'; import v1EntitiesModel from 'api/entities/entitiesModel'; -import { search } from 'api/search'; import { MongoSettingsDataSource } from 'api/settings.v2/database/MongoSettingsDataSource'; import { MongoTemplatesDataSource } from 'api/templates.v2/database/MongoTemplatesDataSource'; import { Db } from 'mongodb'; @@ -14,6 +13,7 @@ import { EntitiesDataSource } from '../contracts/EntitiesDataSource'; import { Entity, EntityMetadata, MetadataValue } from '../model/Entity'; import { EntityMappers } from './EntityMapper'; import { EntityDBO, EntityJoinTemplate } from './schemas/EntityTypes'; +import { search } from 'api/search'; export class MongoEntitiesDataSource extends MongoDataSource diff --git a/app/api/migrations/migrations/141-add-collections-for-v2-relationships-migration/specs/141-add-collections-for-v2-relationships-migration.spec.ts b/app/api/migrations/migrations/141-add-collections-for-v2-relationships-migration/specs/141-add-collections-for-v2-relationships-migration.spec.ts index d26a0c9f7b..4841b8b340 100644 --- a/app/api/migrations/migrations/141-add-collections-for-v2-relationships-migration/specs/141-add-collections-for-v2-relationships-migration.spec.ts +++ b/app/api/migrations/migrations/141-add-collections-for-v2-relationships-migration/specs/141-add-collections-for-v2-relationships-migration.spec.ts @@ -55,12 +55,12 @@ describe('migration add collections for v2 relationships migration', () => { }); it('should set unique index on the migration fields', async () => { - const relCollection = db.collection('relationshipMigrationFields'); + const relCollection = await db.collection('relationshipMigrationFields'); const indexInfo = await relCollection.indexInformation({ full: true }); const uniqueIndex = indexInfo.find( (index: any) => index.name === 'sourceTemplate_1_relationType_1_targetTemplate_1' ); - expect(uniqueIndex?.unique).toBe(true); + expect(uniqueIndex.unique).toBe(true); }); it('should check if a reindex is needed', async () => { diff --git a/app/api/migrations/migrations/18-fix-malformed-metadata/index.js b/app/api/migrations/migrations/18-fix-malformed-metadata/index.js index 9f91d31d71..1237854c83 100644 --- a/app/api/migrations/migrations/18-fix-malformed-metadata/index.js +++ b/app/api/migrations/migrations/18-fix-malformed-metadata/index.js @@ -24,7 +24,7 @@ const findLabel = (value, propertyData, thesauriById, translation) => { [] ); - const thesaurusElement = flattenedValues.find(v => v.id.toString() === value.toString()); + const thesaurusElement = flattenedValues.find(v => v.id === value.toString()); if (thesaurusElement) { const context = translation.contexts.find( ctx => ctx.id.toString() === propertyData.content.toString() diff --git a/app/api/odm/DB.ts b/app/api/odm/DB.ts index 4a1c50a2c0..948ceee3cb 100644 --- a/app/api/odm/DB.ts +++ b/app/api/odm/DB.ts @@ -1,6 +1,5 @@ import mongoose, { Connection, ConnectOptions } from 'mongoose'; import { config } from 'api/config'; -import { DbOptions } from 'mongodb'; let connection: Connection; @@ -26,10 +25,6 @@ const DB = { return this.getConnection().useDb(dbName, options); }, - mongodb_Db(dbName: string, options?: DbOptions) { - return this.getConnection().getClient().db(dbName, options); - }, - getConnection() { return connection; }, diff --git a/app/api/odm/MultiTenantMongooseModel.ts b/app/api/odm/MultiTenantMongooseModel.ts index 99862a4d99..1da4ebc474 100644 --- a/app/api/odm/MultiTenantMongooseModel.ts +++ b/app/api/odm/MultiTenantMongooseModel.ts @@ -1,5 +1,5 @@ import { BulkWriteOptions } from 'mongodb'; -import mongoose, { ProjectionType, Schema } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; import { DataType, UwaziFilterQuery, @@ -36,11 +36,7 @@ class MultiTenantMongooseModel { return this.dbForCurrentTenant().findById(id, select, { lean: true }); } - find( - query: UwaziFilterQuery>, - select: ProjectionType> = {}, - options = {} - ) { + find(query: UwaziFilterQuery>, select = '', options = {}) { return this.dbForCurrentTenant().find(query, select, options); } diff --git a/app/api/odm/model.ts b/app/api/odm/model.ts index 0c9a22096e..26ace86cad 100644 --- a/app/api/odm/model.ts +++ b/app/api/odm/model.ts @@ -153,21 +153,10 @@ export class OdmModel implements SyncDBDataSource { }); const existingIds = new Set( ( - await this.db.find( - { _id: { $in: ids } }, - { _id: 1 }, - { - lean: true, - } - ) - ) - .map(d => { - if (d._id) { - return d._id.toString(); - } - return null; + await this.db.find({ _id: { $in: ids } } as UwaziFilterQuery>, '_id', { + lean: true, }) - .filter((id): id is string => typeof id === 'string') + ).map(d => d._id.toString()) ); const existingData = dataArray.filter(d => d._id && existingIds.has(d._id.toString())); diff --git a/app/api/odm/specs/DB.spec.ts b/app/api/odm/specs/DB.spec.ts index 85b78f9a22..85ac82fd1d 100644 --- a/app/api/odm/specs/DB.spec.ts +++ b/app/api/odm/specs/DB.spec.ts @@ -7,7 +7,6 @@ import { testingTenants } from 'api/utils/testingTenants'; import { config } from 'api/config'; import { DB } from '../DB'; import { instanceModel } from '../model'; -import testingDB from 'api/utils/testing_db'; const testSchema = new mongoose.Schema({ name: { type: String, index: true }, @@ -28,8 +27,8 @@ describe('DB', () => { beforeEach(async () => { const uri = config.DBHOST; await DB.connect(`${uri}_DB_spec_ts`); - db1 = testingDB.db('db1'); - db2 = testingDB.db('db2'); + db1 = DB.getConnection().useDb('db1').db; + db2 = DB.getConnection().useDb('db2').db; }); afterAll(async () => { diff --git a/app/api/odm/specs/EntitiesUpdateLogHelper.spec.ts b/app/api/odm/specs/EntitiesUpdateLogHelper.spec.ts index c7f1945334..0cfd6e04f1 100644 --- a/app/api/odm/specs/EntitiesUpdateLogHelper.spec.ts +++ b/app/api/odm/specs/EntitiesUpdateLogHelper.spec.ts @@ -51,7 +51,7 @@ describe('EntitiesUpdateLogHelper', () => { fixtureFactory.id('files-thumbnail1'), fixtureFactory.id('files-document1'), ].forEach(id => { - const original = fixtures.updatelogs.find(log => log._id!.toString() === id.toString()); + const original = fixtures.updatelogs.find(log => log._id.toString() === id.toString()); const current = logs.find(log => log._id.toString() === id.toString()); expect(current!.timestamp).toBeGreaterThan(original!.timestamp! as number); diff --git a/app/api/odm/specs/model_multi_tenant.spec.ts b/app/api/odm/specs/model_multi_tenant.spec.ts index e3c9c36543..c6234e4139 100644 --- a/app/api/odm/specs/model_multi_tenant.spec.ts +++ b/app/api/odm/specs/model_multi_tenant.spec.ts @@ -5,6 +5,7 @@ import { config } from 'api/config'; import { testingTenants } from 'api/utils/testingTenants'; import { instanceModel } from 'api/odm'; import testingDB from 'api/utils/testing_db'; +import { DB } from '../DB'; const testSchema = new mongoose.Schema({ name: String, @@ -22,9 +23,9 @@ describe('ODM Model multi-tenant', () => { beforeAll(async () => { await testingDB.connect({ defaultTenant: false }); - defaultDB = testingDB.db(config.defaultTenant.dbName); - db1 = testingDB.db('db1'); - db2 = testingDB.db('db2'); + defaultDB = DB.connectionForDB(config.defaultTenant.dbName).db; + db1 = DB.connectionForDB('db1').db; + db2 = DB.connectionForDB('db2').db; }); beforeEach(async () => { diff --git a/app/api/relationshiptypes.v2/database/MongoRelationshipTypesDataSource.ts b/app/api/relationshiptypes.v2/database/MongoRelationshipTypesDataSource.ts index d7e59df44f..115b504e50 100644 --- a/app/api/relationshiptypes.v2/database/MongoRelationshipTypesDataSource.ts +++ b/app/api/relationshiptypes.v2/database/MongoRelationshipTypesDataSource.ts @@ -7,9 +7,8 @@ import { mapRelationshipTypeToApp } from './mappings/RelationshipTypeMappers'; import { RelationshipType } from '../model/RelationshipType'; export class MongoRelationshipTypesDataSource - extends MongoDataSource - implements RelationshipTypesDataSource -{ + extends MongoDataSource + implements RelationshipTypesDataSource { // eslint-disable-line protected collectionName = 'relationtypes'; async typesExist(ids: string[]): Promise { diff --git a/app/api/services/pdfsegmentation/specs/PDFSegmentation.spec.ts b/app/api/services/pdfsegmentation/specs/PDFSegmentation.spec.ts index 623b783a3c..745b7dd882 100644 --- a/app/api/services/pdfsegmentation/specs/PDFSegmentation.spec.ts +++ b/app/api/services/pdfsegmentation/specs/PDFSegmentation.spec.ts @@ -1,7 +1,7 @@ /* eslint-disable camelcase */ /* eslint-disable max-lines */ -import testingDB, { fixturer } from 'api/utils/testing_db'; +import { fixturer } from 'api/utils/testing_db'; import { fixturesOneFile, fixturesOtherFile, @@ -79,8 +79,8 @@ describe('PDFSegmentation', () => { beforeEach(async () => { segmentPdfs = new PDFSegmentation(); - dbOne = testingDB.db(tenantOne.dbName); - dbTwo = testingDB.db(tenantTwo.dbName); + dbOne = DB.connectionForDB(tenantOne.dbName).db; + dbTwo = DB.connectionForDB(tenantTwo.dbName).db; tenants.tenants = { tenantOne }; fileA = await fs.readFile(`app/api/services/pdfsegmentation/specs/uploads/${fixturesPdfNameA}`); diff --git a/app/api/stats/routes.ts b/app/api/stats/routes.ts index 3d1a081a20..4f2f9695ce 100644 --- a/app/api/stats/routes.ts +++ b/app/api/stats/routes.ts @@ -1,11 +1,13 @@ import { Application } from 'express'; import needsAuthorization from 'api/auth/authMiddleware'; import { RetrieveStatsService } from 'api/stats/services/RetrieveStatsService'; -import { getConnection } from 'api/common.v2/database/getConnectionForCurrentTenant'; +import { tenants } from 'api/tenants'; +import { DB } from 'api/odm'; export default (app: Application) => { app.get('/api/stats', needsAuthorization(['admin']), async (_req, res, _next) => { - const action = new RetrieveStatsService(getConnection()); + const { db } = DB.connectionForDB(tenants.current().dbName); + const action = new RetrieveStatsService(db); const stats = await action.execute(); res.json(stats); diff --git a/app/api/stats/specs/RetrieveStatsService.spec.ts b/app/api/stats/specs/RetrieveStatsService.spec.ts index ec3f166894..8036b8c6b1 100644 --- a/app/api/stats/specs/RetrieveStatsService.spec.ts +++ b/app/api/stats/specs/RetrieveStatsService.spec.ts @@ -10,7 +10,7 @@ describe('RetrieveStats', () => { let db: Db; beforeAll(async () => { - db = (await testingDB.connect()).db as Db; + db = (await testingDB.connect()).db; }); beforeEach(async () => { diff --git a/app/api/sync/syncConfig.ts b/app/api/sync/syncConfig.ts index 15e9f367fc..aec4e60baa 100644 --- a/app/api/sync/syncConfig.ts +++ b/app/api/sync/syncConfig.ts @@ -1,3 +1,4 @@ +import { DataType } from 'api/odm'; import { SyncConfig } from 'api/sync/syncWorker'; import templatesModel from 'api/templates/templatesModel'; import { model as updateLog, UpdateLog } from 'api/updatelogs'; @@ -162,7 +163,7 @@ export const createSyncConfig = async ( return changes; }, - async shouldSync(change: UpdateLog) { + async shouldSync(change: DataType) { if (change.deleted) return { skip: true }; const templatesConfig = this.config.templates || {}; diff --git a/app/api/sync/synchronizer.ts b/app/api/sync/synchronizer.ts index da71ac9e3c..f7c7552fae 100644 --- a/app/api/sync/synchronizer.ts +++ b/app/api/sync/synchronizer.ts @@ -22,7 +22,7 @@ const uploadFile = async ( }; export const synchronizer = { - async syncDelete(change: UpdateLog, url: string, cookie: string) { + async syncDelete(change: DataType, url: string, cookie: string) { await this.syncData( { url, @@ -40,7 +40,7 @@ export const synchronizer = { change, data, cookie, - }: { url: string; change: UpdateLog; data: DataType; cookie: string }, + }: { url: string; change: DataType; data: DataType; cookie: string }, action: keyof typeof request ) { await request[action]( diff --git a/app/api/tenants/specs/tenantsContext.spec.ts b/app/api/tenants/specs/tenantsContext.spec.ts index 68610c1fee..5378623a4d 100644 --- a/app/api/tenants/specs/tenantsContext.spec.ts +++ b/app/api/tenants/specs/tenantsContext.spec.ts @@ -1,3 +1,4 @@ +import { DB } from 'api/odm/DB'; import { Db } from 'mongodb'; import testingDB from 'api/utils/testing_db'; import { testingEnvironment } from 'api/utils/testingEnvironment'; @@ -25,7 +26,7 @@ describe('tenantsContext', () => { beforeAll(async () => { await testingDB.connect(); testingEnvironment.setRequestId(); - db = testingDB.db(config.SHARED_DB); + db = DB.connectionForDB(config.SHARED_DB).db; await db.collection('tenants').deleteMany({}); await db.collection('tenants').insertMany([ diff --git a/app/api/tenants/specs/tenantsModel.spec.ts b/app/api/tenants/specs/tenantsModel.spec.ts index 84d94ee36b..5d5c057ae7 100644 --- a/app/api/tenants/specs/tenantsModel.spec.ts +++ b/app/api/tenants/specs/tenantsModel.spec.ts @@ -1,4 +1,5 @@ import { config } from 'api/config'; +import { DB } from 'api/odm/DB'; import { Db, ObjectId } from 'mongodb'; import { Model } from 'mongoose'; import waitForExpect from 'wait-for-expect'; @@ -16,7 +17,7 @@ describe('tenantsModel', () => { beforeAll(async () => { await testingDB.connect(); testingEnvironment.setRequestId(); - db = testingDB.db(config.SHARED_DB); + db = DB.connectionForDB(config.SHARED_DB).db; }); beforeEach(async () => { diff --git a/app/api/tenants/tenantsModel.ts b/app/api/tenants/tenantsModel.ts index ea5d228bb6..f8929762b2 100644 --- a/app/api/tenants/tenantsModel.ts +++ b/app/api/tenants/tenantsModel.ts @@ -76,19 +76,15 @@ class TenantsModel extends EventEmitter { } async initialize() { - const { db } = this.tenantsDB; - if (!db) { - throw new Error('Tenants db is undefined'); - } - const collections = (await db.listCollections().toArray()).map(c => c.name); + const collections = (await this.tenantsDB.db.listCollections().toArray()).map(c => c.name); if (collections.includes(this.collectionName)) { - await db.command({ + await this.tenantsDB.db.command({ collMod: this.collectionName, validator: schemaValidator, }); } else { - await db.createCollection(this.collectionName, { + await this.tenantsDB.db.createCollection(this.collectionName, { validator: schemaValidator, }); } diff --git a/app/api/updatelogs/updatelogsModel.ts b/app/api/updatelogs/updatelogsModel.ts index a11a5e117a..29c579b2ef 100644 --- a/app/api/updatelogs/updatelogsModel.ts +++ b/app/api/updatelogs/updatelogsModel.ts @@ -1,7 +1,6 @@ import mongoose from 'mongoose'; import { MultiTenantMongooseModel } from 'api/odm/MultiTenantMongooseModel'; import { ObjectIdSchema } from 'shared/types/commonTypes'; -import { ObjectId } from 'mongodb'; const updateLogSchema = new mongoose.Schema({ timestamp: { type: Number, index: true }, @@ -12,7 +11,6 @@ const updateLogSchema = new mongoose.Schema({ updateLogSchema.index({ namespace: 1, timestamp: 1 }); export interface UpdateLog extends mongoose.Document { - _id: ObjectId; timestamp: number; namespace: string; mongoId: ObjectIdSchema; diff --git a/app/api/utils/testing_db.ts b/app/api/utils/testing_db.ts index 43c814e49c..cfe6e55020 100644 --- a/app/api/utils/testing_db.ts +++ b/app/api/utils/testing_db.ts @@ -81,7 +81,6 @@ const testingDB: { mongodb: Db | null; dbName: string; UserInContextMockFactory: UserInContextMockFactory; - db: (dbName: string) => Db; connect: (options?: { defaultTenant: boolean } | undefined) => Promise; disconnect: () => Promise; tearDown: () => Promise; @@ -109,7 +108,7 @@ const testingDB: { .basename(expect.getState().testPath || '') .replace(/[.-]/g, '_')}`.substring(0, 63); await initMongoServer(this.dbName); - mongodb = this.db(this.dbName); + mongodb = mongooseConnection.db; this.mongodb = mongodb; if (options.defaultTenant) { @@ -125,10 +124,6 @@ const testingDB: { return mongooseConnection; }, - db(dbName: string) { - return DB.mongodb_Db(dbName); - }, - async tearDown() { await this.disconnect(); }, @@ -153,7 +148,7 @@ const testingDB: { await this.connect(); let optionalMongo: Db | null = null; if (dbName) { - optionalMongo = DB.connectionForDB(dbName).getClient().db(dbName); + optionalMongo = DB.connectionForDB(dbName).db; } await fixturer.clearAllAndLoad(optionalMongo || mongodb, fixtures); await this.createIndices(); diff --git a/docker-compose.yml b/docker-compose.yml index 3d77ee5311..268bf3289c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,4 @@ +version: '3' services: elasticsearch: build: diff --git a/package.json b/package.json index 1c1d4d5db3..ac8398eedd 100644 --- a/package.json +++ b/package.json @@ -175,8 +175,8 @@ "moment-timezone": "0.5.46", "monaco-editor": "0.50.0", "monaco-editor-webpack-plugin": "^7.1.0", - "mongodb": "6.12.0", - "mongoose": "8.9.4", + "mongodb": "6.3.0", + "mongoose": "8.1.2", "multer": "^1.4.5-lts.1", "node-uuid": "^1.4.7", "nodemailer": "6.9.16", diff --git a/yarn.lock b/yarn.lock index 8d6852daa7..a9c2c490f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2823,10 +2823,10 @@ dependencies: "@types/mdx" "^2.0.0" -"@mongodb-js/saslprep@^1.1.9": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz#e974bab8eca9faa88677d4ea4da8d09a52069004" - integrity sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw== +"@mongodb-js/saslprep@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz#022fa36620a7287d17acd05c4aae1e5f390d250d" + integrity sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw== dependencies: sparse-bitfield "^3.0.3" @@ -6098,10 +6098,10 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" -bson@^6.10.1: - version "6.10.1" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.1.tgz#dcd04703178f5ecf5b25de04edd2a95ec79385d3" - integrity sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA== +bson@^6.2.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.5.0.tgz#fc4828d065e64e48ea442b1a23099b2e52f7ff0b" + integrity sha512-DXf1BTAS8vKyR90BO4x5v3rKVarmkdkzwOrnYDFdjAY694ILNDkmA3uRh1xXJEl+C1DAh8XCvAQ+Gh3kzubtpg== buffer-crc32@^1.0.0: version "1.0.0" @@ -11424,10 +11424,10 @@ jvent@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/jvent/-/jvent-1.0.2.tgz" -kareem@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" - integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== +kareem@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.5.1.tgz#7b8203e11819a8e77a34b3517d3ead206764d15d" + integrity sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA== keyv@^4.0.0: version "4.3.3" @@ -12203,27 +12203,27 @@ mongodb-connection-string-url@^3.0.0: "@types/whatwg-url" "^11.0.2" whatwg-url "^13.0.0" -mongodb@6.12.0, mongodb@~6.12.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.12.0.tgz#8b0bda1b18cbb3f0aec8ab4119c5dc535a43c444" - integrity sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA== +mongodb@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.3.0.tgz#ec9993b19f7ed2ea715b903fcac6171c9d1d38ca" + integrity sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA== dependencies: - "@mongodb-js/saslprep" "^1.1.9" - bson "^6.10.1" + "@mongodb-js/saslprep" "^1.1.0" + bson "^6.2.0" mongodb-connection-string-url "^3.0.0" -mongoose@8.9.4: - version "8.9.4" - resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.9.4.tgz#de93b9ec27a9384d013312e835667e540fd1dcef" - integrity sha512-DndoI01aV/q40P9DiYDXsYjhj8vZjmmuFwcC3Tro5wFznoE1z6Fe2JgMnbLR6ghglym5ziYizSfAJykp+UPZWg== +mongoose@8.1.2: + version "8.1.2" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.1.2.tgz#f8a91da3e8c4b7489d4cbf35c20cd6908bbfcbce" + integrity sha512-5KMq7k6KmFCIB8/YMKMFsWdsdNkBwuARDRHDRpp5GKC78eT0LwHIaMEKo6gDUg3zBuMoy9OdcM/6f4dkW06C/A== dependencies: - bson "^6.10.1" - kareem "2.6.3" - mongodb "~6.12.0" + bson "^6.2.0" + kareem "2.5.1" + mongodb "6.3.0" mpath "0.9.0" mquery "5.0.0" ms "2.1.3" - sift "17.1.3" + sift "16.0.1" mpath@0.9.0: version "0.9.0" @@ -14945,7 +14945,12 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -sift@17.1.3, sift@^17.1.3: +sift@16.0.1: + version "16.0.1" + resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.1.tgz#e9c2ccc72191585008cf3e36fc447b2d2633a053" + integrity sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ== + +sift@^17.1.3: version "17.1.3" resolved "https://registry.yarnpkg.com/sift/-/sift-17.1.3.tgz#9d2000d4d41586880b0079b5183d839c7a142bf7" integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ== @@ -15284,7 +15289,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15388,7 +15402,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -16761,7 +16782,7 @@ world-countries@5.0.0: resolved "https://registry.yarnpkg.com/world-countries/-/world-countries-5.0.0.tgz#6f75ebcce3d5224d84e9117eaf0d75a7726b6501" integrity sha512-wAfOT9Y5i/xnxNOdKJKXdOCw9Q3yQLahBUeuRol+s+o20F6h2a4tLEbJ1lBCYwEQ30Sf9Meqeipk1gib3YwF5w== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -16779,6 +16800,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From daadba1a22a84dd1770cd40fdd8f2a1563b6a638 Mon Sep 17 00:00:00 2001 From: Daneryl Date: Fri, 17 Jan 2025 13:04:52 +0100 Subject: [PATCH 14/69] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac8398eedd..46c196c8d1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uwazi", - "version": "1.195.1", + "version": "1.195.2", "description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.", "keywords": [ "react" From 8281897bed86ffcb04c783135ddc84bfe4da9caf Mon Sep 17 00:00:00 2001 From: Santiago <71732018+Zasa-san@users.noreply.github.com> Date: Fri, 17 Jan 2025 13:11:51 -0300 Subject: [PATCH 15/69] remove component (#7596) --- app/react/Charts/components/LibraryChart.js | 88 ------ app/react/Charts/components/LibraryCharts.js | 131 --------- .../components/specs/LibraryChart.spec.js | 114 -------- .../components/specs/LibraryCharts.spec.js | 273 ------------------ app/react/Charts/index.js | 14 +- app/react/Markdown/utils.js | 2 - 6 files changed, 1 insertion(+), 621 deletions(-) delete mode 100644 app/react/Charts/components/LibraryChart.js delete mode 100644 app/react/Charts/components/LibraryCharts.js delete mode 100644 app/react/Charts/components/specs/LibraryChart.spec.js delete mode 100644 app/react/Charts/components/specs/LibraryCharts.spec.js diff --git a/app/react/Charts/components/LibraryChart.js b/app/react/Charts/components/LibraryChart.js deleted file mode 100644 index 0e2d840b38..0000000000 --- a/app/react/Charts/components/LibraryChart.js +++ /dev/null @@ -1,88 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { t } from 'app/I18N'; - -import { Pie, Bar } from 'app/Charts'; - -export class LibraryChartComponent extends Component { - constructor(props) { - super(props); - this.state = { type: 'pie' }; - this.maxPieItems = 14; - this.assignType = this.assignType.bind(this); - this.typeButton = this.typeButton.bind(this); - } - - assignType(type) { - return () => { - this.setState({ type }); - }; - } - - clusterResults(options) { - return options.reduce((_clusteredResults, option, optionIndex) => { - const clusteredResults = _clusteredResults; - if (optionIndex < this.maxPieItems) { - clusteredResults.push(option); - } - - if (optionIndex === this.maxPieItems) { - clusteredResults.push({ label: t('System', 'Other'), results: option.results }); - } - - if (optionIndex > this.maxPieItems) { - clusteredResults[clusteredResults.length - 1].results += option.results; - } - - return clusteredResults; - }, []); - } - - typeButton(type) { - const className = `btn btn-sm ${this.state.type === type ? 'btn-success' : 'btn-default'}`; - return ( - - ); - } - - render() { - if (!this.props.options) { - return null; - } - - const chart = - this.state.type === 'pie' ? ( - - ) : ( - - ); - - return ( -
-
-
- {this.typeButton('pie')} - {this.typeButton('bar')} -
-

{this.props.label}

- {chart} -
-
- ); - } -} - -LibraryChartComponent.defaultProps = { - options: [], - label: null, -}; - -LibraryChartComponent.propTypes = { - options: PropTypes.arrayOf(PropTypes.object), - label: PropTypes.string, -}; - -export default connect()(LibraryChartComponent); diff --git a/app/react/Charts/components/LibraryCharts.js b/app/react/Charts/components/LibraryCharts.js deleted file mode 100644 index aed6b37e57..0000000000 --- a/app/react/Charts/components/LibraryCharts.js +++ /dev/null @@ -1,131 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import { t } from 'app/I18N'; - -import { parseWithAggregations } from 'app/Library/helpers/libraryFilters'; - -import { LibraryChart } from 'app/Charts'; -import arrayUtils from '../utils/arrayUtils'; - -function translateOptions(_property) { - const property = _property; - property.options = property.options.map(_option => { - const option = _option; - option.label = t(property.content, option.label, null, false); - return option; - }); - return property; -} - -function sortFields(_field) { - const field = _field; - field.options = arrayUtils.sortValues(field.options); - return field; -} - -export class LibraryCharts extends Component { - itemResults(item) { - const { aggregations } = this; - const buckets = - aggregations.all && aggregations.all.types ? aggregations.all.types.buckets : []; - const found = buckets.find(agg => agg.key === item.id); - - if (found) { - return found.filtered.doc_count; - } - - if (item.items) { - return item.items.reduce((result, _item) => result + this.itemResults(_item), 0); - } - - return 0; - } - - conformDocumentTypesToFields() { - let items = this.props.collection.toJS().filters || []; - - if (!items.length || this.props.storeKey === 'uploads') { - items = this.props.templates.toJS().map(tpl => ({ id: tpl._id, name: tpl.name })); - } - - if (this.props.storeKey === 'uploads') { - items.unshift({ id: 'missing', name: t('System', 'No type') }); - } - - const fields = [ - { - options: items.map(item => ({ - label: t(item.id, item.name), - results: this.itemResults(item), - })), - label: t('System', 'Document and entity types'), - }, - ]; - - return fields; - } - - render() { - let fields = []; - - if (this.props.aggregations) { - this.aggregations = this.props.aggregations.toJS(); - - if (this.props.fields.size) { - fields = parseWithAggregations(this.props.fields.toJS(), this.aggregations) - .filter( - field => - (field.type === 'select' || field.type === 'multiselect') && - field.options && - field.options.length - ) - .map(translateOptions) - .map(sortFields); - } - - fields = fields.length ? fields : this.conformDocumentTypesToFields(); - } - - return ( -
-
-
- {fields.map((field, index) => ( - - ))} -
-
-
- ); - } -} - -LibraryCharts.propTypes = { - aggregations: PropTypes.object, - fields: PropTypes.object, - collection: PropTypes.object, - templates: PropTypes.object, - storeKey: PropTypes.string, - translationContext: PropTypes.string, -}; - -export function mapStateToProps(state, props) { - const documentTypesExist = props.storeKey && state[props.storeKey].filters.get('documentTypes'); - - return { - aggregations: props.storeKey ? state[props.storeKey].aggregations : null, - fields: props.storeKey ? state[props.storeKey].filters.get('properties') : null, - collection: state.settings.collection, - templates: state.templates, - translationContext: documentTypesExist - ? state[props.storeKey].filters.getIn(['documentTypes', 0]) - : null, - }; -} - -export default connect(mapStateToProps)(LibraryCharts); diff --git a/app/react/Charts/components/specs/LibraryChart.spec.js b/app/react/Charts/components/specs/LibraryChart.spec.js deleted file mode 100644 index 4ea84f1a43..0000000000 --- a/app/react/Charts/components/specs/LibraryChart.spec.js +++ /dev/null @@ -1,114 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; -import { Pie, Bar } from 'app/Charts'; -import { LibraryChartComponent } from '../LibraryChart'; - -describe('LibraryChart', () => { - let component; - let instance; - let props; - - const render = () => { - component = shallow(); - instance = component.instance(); - }; - - describe('render()', () => { - beforeEach(() => { - props = { - options: [], - label: 'chartLabel', - }; - }); - - it('should include label', () => { - render(); - expect(component.find('p').text()).toBe('chartLabel'); - }); - - describe('type toggle buttons', () => { - it('should switch between Pie and Bar', () => { - render(); - const toPieButton = component.find('button').at(0); - const toBarButton = component.find('button').at(1); - - expect(instance.state.type).toBe('pie'); - - toBarButton.simulate('click'); - expect(instance.state.type).toBe('bar'); - - toPieButton.simulate('click'); - expect(instance.state.type).toBe('pie'); - }); - }); - - it('should render a Pie by default', () => { - render(); - expect(component.find(Pie).length).toBe(1); - expect(component.find(Bar).length).toBe(0); - - expect(component.find(Pie).props().data).toEqual(props.options); - }); - - it('should render a Bar if set in type', () => { - render(); - component.setState({ type: 'chart' }); - - expect(component.find(Pie).length).toBe(0); - expect(component.find(Bar).length).toBe(1); - - expect(component.find(Bar).props().data).toEqual(props.options); - expect(component.find(Bar).props().chartLabel).toEqual('chartLabel'); - }); - - describe('result clustering', () => { - beforeEach(() => { - props.options = [ - { label: 'a', results: 1 }, - { label: 'b', results: 1 }, - { label: 'c', results: 3 }, - { label: 'd', results: 1 }, - { label: 'e', results: 1 }, - { label: 'f', results: 7 }, - { label: 'g', results: 1 }, - { label: 'h', results: 1 }, - { label: 'i', results: 1 }, - { label: 'j', results: 1 }, - { label: 'k', results: 1 }, - { label: 'l', results: 1 }, - { label: 'm', results: 1 }, - { label: 'n', results: 1 }, - { label: 'o', results: 1 }, - { label: 'p', results: 1 }, - { label: 'q', results: 1 }, - { label: 'r', results: 2 }, - { label: 's', results: 3 }, - ]; - }); - - it('should cluster the options for the Pie chart', () => { - render(); - - expect(component.find(Pie).props().data).not.toEqual(props.options); - expect(component.find(Pie).props().data[0]).toEqual(props.options[0]); - expect(component.find(Pie).props().data[2]).toEqual(props.options[2]); - expect(component.find(Pie).props().data[5]).toEqual(props.options[5]); - expect(component.find(Pie).props().data[instance.maxPieItems]).toEqual({ - label: 'Other', - results: 8, - }); - }); - - it('should not cluster the options for the Bar chart', () => { - render(); - component.setState({ type: 'chart' }); - - expect(component.find(Bar).props().data).toEqual(props.options); - expect(component.find(Bar).props().data[instance.maxPieItems]).not.toEqual({ - label: 'Other', - results: 8, - }); - }); - }); - }); -}); diff --git a/app/react/Charts/components/specs/LibraryCharts.spec.js b/app/react/Charts/components/specs/LibraryCharts.spec.js deleted file mode 100644 index 6b469b20f4..0000000000 --- a/app/react/Charts/components/specs/LibraryCharts.spec.js +++ /dev/null @@ -1,273 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; -import { fromJS } from 'immutable'; -import { store } from 'app/store'; -import { t } from 'app/I18N'; - -import { LibraryCharts, mapStateToProps } from '../LibraryCharts'; -import LibraryChart from '../LibraryChart'; - -describe('LibraryCharts', () => { - let component; - let props; - let state; - - const render = () => { - component = shallow(); - }; - - beforeEach(() => { - t.resetCachedTranslation(); - state = { - locale: 'es', - translations: fromJS([ - { - locale: 'es', - contexts: [ - { - id: 'tcontext', - values: { 'Document and entity types': 'Document and entity types translated' }, - }, - { - id: 't2', - values: { t2name: 't2nameTranslated' }, - }, - { - id: 'cid', - values: { n: 'nTranslated' }, - }, - ], - }, - ]), - }; - - spyOn(store, 'getState').and.returnValue(state); - }); - - describe('When no fields found', () => { - beforeEach(() => { - props = { - aggregations: fromJS({ - all: { - types: { - buckets: [ - { key: 't1', label: 't1', filtered: { doc_count: 5 } }, // eslint-disable-line camelcase - { key: 't2', label: 't2', filtered: { doc_count: 1 } }, // eslint-disable-line camelcase - { key: 't3', label: 't3', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - { key: 'missing', label: 'No value', filtered: { doc_count: 13 } }, // eslint-disable-line camelcase - ], - }, - }, - }), - fields: fromJS([]), - collection: fromJS({ filters: [] }), - templates: fromJS([ - { _id: 't1', name: 't1name' }, - { _id: 't2', name: 't2name' }, - { _id: 't3', name: 't3name' }, - ]), - translationContext: 'tcontext', - }; - }); - - it('should render templates types on LibraryChart', () => { - render(); - expect(component.find(LibraryChart).length).toBe(1); - const LibraryChartElement = component.find(LibraryChart); - - expect(LibraryChartElement.props().label).toBe('Document and entity types translated'); - expect(LibraryChartElement.props().options[0]).toEqual({ label: 't1name', results: 5 }); - expect(LibraryChartElement.props().options[1]).toEqual({ - label: 't2nameTranslated', - results: 1, - }); - expect(LibraryChartElement.props().options[2]).toEqual({ label: 't3name', results: 10 }); - }); - - it('should also include no-type when on uploads', () => { - props.storeKey = 'uploads'; - render(); - expect(component.find(LibraryChart).length).toBe(1); - const LibraryChartElement = component.find(LibraryChart); - - expect(LibraryChartElement.props().options[0]).toEqual({ label: 'No type', results: 13 }); - expect(LibraryChartElement.props().options[1]).toEqual({ label: 't1name', results: 5 }); - expect(LibraryChartElement.props().options[2]).toEqual({ - label: 't2nameTranslated', - results: 1, - }); - expect(LibraryChartElement.props().options[3]).toEqual({ label: 't3name', results: 10 }); - }); - - it('should add the results of sub-items in filters', () => { - props.collection = fromJS({ - filters: [ - { - id: 'g1', - name: 'group1', - items: [ - { id: 't1', filtered: { doc_count: 5 } }, - { id: 't2', filtered: { doc_count: 1 } }, - ], - }, // eslint-disable-line camelcase, max-len - { id: 't3', name: 't3name', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - ], - }); - render(); - expect(component.find(LibraryChart).length).toBe(1); - const LibraryChartElement = component.find(LibraryChart); - - expect(LibraryChartElement.props().options[0]).toEqual({ label: 'group1', results: 6 }); - expect(LibraryChartElement.props().options[1]).toEqual({ label: 't3name', results: 10 }); - }); - }); - - describe('When no valid fields found', () => { - beforeEach(() => { - props = { - aggregations: fromJS({ - all: { - types: { - buckets: [ - { key: 't1', filtered: { doc_count: 5 } }, // eslint-disable-line camelcase - { key: 't2', filtered: { doc_count: 1 } }, // eslint-disable-line camelcase - { key: 't3', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - { key: 'missing', filtered: { doc_count: 13 } }, // eslint-disable-line camelcase - ], - }, - }, - }), - fields: fromJS([{ type: 'not-valid' }]), - collection: fromJS({ filters: [] }), - templates: fromJS([ - { _id: 't1', name: 't1name' }, - { _id: 't2', name: 't2name' }, - { _id: 't3', name: 't3name' }, - ]), - translationContext: 'tcontext', - }; - }); - - it('should render templates types on LibraryChart', () => { - render(); - expect(component.find(LibraryChart).length).toBe(1); - const LibraryChartElement = component.find(LibraryChart); - - expect(LibraryChartElement.props().options[0]).toEqual({ label: 't1name', results: 5 }); - expect(LibraryChartElement.props().options[1]).toEqual({ - label: 't2nameTranslated', - results: 1, - }); - expect(LibraryChartElement.props().options[2]).toEqual({ label: 't3name', results: 10 }); - }); - }); - - describe('When fields found', () => { - beforeEach(() => { - props = { - aggregations: fromJS({ - all: { - types: { - buckets: [ - { key: 'f1', label: 'f1', filtered: { doc_count: 5 } }, // eslint-disable-line camelcase - { key: 'f2', label: 'f2', filtered: { doc_count: 1 } }, // eslint-disable-line camelcase - { key: 'f3', label: 'f3', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - ], - }, - pname: { - buckets: [ - { key: 'o1', label: 'a', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - { key: 'o2', label: 'z', filtered: { doc_count: 8 } }, // eslint-disable-line camelcase - { key: 'o3', label: 'c', filtered: { doc_count: 8 } }, // eslint-disable-line camelcase - { key: 'o4', label: 'n', filtered: { doc_count: 8 } }, // eslint-disable-line camelcase - { key: 'o5', label: 'a', filtered: { doc_count: 2 } }, // eslint-disable-line camelcase - ], - }, - }, - }), - fields: fromJS([ - { - type: 'select', - content: 'cid', - name: 'pname', - }, - { type: 'not-valid' }, - { - type: 'multiselect', - }, - { type: 'multiselect', options: [] }, - ]), - collection: fromJS({ filters: [] }), - translationContext: 'tcontext', - }; - }); - - it('should render one LibraryChart for each supported field with sorted options', () => { - render(); - expect(component.find(LibraryChart).length).toBe(1); - - const LibraryChartElement1 = component.find(LibraryChart).at(0); - - expect(LibraryChartElement1.props().options[0]).toEqual({ - id: 'o1', - value: 'o1', - label: 'a', - results: 10, - }); - expect(LibraryChartElement1.props().options[1]).toEqual({ - id: 'o3', - value: 'o3', - label: 'c', - results: 8, - }); - expect(LibraryChartElement1.props().options[2]).toEqual({ - id: 'o4', - value: 'o4', - label: 'nTranslated', - results: 8, - }); - expect(LibraryChartElement1.props().options[3]).toEqual({ - id: 'o2', - value: 'o2', - label: 'z', - results: 8, - }); - expect(LibraryChartElement1.props().options[4]).toEqual({ - id: 'o5', - value: 'o5', - label: 'a', - results: 2, - }); - }); - }); - - describe('mapStateToProps', () => { - beforeEach(() => { - state = { - a: { aggregations: 'a', filters: fromJS({ properties: 'a', documentTypes: ['dt1'] }) }, - b: { aggregations: 'b', filters: fromJS({ properties: 'b', documentTypes: ['dt2'] }) }, - settings: { collection: 'collection' }, - templates: 'templates', - }; - }); - - it('should return aggregations, fields and translation context according to store key', () => { - expect(mapStateToProps(state, { storeKey: 'a' }).aggregations).toBe('a'); - expect(mapStateToProps(state, { storeKey: 'b' }).aggregations).toBe('b'); - expect(mapStateToProps(state, {}).aggregations).toBe(null); - - expect(mapStateToProps(state, { storeKey: 'a' }).fields).toBe('a'); - expect(mapStateToProps(state, { storeKey: 'b' }).fields).toBe('b'); - expect(mapStateToProps(state, {}).fields).toBe(null); - - expect(mapStateToProps(state, { storeKey: 'a' }).translationContext).toBe('dt1'); - expect(mapStateToProps(state, { storeKey: 'b' }).translationContext).toBe('dt2'); - expect(mapStateToProps(state, {}).translationContext).toBe(null); - }); - - it('should return collection and templates', () => { - expect(mapStateToProps(state, {}).collection).toBe('collection'); - expect(mapStateToProps(state, {}).templates).toBe('templates'); - }); - }); -}); diff --git a/app/react/Charts/index.js b/app/react/Charts/index.js index 7a67e2dd22..5a3bd3fb37 100644 --- a/app/react/Charts/index.js +++ b/app/react/Charts/index.js @@ -2,8 +2,6 @@ import loadable from '@loadable/component'; import colorScheme from './utils/colorScheme'; import arrayUtils from './utils/arrayUtils'; -import LibraryChart from './components/LibraryChart'; -import LibraryCharts from './components/LibraryCharts'; import ExtendedTooltip from './components/ExtendedTooltip'; const Bar = loadable( @@ -25,14 +23,4 @@ const StackedDualBarChart = loadable( ) ); -export { - Bar, - ColoredBar, - ExtendedTooltip, - LibraryChart, - LibraryCharts, - Pie, - StackedDualBarChart, - colorScheme, - arrayUtils, -}; +export { Bar, ColoredBar, ExtendedTooltip, Pie, StackedDualBarChart, colorScheme, arrayUtils }; diff --git a/app/react/Markdown/utils.js b/app/react/Markdown/utils.js index 8773c39a13..682ae8182f 100644 --- a/app/react/Markdown/utils.js +++ b/app/react/Markdown/utils.js @@ -52,8 +52,6 @@ const customExtendedTags = [ 'bar', 'tooltip', 'stackeddualbarchart', - 'librarychart', - 'librarycharts', 'coloredbar', 'extendedtooltip', ]; From e1fe29c1d15346c964671947bfb15660fa4664ac Mon Sep 17 00:00:00 2001 From: Mercy Date: Sun, 19 Jan 2025 23:32:36 -0500 Subject: [PATCH 16/69] scrollWheelZoom only after click (#7580) * scrollWheelZoom only after click * removes unused cleanup * enables map gestures after focus * component test * control dragging --- app/react/Map/LMap.tsx | 25 ++++++++-- app/react/V2/Components/UI/specs/Map.cy.tsx | 55 +++++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 app/react/V2/Components/UI/specs/Map.cy.tsx diff --git a/app/react/Map/LMap.tsx b/app/react/Map/LMap.tsx index 39a468d326..569e556703 100644 --- a/app/react/Map/LMap.tsx +++ b/app/react/Map/LMap.tsx @@ -73,6 +73,21 @@ const LMap = ({ markerGroup.addTo(map); }; + const shouldScroll: boolean = props.renderPopupInfo || props.onClick !== undefined; + const enableMapGestures = () => { + if (shouldScroll) { + map.scrollWheelZoom.enable(); + } + map.dragging.enable(); + }; + + const disableMapGestures = (event: MouseEvent) => { + if (event.target && !map.getContainer().contains(event.target as Node)) { + map.scrollWheelZoom.disable(); + } + map.dragging.disable(); + }; + const initMap = () => { const baseMaps = getMapProvider(props.tilesProvider, props.mapApiKey); const mapLayers: { [k: string]: L.TileLayer } = {}; @@ -84,7 +99,6 @@ const LMap = ({ mapLayers[key] = baseMaps[key].layer; }); - const shouldScroll: boolean = props.renderPopupInfo || props.onClick !== undefined; map = L.map(containerId, { center: [props.startingPoint[0].lat, props.startingPoint[0].lon], zoom, @@ -92,9 +106,13 @@ const LMap = ({ minZoom: 2, zoomControl: false, preferCanvas: true, - scrollWheelZoom: shouldScroll, + scrollWheelZoom: false, + wheelDebounceTime: 100, + dragging: false, }); + map.on('click', enableMapGestures); + document.addEventListener('click', disableMapGestures); map.getPanes().mapPane.style.zIndex = '0'; markerGroup = L.markerClusterGroup(); @@ -121,9 +139,10 @@ const LMap = ({ checkMapInitialization(map, containerId); initMap(); } - return () => { if (map && reRender) { + map.off('click', enableMapGestures); + document.removeEventListener('click', disableMapGestures); map.remove(); } }; diff --git a/app/react/V2/Components/UI/specs/Map.cy.tsx b/app/react/V2/Components/UI/specs/Map.cy.tsx new file mode 100644 index 0000000000..b63e3ca443 --- /dev/null +++ b/app/react/V2/Components/UI/specs/Map.cy.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { mount } from '@cypress/react18'; +import { Provider } from 'react-redux'; +import { LEGACY_createStore as createStore } from '../../../testing/reduxStore'; +import { LMap } from '../../../../Map/LMap'; + +describe('LMap Component', () => { + beforeEach(() => { + mount( + +
+ + {'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In nec libero'.repeat(100)} + + ({})} + /> + {'MORE CONTENT / '.repeat(200)} + ENDING +
+
+ ); + }); + it('should render the map on a larger page and scroll to the bottom', () => { + cy.get('.leaflet-container').should('exist'); + cy.get('div').realMouseWheel({ deltaY: 1500, scrollBehavior: 'bottom' }); + cy.contains('ENDING').should('be.visible'); + + cy.get('div.scrollable-content').then($div => { + const scrollTop = $div.scrollTop(); + const scrollHeight = $div.prop('scrollHeight'); + const clientHeight = $div.prop('clientHeight'); + + expect(scrollTop + clientHeight).to.be.equal(scrollHeight); + }); + }); + + it('should enable scrollWheelZoom on click', () => { + cy.get('.leaflet-container').scrollIntoView(); + cy.get('.leaflet-container').click(); + cy.get('div').realMouseWheel({ deltaY: 1500, scrollBehavior: 'bottom' }); + cy.get('div.scrollable-content').then($div => { + const scrollTop = $div.scrollTop(); + const scrollHeight = $div.prop('scrollHeight'); + const clientHeight = $div.prop('clientHeight'); + expect(scrollTop + clientHeight).to.be.lessThan(scrollHeight - 400); + }); + }); +}); From d848ffba8142dc4bbf44c8c5b784111d500940a7 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 20 Jan 2025 12:57:14 -0300 Subject: [PATCH 17/69] relative splat path --- app/react/Routes.tsx | 8 ++++++-- app/react/entry-client.tsx | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/react/Routes.tsx b/app/react/Routes.tsx index 8240e25f09..18f10dba33 100644 --- a/app/react/Routes.tsx +++ b/app/react/Routes.tsx @@ -83,8 +83,12 @@ const getRoutesLayout = ( , settings)} /> , settings)} /> , settings)} /> - , settings)} /> - , settings)} /> + + , settings)} /> + + + , settings)} /> + , settings)} /> } /> } /> diff --git a/app/react/entry-client.tsx b/app/react/entry-client.tsx index 22407899fd..af9a965051 100644 --- a/app/react/entry-client.tsx +++ b/app/react/entry-client.tsx @@ -48,7 +48,12 @@ if (window.SENTRY_APP_DSN) { } const router = createBrowserRouter( - getRoutes(atomStore.get(settingsAtom), atomStore.get(userAtom)?._id) + getRoutes(atomStore.get(settingsAtom), atomStore.get(userAtom)?._id), + { + future: { + v7_relativeSplatPath: true, + }, + } ); const App = () => ( @@ -56,7 +61,7 @@ const App = () => ( - + From bf06af0c85b383be48471ea000b97a2a97632122 Mon Sep 17 00:00:00 2001 From: A happy cat Date: Mon, 20 Jan 2025 17:07:12 +0100 Subject: [PATCH 18/69] added comment to the bootstap ignore --- .github/dependabot.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 697fd9b5bf..819f2ad195 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,33 +5,33 @@ updates: schedule: interval: daily ignore: - - dependency-name: "@types/*" - - dependency-name: "@sentry/node" #6880 - versions: [">= 7.114.0"] + - dependency-name: '@types/*' + - dependency-name: '@sentry/node' #6880 + versions: ['>= 7.114.0'] - dependency-name: flowbite #Flowbite & flowbite-datepicker upgrade #6993 - versions: [">= 2.3.1"] + versions: ['>= 2.3.1'] - dependency-name: flowbite-datepicker #Flowbite & flowbite-datepicker upgrade #6993 - versions: [">= 1.2.8"] + versions: ['>= 1.2.8'] - dependency-name: flowbite-react #Flowbite & flowbite-datepicker upgrade #6993 - versions: [">= 0.10.1"] + versions: ['>= 0.10.1'] - dependency-name: Mongoose #Mongoose upgrade #7017 - versions: [">= 8.4.3"] + versions: ['>= 8.4.3'] - dependency-name: cookie - - dependency-name: "@socket.io*" - - dependency-name: bootstrap + - dependency-name: '@socket.io*' + - dependency-name: bootstrap #we have decided to dont update bootstrap #7489 - dependency-name: express-prom-bundle - dependency-name: immutable - dependency-name: otplib - dependency-name: redux - dependency-name: redux-thunk - - dependency-name: "@typescript-eslint/eslint-plugin" - - dependency-name: "@typescript-eslint/parser" + - dependency-name: '@typescript-eslint/eslint-plugin' + - dependency-name: '@typescript-eslint/parser' - dependency-name: eslint #6784 - dependency-name: fetch-mock - dependency-name: react-router-dom - dependency-name: react-datepicker - dependency-name: recharts - - dependency-name: "@headlessui/react" + - dependency-name: '@headlessui/react' - dependency-name: react-player open-pull-requests-limit: 5 labels: @@ -41,19 +41,19 @@ updates: babel: applies-to: version-updates patterns: - - "@babel*" + - '@babel*' storybook: applies-to: version-updates patterns: - - "@storybook*" + - '@storybook*' sentry: applies-to: version-updates patterns: - - "@sentry*" + - '@sentry*' dnd-kit: applies-to: version-updates patterns: - - "@dnd-kit*" + - '@dnd-kit*' socket.io: applies-to: version-updates patterns: @@ -70,9 +70,9 @@ updates: applies-to: version-updates update-types: [minor, patch] patterns: - - "*" + - '*' dev-major-dependencies: applies-to: version-updates update-types: [major] patterns: - - "*" + - '*' From 6b825b6d46c811813e8d40375e1ee0c7df139e1b Mon Sep 17 00:00:00 2001 From: John Date: Mon, 20 Jan 2025 15:18:43 -0300 Subject: [PATCH 19/69] keep element defined in parent route --- app/react/Routes.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/react/Routes.tsx b/app/react/Routes.tsx index 18f10dba33..a3a090bb29 100644 --- a/app/react/Routes.tsx +++ b/app/react/Routes.tsx @@ -83,10 +83,10 @@ const getRoutesLayout = ( , settings)} /> , settings)} /> , settings)} /> - + , settings)}> , settings)} /> - + , settings)}> , settings)} /> , settings)} /> From 3d18ce97dfc52fbc766ea8a2875a7629b0dfada8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 14:50:03 -0500 Subject: [PATCH 20/69] Bump recharts from 2.12.7 to 2.13.3 (#7476) * Bump recharts from 2.12.7 to 2.13.3 Bumps [recharts](https://github.com/recharts/recharts) from 2.12.7 to 2.13.3. - [Release notes](https://github.com/recharts/recharts/releases) - [Changelog](https://github.com/recharts/recharts/blob/3.x/CHANGELOG.md) - [Commits](https://github.com/recharts/recharts/compare/v2.12.7...v2.13.3) --- updated-dependencies: - dependency-name: recharts dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * update snapshots for removed properties of BarChart * update snapshot of PieChart * update snapshots --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mercy Co-authored-by: Santiago <71732018+Zasa-san@users.noreply.github.com> --- .../StackedDualBarChart.spec.js.snap | 12 --- .../specs/__snapshots__/BarChart.spec.js.snap | 65 ------------ .../__snapshots__/FreeBarChart.spec.tsx.snap | 52 --------- .../__snapshots__/GaugeChart.spec.js.snap | 40 ------- .../specs/__snapshots__/PieChart.spec.js.snap | 100 ------------------ package.json | 2 +- yarn.lock | 20 ++-- 7 files changed, 11 insertions(+), 280 deletions(-) diff --git a/app/react/Charts/components/specs/__snapshots__/StackedDualBarChart.spec.js.snap b/app/react/Charts/components/specs/__snapshots__/StackedDualBarChart.spec.js.snap index bfa4fa0f74..145ac10df9 100644 --- a/app/react/Charts/components/specs/__snapshots__/StackedDualBarChart.spec.js.snap +++ b/app/react/Charts/components/specs/__snapshots__/StackedDualBarChart.spec.js.snap @@ -5,8 +5,6 @@ exports[`StackedDualBarChart should allow overriding default data and label and height={320} > Date: Mon, 20 Jan 2025 15:10:27 -0500 Subject: [PATCH 21/69] Bump the storybook group with 8 updates (#7598) Bumps the storybook group with 8 updates: | Package | From | To | | --- | --- | --- | | [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/actions) | `8.4.7` | `8.5.0` | | [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.4.7` | `8.5.0` | | [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.4.7` | `8.5.0` | | [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.4.7` | `8.5.0` | | [@storybook/addon-viewport](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/viewport) | `8.4.7` | `8.5.0` | | [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.4.7` | `8.5.0` | | [@storybook/react-webpack5](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-webpack5) | `8.4.7` | `8.5.0` | | [@storybook/test](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/test) | `8.4.7` | `8.5.0` | Updates `@storybook/addon-actions` from 8.4.7 to 8.5.0 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/actions) Updates `@storybook/addon-essentials` from 8.4.7 to 8.5.0 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/essentials) Updates `@storybook/addon-interactions` from 8.4.7 to 8.5.0 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/interactions) Updates `@storybook/addon-links` from 8.4.7 to 8.5.0 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/links) Updates `@storybook/addon-viewport` from 8.4.7 to 8.5.0 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/addons/viewport) Updates `@storybook/react` from 8.4.7 to 8.5.0 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/renderers/react) Updates `@storybook/react-webpack5` from 8.4.7 to 8.5.0 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/frameworks/react-webpack5) Updates `@storybook/test` from 8.4.7 to 8.5.0 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.0/code/lib/test) --- updated-dependencies: - dependency-name: "@storybook/addon-actions" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: storybook - dependency-name: "@storybook/addon-essentials" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: storybook - dependency-name: "@storybook/addon-interactions" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: storybook - dependency-name: "@storybook/addon-links" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: storybook - dependency-name: "@storybook/addon-viewport" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: storybook - dependency-name: "@storybook/react" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: storybook - dependency-name: "@storybook/react-webpack5" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: storybook - dependency-name: "@storybook/test" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: storybook ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mercy --- package.json | 12 +- yarn.lock | 313 +++++++++++++++++++++++++++------------------------ 2 files changed, 173 insertions(+), 152 deletions(-) diff --git a/package.json b/package.json index d46e1c5bce..141dd9bf4e 100644 --- a/package.json +++ b/package.json @@ -271,14 +271,14 @@ "@cfaester/enzyme-adapter-react-18": "^0.8.0", "@chromatic-com/storybook": "^3.2.3", "@cypress/react18": "^2.0.1", - "@storybook/addon-actions": "^8.4.7", - "@storybook/addon-essentials": "^8.4.7", - "@storybook/addon-interactions": "^8.4.7", - "@storybook/addon-links": "^8.4.7", + "@storybook/addon-actions": "^8.5.0", + "@storybook/addon-essentials": "^8.5.0", + "@storybook/addon-interactions": "^8.5.0", + "@storybook/addon-links": "^8.5.0", "@storybook/addon-viewport": "^8.1.11", "@storybook/addon-webpack5-compiler-babel": "^3.0.5", - "@storybook/react": "^8.4.7", - "@storybook/react-webpack5": "^8.4.7", + "@storybook/react": "^8.5.0", + "@storybook/react-webpack5": "^8.5.0", "@storybook/test": "^8.1.11", "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "^16.1.0", diff --git a/yarn.lock b/yarn.lock index 77ad0677b3..95c6da1232 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3788,10 +3788,10 @@ notepack.io "~3.0.1" socket.io-parser "~4.2.1" -"@storybook/addon-actions@8.4.7", "@storybook/addon-actions@^8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-8.4.7.tgz#210c6bb5a7e17c3664c300b4b69b6243ec34b9cd" - integrity sha512-mjtD5JxcPuW74T6h7nqMxWTvDneFtokg88p6kQ5OnC1M259iAXb//yiSZgu/quunMHPCXSiqn4FNOSgASTSbsA== +"@storybook/addon-actions@8.5.0", "@storybook/addon-actions@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-8.5.0.tgz#b2dfb6430637762de302174e650c8cec4109a232" + integrity sha512-6CW9+17rk5eNx6I8EKqCxRKtsJFTR/lHL+xiJ6/iBWApIm8sg63vhXvUTJ58UixmIkT5oLh0+ESNPh+x10D8fw== dependencies: "@storybook/global" "^5.0.0" "@types/uuid" "^9.0.1" @@ -3799,105 +3799,105 @@ polished "^4.2.2" uuid "^9.0.0" -"@storybook/addon-backgrounds@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.7.tgz#56856bdafc5a2ba18cc19422320883c9e8f66c1c" - integrity sha512-I4/aErqtFiazcoWyKafOAm3bLpxTj6eQuH/woSbk1Yx+EzN+Dbrgx1Updy8//bsNtKkcrXETITreqHC+a57DHQ== +"@storybook/addon-backgrounds@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-8.5.0.tgz#eb554e59e8bb53cf386bcbe77f03b5547a096bf4" + integrity sha512-lzyFLs7niNsqlhH5kdUrp7htLiMIcjY50VLWe0PaeJ6T6GZ7X9qhQzROAUV6cGqzyd8A6y/LzIUntDPMVEm/6g== dependencies: "@storybook/global" "^5.0.0" memoizerific "^1.11.3" ts-dedent "^2.0.0" -"@storybook/addon-controls@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-8.4.7.tgz#0c2ace0c7056248577f08f90471f29e861b485be" - integrity sha512-377uo5IsJgXLnQLJixa47+11V+7Wn9KcDEw+96aGCBCfLbWNH8S08tJHHnSu+jXg9zoqCAC23MetntVp6LetHA== +"@storybook/addon-controls@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-8.5.0.tgz#7fd9379b88305194014771fdbe1010af5206e4f1" + integrity sha512-1fivx77A/ahObrPl0L66o9i9MUNfqXxsrpekne5gjMNXw9XJFIRNUe/ddL4CMmwu7SgVbj2QV+q5E5mlnZNTJw== dependencies: "@storybook/global" "^5.0.0" dequal "^2.0.2" ts-dedent "^2.0.0" -"@storybook/addon-docs@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-8.4.7.tgz#556515da1049f97023427301e11ecb52d0b9dbe7" - integrity sha512-NwWaiTDT5puCBSUOVuf6ME7Zsbwz7Y79WF5tMZBx/sLQ60vpmJVQsap6NSjvK1Ravhc21EsIXqemAcBjAWu80w== +"@storybook/addon-docs@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-8.5.0.tgz#0636e460fb948e1fa8377d2f09a85335d55b01ba" + integrity sha512-REwLSr1VgOVNJZwP3y3mldhOjBHlM5fqTvq/tC8NaYpAzx9O4rZdoUSZxW3tYtoNoYrHpB8kzRTeZl8WSdKllw== dependencies: "@mdx-js/react" "^3.0.0" - "@storybook/blocks" "8.4.7" - "@storybook/csf-plugin" "8.4.7" - "@storybook/react-dom-shim" "8.4.7" + "@storybook/blocks" "8.5.0" + "@storybook/csf-plugin" "8.5.0" + "@storybook/react-dom-shim" "8.5.0" react "^16.8.0 || ^17.0.0 || ^18.0.0" react-dom "^16.8.0 || ^17.0.0 || ^18.0.0" ts-dedent "^2.0.0" -"@storybook/addon-essentials@^8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-8.4.7.tgz#381c74230d1b1a209d5fdc017d241c016b98affe" - integrity sha512-+BtZHCBrYtQKILtejKxh0CDRGIgTl9PumfBOKRaihYb4FX1IjSAxoV/oo/IfEjlkF5f87vouShWsRa8EUauFDw== - dependencies: - "@storybook/addon-actions" "8.4.7" - "@storybook/addon-backgrounds" "8.4.7" - "@storybook/addon-controls" "8.4.7" - "@storybook/addon-docs" "8.4.7" - "@storybook/addon-highlight" "8.4.7" - "@storybook/addon-measure" "8.4.7" - "@storybook/addon-outline" "8.4.7" - "@storybook/addon-toolbars" "8.4.7" - "@storybook/addon-viewport" "8.4.7" +"@storybook/addon-essentials@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-8.5.0.tgz#dc83caa6cc3aad312c2afb88345915fd59129fc6" + integrity sha512-RrHRdaw2j3ugZiYQ6OHt3Ff08ID4hwAvipqULEsbEnEw3VlXOaW/MT5e2M7kW3MHskQ3iJ6XAD1Y1rNm432Pzw== + dependencies: + "@storybook/addon-actions" "8.5.0" + "@storybook/addon-backgrounds" "8.5.0" + "@storybook/addon-controls" "8.5.0" + "@storybook/addon-docs" "8.5.0" + "@storybook/addon-highlight" "8.5.0" + "@storybook/addon-measure" "8.5.0" + "@storybook/addon-outline" "8.5.0" + "@storybook/addon-toolbars" "8.5.0" + "@storybook/addon-viewport" "8.5.0" ts-dedent "^2.0.0" -"@storybook/addon-highlight@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-8.4.7.tgz#06b9752977e38884007e9446f9a2b0c04c873229" - integrity sha512-whQIDBd3PfVwcUCrRXvCUHWClXe9mQ7XkTPCdPo4B/tZ6Z9c6zD8JUHT76ddyHivixFLowMnA8PxMU6kCMAiNw== +"@storybook/addon-highlight@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-8.5.0.tgz#a6fe48434826c1e869135e47dcfe34d68bcf287c" + integrity sha512-/JxYzMK5aJSYs0K/0eAEFyER2dMoxqwM891MdnkNwLFdyrM58lzHee00F9oEX6zeQoRUNQPRepq0ui2PvbTMGw== dependencies: "@storybook/global" "^5.0.0" -"@storybook/addon-interactions@^8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-interactions/-/addon-interactions-8.4.7.tgz#d34545db5ea6f03a5499ad6742c3317fb9e02d55" - integrity sha512-fnufT3ym8ht3HHUIRVXAH47iOJW/QOb0VSM+j269gDuvyDcY03D1civCu1v+eZLGaXPKJ8vtjr0L8zKQ/4P0JQ== +"@storybook/addon-interactions@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-interactions/-/addon-interactions-8.5.0.tgz#467ab13beedb2bc3113a76b33c2105ce757a7ae8" + integrity sha512-vX1a8qS7o/W3kEzfL/CqOj/Rr6UlGLT/n0KXMpfIhx63tzxe1a1qGpFLL0h0zqAVPHZIOu9humWMKri5Iny6oA== dependencies: "@storybook/global" "^5.0.0" - "@storybook/instrumenter" "8.4.7" - "@storybook/test" "8.4.7" + "@storybook/instrumenter" "8.5.0" + "@storybook/test" "8.5.0" polished "^4.2.2" ts-dedent "^2.2.0" -"@storybook/addon-links@^8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-8.4.7.tgz#c38b2b63c3b0308adacff4b0758464a0657154c4" - integrity sha512-L/1h4dMeMKF+MM0DanN24v5p3faNYbbtOApMgg7SlcBT/tgo3+cAjkgmNpYA8XtKnDezm+T2mTDhB8mmIRZpIQ== +"@storybook/addon-links@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-8.5.0.tgz#3c49062954467ae36b9e0f446368074a8722257d" + integrity sha512-Y11GIByAYqn0TibI/xsy0vCe+ZxJS9PVAAoHngLxkf9J4WodAXcJABr8ZPlWDNdaEhSS/FF7UQUmNag0UC2/pw== dependencies: - "@storybook/csf" "^0.1.11" + "@storybook/csf" "0.1.12" "@storybook/global" "^5.0.0" ts-dedent "^2.0.0" -"@storybook/addon-measure@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-8.4.7.tgz#9d556ba34b57c13ad8d00bd953b27ec405a64d23" - integrity sha512-QfvqYWDSI5F68mKvafEmZic3SMiK7zZM8VA0kTXx55hF/+vx61Mm0HccApUT96xCXIgmwQwDvn9gS4TkX81Dmw== +"@storybook/addon-measure@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-8.5.0.tgz#3459a8e2877c0c36082e3d5fd62cbc6e198cb879" + integrity sha512-e8pJy2sICyj0Ff0W1PFc6HPE6PqcjnnHtfuDaO3M9uSKJLYkpTWJ8i1VSP178f8seq44r5/PdQCHqs5q5l3zgw== dependencies: "@storybook/global" "^5.0.0" tiny-invariant "^1.3.1" -"@storybook/addon-outline@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-8.4.7.tgz#8a35fe519dd639bb287a370da2222e6ffdce4020" - integrity sha512-6LYRqUZxSodmAIl8icr585Oi8pmzbZ90aloZJIpve+dBAzo7ydYrSQxxoQEVltXbKf3VeVcrs64ouAYqjisMYA== +"@storybook/addon-outline@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-8.5.0.tgz#9fdb88edbd756da04ff28de665cf06cacd383595" + integrity sha512-r12sk1b38Ph6NroWAOTfjbJ/V+gDobm7tKQQlbSDf6fgX7cqyPHmKjfNDCOCQpXouZm/Jm+41zd758PW+Yt4ng== dependencies: "@storybook/global" "^5.0.0" ts-dedent "^2.0.0" -"@storybook/addon-toolbars@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-8.4.7.tgz#b898d4deaf6f5a58f3b70bd8d136cd4ec2844b79" - integrity sha512-OSfdv5UZs+NdGB+nZmbafGUWimiweJ/56gShlw8Neo/4jOJl1R3rnRqqY7MYx8E4GwoX+i3GF5C3iWFNQqlDcw== +"@storybook/addon-toolbars@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-8.5.0.tgz#6a17113d74b92d86433b8789d847d5eeadf316c8" + integrity sha512-q3yYYO2WX8K2DYNM++FzixGDjzYaeREincgsl2WXYXrcuGb5hkOoOgRiAQL8Nz9NQ1Eo+B/yZxrhG/5VoVhUUQ== -"@storybook/addon-viewport@8.4.7", "@storybook/addon-viewport@^8.1.11": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-8.4.7.tgz#e65c53608f52149c06347b395487960605fc4805" - integrity sha512-hvczh/jjuXXcOogih09a663sRDDSATXwbE866al1DXgbDFraYD/LxX/QDb38W9hdjU9+Qhx8VFIcNWoMQns5HQ== +"@storybook/addon-viewport@8.5.0", "@storybook/addon-viewport@^8.1.11": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-8.5.0.tgz#4e8011c9c5cbd2273a4122b209d7d4f4977d2a2f" + integrity sha512-MlhVELImk9YzjEgGR2ciLC8d5tUSGcO7my4kWIClN0VyTRcvG4ZfwrsEC+jN3/l52nrgjLmKrDX5UAGZm6w5mQ== dependencies: memoizerific "^1.11.3" @@ -3909,22 +3909,21 @@ "@babel/core" "^7.26.0" babel-loader "^9.2.1" -"@storybook/blocks@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-8.4.7.tgz#ee17f59dd52d11c97c39b0f6b03957085a80ad95" - integrity sha512-+QH7+JwXXXIyP3fRCxz/7E2VZepAanXJM7G8nbR3wWsqWgrRp4Wra6MvybxAYCxU7aNfJX5c+RW84SNikFpcIA== +"@storybook/blocks@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-8.5.0.tgz#6994c44bab2df46cbe925f18a064a6433bd66eff" + integrity sha512-2sTOgjH/JFOgWnpqkKjpKVvKAgUaC9ZBjH1gnCoA5dne/SDafYaCAYfv6yZn7g2Xm1sTxWCAmMIUkYSALeWr+w== dependencies: - "@storybook/csf" "^0.1.11" + "@storybook/csf" "0.1.12" "@storybook/icons" "^1.2.12" ts-dedent "^2.0.0" -"@storybook/builder-webpack5@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.4.7.tgz#5bc15568716bbf4f45a88fc389e25fa2ce50a8c2" - integrity sha512-O8LpsQ+4g2x5kh7rI9+jEUdX8k1a5egBQU1lbudmHchqsV0IKiVqBD9LL5Gj3wpit4vB8coSW4ZWTFBw8FQb4Q== +"@storybook/builder-webpack5@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.5.0.tgz#e44f0a197b40e8d3caae21e9459cb9cd4accf57c" + integrity sha512-MyCj11cktyN2HeK8NsLv+L0Km36qAz2UGqu6j1VKJUgPelgpCCi4StCW/KaSBeOFAwGD52xjAdNu+c1h/vfiMg== dependencies: - "@storybook/core-webpack" "8.4.7" - "@types/node" "^22.0.0" + "@storybook/core-webpack" "8.5.0" "@types/semver" "^7.3.4" browser-assert "^1.2.1" case-sensitive-paths-webpack-plugin "^2.4.0" @@ -3949,17 +3948,16 @@ webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.6.0" -"@storybook/components@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.4.7.tgz#09eeffa07aa672ad3966ca1764a43003731b1d30" - integrity sha512-uyJIcoyeMWKAvjrG9tJBUCKxr2WZk+PomgrgrUwejkIfXMO76i6jw9BwLa0NZjYdlthDv30r9FfbYZyeNPmF0g== +"@storybook/components@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.5.0.tgz#fab176ee7b863e4abc3c8581f6cb7b3d46bf80b0" + integrity sha512-DhaHtwfEcfWYj3ih/5RBSDHe3Idxyf+oHw2/DmaLKJX6MluhdK3ZqigjRcTmA9Gj/SbR4CkHEEtDzAvBlW0BYw== -"@storybook/core-webpack@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.4.7.tgz#660d1cbd03a91fee27b65e6acc2f9269ed1fbfc8" - integrity sha512-Tj+CjQLpFyBJxhhMms+vbPT3+gTRAiQlrhY3L1IEVwBa3wtRMS0qjozH26d1hK4G6mUIEdwu13L54HMU/w33Sg== +"@storybook/core-webpack@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.5.0.tgz#4d4b355d3eeb8b8b1056dd98540d47b3db07bc61" + integrity sha512-bJAcF9TwNO2qNa7Jef4h5U9ka4399HDiHiQec1AxdqUIy/2zfbetgV6+2Fr5mtejPqJgbs7kXNGErI+fFByLGg== dependencies: - "@types/node" "^22.0.0" ts-dedent "^2.0.0" "@storybook/core@8.3.4": @@ -3981,17 +3979,17 @@ util "^0.12.5" ws "^8.2.3" -"@storybook/csf-plugin@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-8.4.7.tgz#0117c872b05bf033eec089ab0224e0fab01da810" - integrity sha512-Fgogplu4HImgC+AYDcdGm1rmL6OR1rVdNX1Be9C/NEXwOCpbbBwi0BxTf/2ZxHRk9fCeaPEcOdP5S8QHfltc1g== +"@storybook/csf-plugin@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-8.5.0.tgz#f071c2fb9de5941654b00c95354ee7337d61fc7e" + integrity sha512-cs6ogviNyLG1h9J8Sb47U3DqIrQmn2EHm4ta3fpCeV3ABbrMgbzYyxtmybz4g/AwlDgjAZAt6PPcXkfCJ6p2CQ== dependencies: unplugin "^1.3.1" -"@storybook/csf@^0.1.11": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.11.tgz#ad685a4fe564a47a6b73571c2e7c07b526f4f71b" - integrity sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg== +"@storybook/csf@0.1.12", "@storybook/csf@^0.1.11": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.12.tgz#1dcfa0f398a69b834c563884b5f747db3d5a81df" + integrity sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw== dependencies: type-fest "^2.19.0" @@ -4005,28 +4003,27 @@ resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-1.2.12.tgz#3e4c939113b67df7ab17b78f805dbb57f4acf0db" integrity sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q== -"@storybook/instrumenter@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-8.4.7.tgz#5a37876fee8f828241a1e7fd76891c6effc1805a" - integrity sha512-k6NSD3jaRCCHAFtqXZ7tw8jAzD/yTEWXGya+REgZqq5RCkmJ+9S4Ytp/6OhQMPtPFX23gAuJJzTQVLcCr+gjRg== +"@storybook/instrumenter@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-8.5.0.tgz#e8c38ab912f2b7119cd92efe3977bc33246fa808" + integrity sha512-eZ/UY6w4U2vay+wX7QVwKiRoyMzZscuv6v4k4r8BlmHPFWbhiZDO9S2GsG16UkyKnrQrYk432he70n7hn1Xvmg== dependencies: "@storybook/global" "^5.0.0" "@vitest/utils" "^2.1.1" -"@storybook/manager-api@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.4.7.tgz#4e13debf645c9300d7d6d49195e720d0c7ecd261" - integrity sha512-ELqemTviCxAsZ5tqUz39sDmQkvhVAvAgiplYy9Uf15kO0SP2+HKsCMzlrm2ue2FfkUNyqbDayCPPCB0Cdn/mpQ== +"@storybook/manager-api@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.5.0.tgz#4024ff316677ca9f4175eb4d1818488dd6f18095" + integrity sha512-Ildriueo3eif4M+gMlMxu/mrBIbAnz8+oesmQJKdzZfe/U9eQTI9OUqJsxx/IVBmdzQ3ySsgNmzj5VweRkse4A== -"@storybook/preset-react-webpack@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.4.7.tgz#7b303f464228035a919ea18a3cd6193f6776c2bc" - integrity sha512-geTSBKyrBagVihil5MF7LkVFynbfHhCinvnbCZZqXW7M1vgcxvatunUENB+iV8eWg/0EJ+8O7scZL+BAxQ/2qg== +"@storybook/preset-react-webpack@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.5.0.tgz#59da1eb0dc8a5981c8f793900a299b8bd2437ba6" + integrity sha512-KJwVcQVYQWuMT5QUF06be60UuBfazBIO+90erfoYoIx0UwOxKMVnQz0HfG2JMc4EIoNLIl0/cm5mb2k4BWyhbA== dependencies: - "@storybook/core-webpack" "8.4.7" - "@storybook/react" "8.4.7" + "@storybook/core-webpack" "8.5.0" + "@storybook/react" "8.5.0" "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0" - "@types/node" "^22.0.0" "@types/semver" "^7.3.4" find-up "^5.0.0" magic-string "^0.30.5" @@ -4036,10 +4033,10 @@ tsconfig-paths "^4.2.0" webpack "5" -"@storybook/preview-api@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.4.7.tgz#85e01a97f4182b974581765d725f6c7a7d190013" - integrity sha512-0QVQwHw+OyZGHAJEXo6Knx+6/4er7n2rTDE5RYJ9F2E2Lg42E19pfdLlq2Jhoods2Xrclo3wj6GWR//Ahi39Eg== +"@storybook/preview-api@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.5.0.tgz#32dbff12d5299897df2ccf68ad5007e814b8b067" + integrity sha512-g0XbD54zMUkl6bpuA7qEBCE9rW1QV6KKmwkO4bkxMOJcMke3x9l00JTaYn7Un8wItjXiS3BIG15B6mnfBG7fng== "@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0": version "1.0.6--canary.9.0c3f3b7.0" @@ -4054,51 +4051,50 @@ react-docgen-typescript "^2.2.2" tslib "^2.0.0" -"@storybook/react-dom-shim@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.4.7.tgz#f0dd5bbf2fc185def72d9d08a11c8de22f152c2a" - integrity sha512-6bkG2jvKTmWrmVzCgwpTxwIugd7Lu+2btsLAqhQSzDyIj2/uhMNp8xIMr/NBDtLgq3nomt9gefNa9xxLwk/OMg== +"@storybook/react-dom-shim@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.5.0.tgz#ada85ed027113b0e05debfd5c5e6ffa44843b069" + integrity sha512-7P8xg4FiuFpM6kQOzZynno+0zyLVs8NgsmRK58t3JRZXbda1tzlxTXzvqx4hUevvbPJGjmrB0F3xTFH+8Otnvw== -"@storybook/react-webpack5@^8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.4.7.tgz#b0c48caffd658912bd10f4f9960edb229e990b4b" - integrity sha512-T9GLqlsP4It4El7cC8rSkBPRWvORAsTDULeWlO36RST2TrYnmBOUytsi22mk7cAAAVhhD6rTrs1YdqWRMpfa1w== +"@storybook/react-webpack5@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.5.0.tgz#327f4b1b30f9f6ed54b955de49444bcc306e6be6" + integrity sha512-L2KIR458Q2+5VOOh0wf84vla3gSsuq9C/266GmHZovlDClVlnaQTg8lc8ug52K2+rOChdz8MQqZjGO+Bg0OvLw== dependencies: - "@storybook/builder-webpack5" "8.4.7" - "@storybook/preset-react-webpack" "8.4.7" - "@storybook/react" "8.4.7" - "@types/node" "^22.0.0" + "@storybook/builder-webpack5" "8.5.0" + "@storybook/preset-react-webpack" "8.5.0" + "@storybook/react" "8.5.0" -"@storybook/react@8.4.7", "@storybook/react@^8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.4.7.tgz#e2cf62b3c1d8e4bfe5eff82ced07ec473d4e4fd1" - integrity sha512-nQ0/7i2DkaCb7dy0NaT95llRVNYWQiPIVuhNfjr1mVhEP7XD090p0g7eqUmsx8vfdHh2BzWEo6CoBFRd3+EXxw== +"@storybook/react@8.5.0", "@storybook/react@^8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.5.0.tgz#da6667d8a6f49d5ea4ec95c75f1ab853edada2a4" + integrity sha512-/jbkmGGc95N7KduIennL/k8grNTP5ye/YBnkcS4TbF7uDWBtKy3/Wqvx5BIlFXq3qeUnZJ8YtZc0lPIYeCY8XQ== dependencies: - "@storybook/components" "8.4.7" + "@storybook/components" "8.5.0" "@storybook/global" "^5.0.0" - "@storybook/manager-api" "8.4.7" - "@storybook/preview-api" "8.4.7" - "@storybook/react-dom-shim" "8.4.7" - "@storybook/theming" "8.4.7" + "@storybook/manager-api" "8.5.0" + "@storybook/preview-api" "8.5.0" + "@storybook/react-dom-shim" "8.5.0" + "@storybook/theming" "8.5.0" -"@storybook/test@8.4.7", "@storybook/test@^8.1.11": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/test/-/test-8.4.7.tgz#7f58f2cdf3a6d810bf3ff4e0e2fee634040c678f" - integrity sha512-AhvJsu5zl3uG40itSQVuSy5WByp3UVhS6xAnme4FWRwgSxhvZjATJ3AZkkHWOYjnnk+P2/sbz/XuPli1FVCWoQ== +"@storybook/test@8.5.0", "@storybook/test@^8.1.11": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/test/-/test-8.5.0.tgz#d7157a87436000142cf6dedee37a74b86ad776f2" + integrity sha512-M/DdPlI6gwL7NGkK5o7GYjdEBp95AsFEUtW29zQfnVIAngYugzi3nIuM/XkQHunidVdAZCYjw2s2Yhhsx/m9sw== dependencies: - "@storybook/csf" "^0.1.11" + "@storybook/csf" "0.1.12" "@storybook/global" "^5.0.0" - "@storybook/instrumenter" "8.4.7" + "@storybook/instrumenter" "8.5.0" "@testing-library/dom" "10.4.0" "@testing-library/jest-dom" "6.5.0" "@testing-library/user-event" "14.5.2" "@vitest/expect" "2.0.5" "@vitest/spy" "2.0.5" -"@storybook/theming@8.4.7": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.4.7.tgz#c308f6a883999bd35e87826738ab8a76515932b5" - integrity sha512-99rgLEjf7iwfSEmdqlHkSG3AyLcK0sfExcr0jnc6rLiAkBhzuIsvcHjjUwkR210SOCgXqBPW0ZA6uhnuyppHLw== +"@storybook/theming@8.5.0": + version "8.5.0" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.5.0.tgz#c51c938ae6d695ecb73604e46d19d9db33859408" + integrity sha512-591LbOj/HMmHYUfLgrMerxhF1A9mY61HWKxcRpB6xxalc1Xw1kRtQ49DcwuTXnUu9ktBB3nuOzPNPQPFSh/7PQ== "@supercharge/promise-pool@^3.2.0": version "3.2.0" @@ -4688,7 +4684,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@^22.0.0": +"@types/node@*", "@types/node@>=10.0.0": version "22.7.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== @@ -15692,7 +15688,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15820,7 +15825,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -17256,7 +17268,7 @@ world-countries@5.0.0: resolved "https://registry.yarnpkg.com/world-countries/-/world-countries-5.0.0.tgz#6f75ebcce3d5224d84e9117eaf0d75a7726b6501" integrity sha512-wAfOT9Y5i/xnxNOdKJKXdOCw9Q3yQLahBUeuRol+s+o20F6h2a4tLEbJ1lBCYwEQ30Sf9Meqeipk1gib3YwF5w== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -17274,6 +17286,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 7f7fa2176974af9dbd810ded1df28dcb4eddd6ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 16:59:34 -0500 Subject: [PATCH 22/69] Bump the dev-minor-dependencies group with 10 updates (#7601) Bumps the dev-minor-dependencies group with 10 updates: | Package | From | To | | --- | --- | --- | | [@aws-sdk/client-s3](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3) | `3.726.1` | `3.731.1` | | [@remix-run/router](https://github.com/remix-run/react-router/tree/HEAD/packages/router) | `1.21.0` | `1.21.1` | | [flag-icons](https://github.com/lipis/flag-icons) | `7.2.3` | `7.3.2` | | [jotai](https://github.com/pmndrs/jotai) | `2.11.0` | `2.11.1` | | [qs](https://github.com/ljharb/qs) | `6.13.1` | `6.14.0` | | [@types/qs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/qs) | `6.9.17` | `6.9.18` | | [@chromatic-com/storybook](https://github.com/chromaui/addon-visual-tests) | `3.2.3` | `3.2.4` | | [@testing-library/react](https://github.com/testing-library/react-testing-library) | `16.1.0` | `16.2.0` | | [@testing-library/user-event](https://github.com/testing-library/user-event) | `14.5.2` | `14.6.0` | | [postcss](https://github.com/postcss/postcss) | `8.5.0` | `8.5.1` | Updates `@aws-sdk/client-s3` from 3.726.1 to 3.731.1 - [Release notes](https://github.com/aws/aws-sdk-js-v3/releases) - [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.731.1/clients/client-s3) Updates `@remix-run/router` from 1.21.0 to 1.21.1 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/@remix-run/router@1.21.1/packages/router/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/@remix-run/router@1.21.1/packages/router) Updates `flag-icons` from 7.2.3 to 7.3.2 - [Release notes](https://github.com/lipis/flag-icons/releases) - [Changelog](https://github.com/lipis/flag-icons/blob/main/CHANGELOG.md) - [Commits](https://github.com/lipis/flag-icons/compare/v7.2.3...v7.3.2) Updates `jotai` from 2.11.0 to 2.11.1 - [Release notes](https://github.com/pmndrs/jotai/releases) - [Commits](https://github.com/pmndrs/jotai/compare/v2.11.0...v2.11.1) Updates `qs` from 6.13.1 to 6.14.0 - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.13.1...v6.14.0) Updates `@types/qs` from 6.9.17 to 6.9.18 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/qs) Updates `@chromatic-com/storybook` from 3.2.3 to 3.2.4 - [Release notes](https://github.com/chromaui/addon-visual-tests/releases) - [Changelog](https://github.com/chromaui/addon-visual-tests/blob/v3.2.4/CHANGELOG.md) - [Commits](https://github.com/chromaui/addon-visual-tests/compare/v3.2.3...v3.2.4) Updates `@testing-library/react` from 16.1.0 to 16.2.0 - [Release notes](https://github.com/testing-library/react-testing-library/releases) - [Changelog](https://github.com/testing-library/react-testing-library/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/react-testing-library/compare/v16.1.0...v16.2.0) Updates `@testing-library/user-event` from 14.5.2 to 14.6.0 - [Release notes](https://github.com/testing-library/user-event/releases) - [Changelog](https://github.com/testing-library/user-event/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/user-event/compare/v14.5.2...v14.6) Updates `postcss` from 8.5.0 to 8.5.1 - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.5.0...8.5.1) --- updated-dependencies: - dependency-name: "@aws-sdk/client-s3" dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: "@remix-run/router" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: flag-icons dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: jotai dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: qs dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: "@types/qs" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: "@chromatic-com/storybook" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: "@testing-library/react" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: "@testing-library/user-event" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: postcss dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-minor-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mercy --- package.json | 20 +- yarn.lock | 599 +++++++++++++++++++++++---------------------------- 2 files changed, 284 insertions(+), 335 deletions(-) diff --git a/package.json b/package.json index 141dd9bf4e..87a6efcb81 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "cross-spawn": "^7.0.5" }, "dependencies": { - "@aws-sdk/client-s3": "3.726.1", + "@aws-sdk/client-s3": "3.731.1", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", @@ -104,7 +104,7 @@ "@huridocs/react-text-selection-handler": "^0.3.0", "@loadable/component": "^5.16.4", "@popperjs/core": "^2.11.8", - "@remix-run/router": "1.21.0", + "@remix-run/router": "1.21.1", "@sentry/node": "^7.114.0", "@sentry/react": "7.114.0", "@sentry/tracing": "^7.114.0", @@ -145,7 +145,7 @@ "express-prom-bundle": "^7.0.0", "express-session": "^1.18.1", "filesize": "10.1.6", - "flag-icons": "^7.2.3", + "flag-icons": "^7.3.2", "flowbite": "^2.3.0", "flowbite-datepicker": "^1.2.7", "flowbite-react": "^0.10.1", @@ -158,7 +158,7 @@ "immutable": "^3.7.6", "is-reachable": "^5.2.1", "isomorphic-fetch": "3.0.0", - "jotai": "2.11.0", + "jotai": "2.11.1", "json-schema": "^0.4.0", "json-schema-to-typescript": "^15.0.4", "jvent": "1.0.2", @@ -190,7 +190,7 @@ "prom-client": "^15.1.3", "prop-types": "^15.8.1", "qrcode.react": "^4.2.0", - "qs": "^6.13.1", + "qs": "^6.14.0", "react": "^18.3.1", "react-color": "^2.19.3", "react-datepicker": "7.5.0", @@ -269,7 +269,7 @@ "@babel/register": "^7.25.9", "@babel/traverse": "^7.26.5", "@cfaester/enzyme-adapter-react-18": "^0.8.0", - "@chromatic-com/storybook": "^3.2.3", + "@chromatic-com/storybook": "^3.2.4", "@cypress/react18": "^2.0.1", "@storybook/addon-actions": "^8.5.0", "@storybook/addon-essentials": "^8.5.0", @@ -281,8 +281,8 @@ "@storybook/react-webpack5": "^8.5.0", "@storybook/test": "^8.1.11", "@testing-library/jest-dom": "6.6.3", - "@testing-library/react": "^16.1.0", - "@testing-library/user-event": "^14.5.2", + "@testing-library/react": "^16.2.0", + "@testing-library/user-event": "^14.6.0", "@types/body-parser": "^1.19.5", "@types/cheerio": "^0.22.30", "@types/child-process-promise": "^2.2.1", @@ -307,7 +307,7 @@ "@types/node-uuid": "^0.0.28", "@types/nodemailer": "^6.4.16", "@types/prop-types": "^15.7.3", - "@types/qs": "^6.9.17", + "@types/qs": "^6.9.18", "@types/react": "^18.3.1", "@types/react-dnd": "^3.0.2", "@types/react-dom": "^18.0.9", @@ -370,7 +370,7 @@ "node-polyfill-webpack-plugin": "^4.1.0", "nodemon": "^3.1.9", "plop": "^4.0.1", - "postcss": "8.5.0", + "postcss": "8.5.1", "prettier": "3.4.2", "puppeteer": "^13.5.2", "react-dnd-test-backend": "16.0.1", diff --git a/yarn.lock b/yarn.lock index 95c6da1232..aa008660e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -107,34 +107,32 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-sdk/client-s3@3.726.1": - version "3.726.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.726.1.tgz#05e9ae74be18758fc9d05a053777a8bb919fb24c" - integrity sha512-UpOGcob87DiuS2d3fW6vDZg94g57mNiOSkzvR/6GOdvBSlUgk8LLwVzGASB71FdKMl1EGEr4MeD5uKH9JsG+dw== +"@aws-sdk/client-s3@3.731.1": + version "3.731.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.731.1.tgz#39e30fced96784e875b902cfb73ea42138e7601f" + integrity sha512-Ab2PA/8Th6JkurCkxnQJZHPE/JnnSsX/XHQzirkQb+JpKOyWMRC/YZUBfAaiwhxqX65RHgklrwil+UbFl4TtAQ== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.726.0" - "@aws-sdk/client-sts" "3.726.1" - "@aws-sdk/core" "3.723.0" - "@aws-sdk/credential-provider-node" "3.726.0" - "@aws-sdk/middleware-bucket-endpoint" "3.726.0" - "@aws-sdk/middleware-expect-continue" "3.723.0" - "@aws-sdk/middleware-flexible-checksums" "3.723.0" - "@aws-sdk/middleware-host-header" "3.723.0" - "@aws-sdk/middleware-location-constraint" "3.723.0" - "@aws-sdk/middleware-logger" "3.723.0" - "@aws-sdk/middleware-recursion-detection" "3.723.0" - "@aws-sdk/middleware-sdk-s3" "3.723.0" - "@aws-sdk/middleware-ssec" "3.723.0" - "@aws-sdk/middleware-user-agent" "3.726.0" - "@aws-sdk/region-config-resolver" "3.723.0" - "@aws-sdk/signature-v4-multi-region" "3.723.0" - "@aws-sdk/types" "3.723.0" - "@aws-sdk/util-endpoints" "3.726.0" - "@aws-sdk/util-user-agent-browser" "3.723.0" - "@aws-sdk/util-user-agent-node" "3.726.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/credential-provider-node" "3.731.1" + "@aws-sdk/middleware-bucket-endpoint" "3.731.0" + "@aws-sdk/middleware-expect-continue" "3.731.0" + "@aws-sdk/middleware-flexible-checksums" "3.731.0" + "@aws-sdk/middleware-host-header" "3.731.0" + "@aws-sdk/middleware-location-constraint" "3.731.0" + "@aws-sdk/middleware-logger" "3.731.0" + "@aws-sdk/middleware-recursion-detection" "3.731.0" + "@aws-sdk/middleware-sdk-s3" "3.731.0" + "@aws-sdk/middleware-ssec" "3.731.0" + "@aws-sdk/middleware-user-agent" "3.731.0" + "@aws-sdk/region-config-resolver" "3.731.0" + "@aws-sdk/signature-v4-multi-region" "3.731.0" + "@aws-sdk/types" "3.731.0" + "@aws-sdk/util-endpoints" "3.731.0" + "@aws-sdk/util-user-agent-browser" "3.731.0" + "@aws-sdk/util-user-agent-node" "3.731.0" "@aws-sdk/xml-builder" "3.723.0" "@smithy/config-resolver" "^4.0.0" "@smithy/core" "^3.0.0" @@ -171,24 +169,23 @@ "@smithy/util-waiter" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.726.0.tgz#6c83f6f95f15a7557f84c0d9ccd3f489368601a8" - integrity sha512-5JzTX9jwev7+y2Jkzjz0pd1wobB5JQfPOQF3N2DrJ5Pao0/k6uRYwE4NqB0p0HlGrMTDm7xNq7OSPPIPG575Jw== +"@aws-sdk/client-sso@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.731.0.tgz#6e3c13f9865863ad1fdedf848710d5fe9aa0cad6" + integrity sha512-O4C/UYGgqMsBg21MMApFdgyh8BX568hQhbdoNFmRVTBoSnCZ3w+H4a1wBPX4Gyl0NX+ab6Xxo9rId8HiyPXJ0A== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.723.0" - "@aws-sdk/credential-provider-node" "3.726.0" - "@aws-sdk/middleware-host-header" "3.723.0" - "@aws-sdk/middleware-logger" "3.723.0" - "@aws-sdk/middleware-recursion-detection" "3.723.0" - "@aws-sdk/middleware-user-agent" "3.726.0" - "@aws-sdk/region-config-resolver" "3.723.0" - "@aws-sdk/types" "3.723.0" - "@aws-sdk/util-endpoints" "3.726.0" - "@aws-sdk/util-user-agent-browser" "3.723.0" - "@aws-sdk/util-user-agent-node" "3.726.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/middleware-host-header" "3.731.0" + "@aws-sdk/middleware-logger" "3.731.0" + "@aws-sdk/middleware-recursion-detection" "3.731.0" + "@aws-sdk/middleware-user-agent" "3.731.0" + "@aws-sdk/region-config-resolver" "3.731.0" + "@aws-sdk/types" "3.731.0" + "@aws-sdk/util-endpoints" "3.731.0" + "@aws-sdk/util-user-agent-browser" "3.731.0" + "@aws-sdk/util-user-agent-node" "3.731.0" "@smithy/config-resolver" "^4.0.0" "@smithy/core" "^3.0.0" "@smithy/fetch-http-handler" "^5.0.0" @@ -216,102 +213,12 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.726.0.tgz#802a9a8d22db029361b859ae4a079ad680c98db4" - integrity sha512-NM5pjv2qglEc4XN3nnDqtqGsSGv1k5YTmzDo3W3pObItHmpS8grSeNfX9zSH+aVl0Q8hE4ZIgvTPNZ+GzwVlqg== +"@aws-sdk/core@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.731.0.tgz#86b7cbdd63b20aa5e6339536d2c94a728dd4d83c" + integrity sha512-ithBN1VWASkvAIlozJmenqDvNnFddr/SZXAs58+jCnBHgy3tXLHABZGVNCjetZkHRqNdXEO1kirnoxaFeXMeDA== dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.723.0" - "@aws-sdk/middleware-host-header" "3.723.0" - "@aws-sdk/middleware-logger" "3.723.0" - "@aws-sdk/middleware-recursion-detection" "3.723.0" - "@aws-sdk/middleware-user-agent" "3.726.0" - "@aws-sdk/region-config-resolver" "3.723.0" - "@aws-sdk/types" "3.723.0" - "@aws-sdk/util-endpoints" "3.726.0" - "@aws-sdk/util-user-agent-browser" "3.723.0" - "@aws-sdk/util-user-agent-node" "3.726.0" - "@smithy/config-resolver" "^4.0.0" - "@smithy/core" "^3.0.0" - "@smithy/fetch-http-handler" "^5.0.0" - "@smithy/hash-node" "^4.0.0" - "@smithy/invalid-dependency" "^4.0.0" - "@smithy/middleware-content-length" "^4.0.0" - "@smithy/middleware-endpoint" "^4.0.0" - "@smithy/middleware-retry" "^4.0.0" - "@smithy/middleware-serde" "^4.0.0" - "@smithy/middleware-stack" "^4.0.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/node-http-handler" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/smithy-client" "^4.0.0" - "@smithy/types" "^4.0.0" - "@smithy/url-parser" "^4.0.0" - "@smithy/util-base64" "^4.0.0" - "@smithy/util-body-length-browser" "^4.0.0" - "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.0" - "@smithy/util-defaults-mode-node" "^4.0.0" - "@smithy/util-endpoints" "^3.0.0" - "@smithy/util-middleware" "^4.0.0" - "@smithy/util-retry" "^4.0.0" - "@smithy/util-utf8" "^4.0.0" - tslib "^2.6.2" - -"@aws-sdk/client-sts@3.726.1": - version "3.726.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.726.1.tgz#49ab471db7e04792db24e181f8bb8c7787739b34" - integrity sha512-qh9Q9Vu1hrM/wMBOBIaskwnE4GTFaZu26Q6WHwyWNfj7J8a40vBxpW16c2vYXHLBtwRKM1be8uRLkmDwghpiNw== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.726.0" - "@aws-sdk/core" "3.723.0" - "@aws-sdk/credential-provider-node" "3.726.0" - "@aws-sdk/middleware-host-header" "3.723.0" - "@aws-sdk/middleware-logger" "3.723.0" - "@aws-sdk/middleware-recursion-detection" "3.723.0" - "@aws-sdk/middleware-user-agent" "3.726.0" - "@aws-sdk/region-config-resolver" "3.723.0" - "@aws-sdk/types" "3.723.0" - "@aws-sdk/util-endpoints" "3.726.0" - "@aws-sdk/util-user-agent-browser" "3.723.0" - "@aws-sdk/util-user-agent-node" "3.726.0" - "@smithy/config-resolver" "^4.0.0" - "@smithy/core" "^3.0.0" - "@smithy/fetch-http-handler" "^5.0.0" - "@smithy/hash-node" "^4.0.0" - "@smithy/invalid-dependency" "^4.0.0" - "@smithy/middleware-content-length" "^4.0.0" - "@smithy/middleware-endpoint" "^4.0.0" - "@smithy/middleware-retry" "^4.0.0" - "@smithy/middleware-serde" "^4.0.0" - "@smithy/middleware-stack" "^4.0.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/node-http-handler" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/smithy-client" "^4.0.0" - "@smithy/types" "^4.0.0" - "@smithy/url-parser" "^4.0.0" - "@smithy/util-base64" "^4.0.0" - "@smithy/util-body-length-browser" "^4.0.0" - "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.0" - "@smithy/util-defaults-mode-node" "^4.0.0" - "@smithy/util-endpoints" "^3.0.0" - "@smithy/util-middleware" "^4.0.0" - "@smithy/util-retry" "^4.0.0" - "@smithy/util-utf8" "^4.0.0" - tslib "^2.6.2" - -"@aws-sdk/core@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.723.0.tgz#7a441b1362fa22609f80ede42d4e069829b9b4d1" - integrity sha512-UraXNmvqj3vScSsTkjMwQkhei30BhXlW5WxX6JacMKVtl95c7z0qOXquTWeTalYkFfulfdirUhvSZrl+hcyqTw== - dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/core" "^3.0.0" "@smithy/node-config-provider" "^4.0.0" "@smithy/property-provider" "^4.0.0" @@ -323,24 +230,24 @@ fast-xml-parser "4.4.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.723.0.tgz#7d85014d21ce50f9f6a108c5c673e87c54860eaa" - integrity sha512-OuH2yULYUHTVDUotBoP/9AEUIJPn81GQ/YBtZLoo2QyezRJ2QiO/1epVtbJlhNZRwXrToLEDmQGA2QfC8c7pbA== +"@aws-sdk/credential-provider-env@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.731.0.tgz#456bee6ac9911f48c17f64a2955aa187cc91ef21" + integrity sha512-h0WWZg4QMLgFVyIvQrC43zpVqsUWg1mPM1clpogP43B8+wEhDEQ4qWRzvFs3dQ4cqx/FLyDUZZF4cqgd94z7kw== dependencies: - "@aws-sdk/core" "3.723.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/types" "3.731.0" "@smithy/property-provider" "^4.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.723.0.tgz#3b5db3225bb6dd97fecf22e18c06c3567eb1bce4" - integrity sha512-DTsKC6xo/kz/ZSs1IcdbQMTgiYbpGTGEd83kngFc1bzmw7AmK92DBZKNZpumf8R/UfSpTcj9zzUUmrWz1kD0eQ== +"@aws-sdk/credential-provider-http@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.731.0.tgz#f3a2264744bd6af1c1de61b5ce2079c36f875fb3" + integrity sha512-iRtrjtcYaWgbvtu2cvDhIsPWXZGvhy1Hgks4682MEBNTc9AUwlfvDrYz2EEnTtJJyrbOdEHVrYrzqD8qPyVLCg== dependencies: - "@aws-sdk/core" "3.723.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/types" "3.731.0" "@smithy/fetch-http-handler" "^5.0.0" "@smithy/node-http-handler" "^4.0.0" "@smithy/property-provider" "^4.0.0" @@ -350,85 +257,87 @@ "@smithy/util-stream" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.726.0.tgz#25115ecb3814f3f8e106cf12f5f34ab247095244" - integrity sha512-seTtcKL2+gZX6yK1QRPr5mDJIBOatrpoyrO8D5b8plYtV/PDbDW3mtDJSWFHet29G61ZmlNElyXRqQCXn9WX+A== - dependencies: - "@aws-sdk/core" "3.723.0" - "@aws-sdk/credential-provider-env" "3.723.0" - "@aws-sdk/credential-provider-http" "3.723.0" - "@aws-sdk/credential-provider-process" "3.723.0" - "@aws-sdk/credential-provider-sso" "3.726.0" - "@aws-sdk/credential-provider-web-identity" "3.723.0" - "@aws-sdk/types" "3.723.0" +"@aws-sdk/credential-provider-ini@3.731.1": + version "3.731.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.731.1.tgz#eade17c4086ac67be0a75e8b5414ba9777d178d7" + integrity sha512-0M0ejuqW8iHNcTH2ZXSY9m+I7Y06qVkj6k3vfQU9XaB//mTUCxxfGfqWAtgfr7Yi73egABTcPc0jyPdcvSW4Kw== + dependencies: + "@aws-sdk/core" "3.731.0" + "@aws-sdk/credential-provider-env" "3.731.0" + "@aws-sdk/credential-provider-http" "3.731.0" + "@aws-sdk/credential-provider-process" "3.731.0" + "@aws-sdk/credential-provider-sso" "3.731.1" + "@aws-sdk/credential-provider-web-identity" "3.731.1" + "@aws-sdk/nested-clients" "3.731.1" + "@aws-sdk/types" "3.731.0" "@smithy/credential-provider-imds" "^4.0.0" "@smithy/property-provider" "^4.0.0" "@smithy/shared-ini-file-loader" "^4.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.726.0.tgz#a997ea8e8e871e77cbebf6c8a6179d6f6af8897c" - integrity sha512-jjsewBcw/uLi24x8JbnuDjJad4VA9ROCE94uVRbEnGmUEsds75FWOKp3fWZLQlmjLtzsIbJOZLALkZP86liPaw== - dependencies: - "@aws-sdk/credential-provider-env" "3.723.0" - "@aws-sdk/credential-provider-http" "3.723.0" - "@aws-sdk/credential-provider-ini" "3.726.0" - "@aws-sdk/credential-provider-process" "3.723.0" - "@aws-sdk/credential-provider-sso" "3.726.0" - "@aws-sdk/credential-provider-web-identity" "3.723.0" - "@aws-sdk/types" "3.723.0" +"@aws-sdk/credential-provider-node@3.731.1": + version "3.731.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.731.1.tgz#2399fdcfd93ecc7f8a2c83f0580d8f16c63b65f8" + integrity sha512-5c0ZiagMTPmWilXNffeXJCLoCEz97jilHr3QJWwf2GaTay4tzN+Ld71rpdfEenzUR7fuxEWFfVlwQbFOzFNYHg== + dependencies: + "@aws-sdk/credential-provider-env" "3.731.0" + "@aws-sdk/credential-provider-http" "3.731.0" + "@aws-sdk/credential-provider-ini" "3.731.1" + "@aws-sdk/credential-provider-process" "3.731.0" + "@aws-sdk/credential-provider-sso" "3.731.1" + "@aws-sdk/credential-provider-web-identity" "3.731.1" + "@aws-sdk/types" "3.731.0" "@smithy/credential-provider-imds" "^4.0.0" "@smithy/property-provider" "^4.0.0" "@smithy/shared-ini-file-loader" "^4.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.723.0.tgz#32bc55573b0a8f31e69b15939202d266adbbe711" - integrity sha512-fgupvUjz1+jeoCBA7GMv0L6xEk92IN6VdF4YcFhsgRHlHvNgm7ayaoKQg7pz2JAAhG/3jPX6fp0ASNy+xOhmPA== +"@aws-sdk/credential-provider-process@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.731.0.tgz#50cc40fa1919d6fc8ac9b8dea26b3ce317f15ece" + integrity sha512-6yNMY6q3xHLbs2f2+C6GhvMrjTgtFBiPJJqKaPLsTIhlTRvh4sK8pGm3ITcma0jOxtPDIuoPfBAV8N8XVMBlZg== dependencies: - "@aws-sdk/core" "3.723.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/types" "3.731.0" "@smithy/property-provider" "^4.0.0" "@smithy/shared-ini-file-loader" "^4.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.726.0.tgz#460dbc65e3d8dfd151d7b41e2da85ba7e7cc1f0a" - integrity sha512-WxkN76WeB08j2yw7jUH9yCMPxmT9eBFd9ZA/aACG7yzOIlsz7gvG3P2FQ0tVg25GHM0E4PdU3p/ByTOawzcOAg== +"@aws-sdk/credential-provider-sso@3.731.1": + version "3.731.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.731.1.tgz#bb2228a5cfac6521741e69a74c2db57ab0ceb0e4" + integrity sha512-p1tp+rMUf5YNQLr8rVRmDgNtKGYLL0KCdq3K2hwwvFnx9MjReF1sA4lfm3xWsxBQM+j3QN9AvMQqBzDJ+NOSdw== dependencies: - "@aws-sdk/client-sso" "3.726.0" - "@aws-sdk/core" "3.723.0" - "@aws-sdk/token-providers" "3.723.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/client-sso" "3.731.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/token-providers" "3.731.1" + "@aws-sdk/types" "3.731.0" "@smithy/property-provider" "^4.0.0" "@smithy/shared-ini-file-loader" "^4.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.723.0.tgz#5c17ea243b05b4dca0584db597ac68d8509dd754" - integrity sha512-tl7pojbFbr3qLcOE6xWaNCf1zEfZrIdSJtOPeSXfV/thFMMAvIjgf3YN6Zo1a6cxGee8zrV/C8PgOH33n+Ev/A== +"@aws-sdk/credential-provider-web-identity@3.731.1": + version "3.731.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.731.1.tgz#1bb7b21ae579cbcc0b111e29319a2b5bdc187e85" + integrity sha512-+ynAvEGWDR5ZJFxgpwwzhvlQ3WQ7BleWXU6JwpIw3yFrD4eZEn85b8DZC1aEz7C9kb1HSV6B3gpqHqlyS6wj8g== dependencies: - "@aws-sdk/core" "3.723.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/nested-clients" "3.731.1" + "@aws-sdk/types" "3.731.0" "@smithy/property-provider" "^4.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-bucket-endpoint@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.726.0.tgz#9ba221dcc75f0415b2c854400477454aa87992d2" - integrity sha512-vpaP80rZqwu0C3ELayIcRIW84/nd1tadeoqllT+N9TDshuEvq4UJ+w47OBHB7RkHFJoc79lXXNYle0fdQdaE/A== +"@aws-sdk/middleware-bucket-endpoint@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.731.0.tgz#e4a9c60dad7314682bdfdc30caa010ddda1739d3" + integrity sha512-G9vuGW5GWCbzGOwlGFJcOkfxhw1cB6vzcv75QTT0CmciLXK+Cio8O2pqMSTTF2kg9Y6iHVC2BlOtLRkJAVOxVQ== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@aws-sdk/util-arn-parser" "3.723.0" "@smithy/node-config-provider" "^4.0.0" "@smithy/protocol-http" "^5.0.0" @@ -436,26 +345,26 @@ "@smithy/util-config-provider" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-expect-continue@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.723.0.tgz#59addac9b4cdc958ea1e06de9863db657e9c8e43" - integrity sha512-w/O0EkIzkiqvGu7U8Ke7tue0V0HYM5dZQrz6nVU+R8T2LddWJ+njEIHU4Wh8aHPLQXdZA5NQumv0xLPdEutykw== +"@aws-sdk/middleware-expect-continue@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.731.0.tgz#1874d6210ddbbb5bb9faf47606a70b6cff52b7f9" + integrity sha512-oY4nsY/mb5O5eZCzIuWpyvzO45Bi6UBtE48IaJsoyVctagA1l8hB66aczH9M1NHNjvbS4Beu1agwh3Nyb1eJug== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/protocol-http" "^5.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.723.0.tgz#612ec13c4ba5dc906793172ece02a95059fffcc6" - integrity sha512-JY76mrUCLa0FHeMZp8X9+KK6uEuZaRZaQrlgq6zkXX/3udukH0T3YdFC+Y9uw5ddbiwZ5+KwgmlhnPpiXKfP4g== +"@aws-sdk/middleware-flexible-checksums@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.731.0.tgz#ca3fa5354d92a56633e3762118299da1f34afebd" + integrity sha512-LMs/rndovYjYSntSYyPE/PIl4iHNiquaU0lpDqpQc9iTgQcNbjdriSUWpibgu1jXlGBpBYCqttNkxmEThbbWxA== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" "@aws-crypto/util" "5.2.0" - "@aws-sdk/core" "3.723.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/types" "3.731.0" "@smithy/is-array-buffer" "^4.0.0" "@smithy/node-config-provider" "^4.0.0" "@smithy/protocol-http" "^5.0.0" @@ -465,51 +374,51 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.723.0.tgz#f043689755e5b45ee6500b0d0a7090d9b4a864f7" - integrity sha512-LLVzLvk299pd7v4jN9yOSaWDZDfH0SnBPb6q+FDPaOCMGBY8kuwQso7e/ozIKSmZHRMGO3IZrflasHM+rI+2YQ== +"@aws-sdk/middleware-host-header@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.731.0.tgz#7f62d4d1d6243bdba4c8737fc34668c95c6d0e1b" + integrity sha512-ndAJsm5uWPPJRZowLKpB1zuL17qWlWVtCJP4I/ynBkq1PU1DijDXBul2UZaG6Mpvsgms1NXo/h9noHuK7T3v8w== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/protocol-http" "^5.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-location-constraint@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.723.0.tgz#364e875a511d97431b6d337878c8a9bd5e2fdf64" - integrity sha512-inp9tyrdRWjGOMu1rzli8i2gTo0P4X6L7nNRXNTKfyPNZcBimZ4H0H1B671JofSI5isaklVy5r4pvv2VjjLSHw== +"@aws-sdk/middleware-location-constraint@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.731.0.tgz#cedeeed9d12f6474e09823d5a1d26b2fe892a0f7" + integrity sha512-1I2EjAFxrQksrzqdN7YYuY/q2YsjqeX4l7f9VOkdBjiZeDvVIEdM99IT5sISJB/r6CjNrYX5MhqGhE8i1VFchA== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.723.0.tgz#e8718056fc2d73a0d51308cad20676228be26652" - integrity sha512-chASQfDG5NJ8s5smydOEnNK7N0gDMyuPbx7dYYcm1t/PKtnVfvWF+DHCTrRC2Ej76gLJVCVizlAJKM8v8Kg3cg== +"@aws-sdk/middleware-logger@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.731.0.tgz#8ab06f4c6c27be8893e3eb256d686e2bee5c4bf6" + integrity sha512-IIZrOdjbY2vKzPJPrwE7FoFQCIPEL6UqURi8LEaiVyCag4p2fvaTN5pgKuQtGC2+iYd/HHcGT4qn2bAqF5Jmmw== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.723.0.tgz#b4557c7f554492f56eeb0cbf5bc02dac7ef102a8" - integrity sha512-7usZMtoynT9/jxL/rkuDOFQ0C2mhXl4yCm67Rg7GNTstl67u7w5WN1aIRImMeztaKlw8ExjoTyo6WTs1Kceh7A== +"@aws-sdk/middleware-recursion-detection@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.731.0.tgz#c16057884029d9b10a822a47bfd51f59f3f8bf3a" + integrity sha512-y6FLASB1iKWuR5tUipMyo77bt0lEl3OnCrrd2xw/H24avq1HhJjjPR0HHhJE6QKJzF/FYXeV88tcyPSMe32VDw== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/protocol-http" "^5.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.723.0.tgz#d323c24b2268933bf51353d5215fa8baadaf8837" - integrity sha512-wfjOvNJVp8LDWhq4wO5jtSMb8Vgf4tNlR7QTEQfoYc6AGU3WlK5xyUQcpfcpwytEhQTN9u0cJLQpSyXDO+qSCw== +"@aws-sdk/middleware-sdk-s3@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.731.0.tgz#b8830d6362602f0225cf8759359beabfa8d8e89c" + integrity sha512-J9aKyQaVoec5eWTSDfO4h2sKHNP0wTzN15LFcHnkD+e/d0rdmOi7BTkkbJrIaynma9WShIasmrtM3HNi9GiiTA== dependencies: - "@aws-sdk/core" "3.723.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/types" "3.731.0" "@aws-sdk/util-arn-parser" "3.723.0" "@smithy/core" "^3.0.0" "@smithy/node-config-provider" "^4.0.0" @@ -523,67 +432,112 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-ssec@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.723.0.tgz#b4adb65eb4ac029ee8b566f373b1d54aecbbd7ad" - integrity sha512-Bs+8RAeSMik6ZYCGSDJzJieGsDDh2fRbh1HQG94T8kpwBXVxMYihm6e9Xp2cyl+w9fyyCnh0IdCKChP/DvrdhA== +"@aws-sdk/middleware-ssec@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.731.0.tgz#1f0fe23bfb30b0de203e07d2b5f30233b1f55997" + integrity sha512-1HP4lxGcQx4awXgxfL8t9faBK7TqEL7zkAZrm/YBbLrT9oQomxZOHKIOHvo5VVh4qmsNBdqnH2XUlSMY71gsww== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.726.0.tgz#d8a791c61adca1f26332ce5128da7aa6c1433e89" - integrity sha512-hZvzuE5S0JmFie1r68K2wQvJbzyxJFdzltj9skgnnwdvLe8F/tz7MqLkm28uV0m4jeHk0LpiBo6eZaPkQiwsZQ== +"@aws-sdk/middleware-user-agent@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.731.0.tgz#5a0c2b118c1a63a37cc4d4db1eb585115ffe4285" + integrity sha512-Ngr2Gz0aec/uduoKaO3srN52SYkEHndYtFzkK/gDUyQwQzi4ha2eIisxPiuHEX6RvXT31V9ouqn/YtVkt0R76A== dependencies: - "@aws-sdk/core" "3.723.0" - "@aws-sdk/types" "3.723.0" - "@aws-sdk/util-endpoints" "3.726.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/types" "3.731.0" + "@aws-sdk/util-endpoints" "3.731.0" "@smithy/core" "^3.0.0" "@smithy/protocol-http" "^5.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.723.0.tgz#07b7ee4788ec7a7f5638bbbe0f9f7565125caf22" - integrity sha512-tGF/Cvch3uQjZIj34LY2mg8M2Dr4kYG8VU8Yd0dFnB1ybOEOveIK/9ypUo9ycZpB9oO6q01KRe5ijBaxNueUQg== +"@aws-sdk/nested-clients@3.731.1": + version "3.731.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.731.1.tgz#b60839691f0bbdcb1a1efe8668b1b814704811e6" + integrity sha512-/L8iVrulnXZl+kgmTn+oxRxNnhcSIbf+r12C06vGUq60w0YMidLvxJZN7vt8H9SnCAGCHqud2MS7ExCEvhc0gA== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.731.0" + "@aws-sdk/middleware-host-header" "3.731.0" + "@aws-sdk/middleware-logger" "3.731.0" + "@aws-sdk/middleware-recursion-detection" "3.731.0" + "@aws-sdk/middleware-user-agent" "3.731.0" + "@aws-sdk/region-config-resolver" "3.731.0" + "@aws-sdk/types" "3.731.0" + "@aws-sdk/util-endpoints" "3.731.0" + "@aws-sdk/util-user-agent-browser" "3.731.0" + "@aws-sdk/util-user-agent-node" "3.731.0" + "@smithy/config-resolver" "^4.0.0" + "@smithy/core" "^3.0.0" + "@smithy/fetch-http-handler" "^5.0.0" + "@smithy/hash-node" "^4.0.0" + "@smithy/invalid-dependency" "^4.0.0" + "@smithy/middleware-content-length" "^4.0.0" + "@smithy/middleware-endpoint" "^4.0.0" + "@smithy/middleware-retry" "^4.0.0" + "@smithy/middleware-serde" "^4.0.0" + "@smithy/middleware-stack" "^4.0.0" + "@smithy/node-config-provider" "^4.0.0" + "@smithy/node-http-handler" "^4.0.0" + "@smithy/protocol-http" "^5.0.0" + "@smithy/smithy-client" "^4.0.0" + "@smithy/types" "^4.0.0" + "@smithy/url-parser" "^4.0.0" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.0" + "@smithy/util-defaults-mode-node" "^4.0.0" + "@smithy/util-endpoints" "^3.0.0" + "@smithy/util-middleware" "^4.0.0" + "@smithy/util-retry" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.731.0.tgz#d7508a1489b43a0767553c82f58c83788bbe3673" + integrity sha512-XlDpRNkDVHF59f07JmkuAidEv//m3hT6/JL85h0l3+zrpaRWhf8n8lVUyAPNq35ZujK8AcorYM+93u7hdWsliQ== + dependencies: + "@aws-sdk/types" "3.731.0" "@smithy/node-config-provider" "^4.0.0" "@smithy/types" "^4.0.0" "@smithy/util-config-provider" "^4.0.0" "@smithy/util-middleware" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.723.0.tgz#1de81c7ee98410dabbb22978bc5d4540c51a8afa" - integrity sha512-lJlVAa5Sl589qO8lwMLVUtnlF1Q7I+6k1Iomv2goY9d1bRl4q2N5Pit2qJVr2AMW0sceQXeh23i2a/CKOqVAdg== +"@aws-sdk/signature-v4-multi-region@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.731.0.tgz#a6b347ce682cf0812caa2fd50cf58b2f3c02c286" + integrity sha512-1r/b4Os15dR+BCVRRLVQJMF7Krq6xX6IKHxN43kuvODYWz8Nv3XDlaSpeRpAzyJuzW/fTp4JgE+z0+gmJfdEeA== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.723.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/middleware-sdk-s3" "3.731.0" + "@aws-sdk/types" "3.731.0" "@smithy/protocol-http" "^5.0.0" "@smithy/signature-v4" "^5.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.723.0.tgz#ae173a18783886e592212abb820d28cbdb9d9237" - integrity sha512-hniWi1x4JHVwKElANh9afKIMUhAutHVBRD8zo6usr0PAoj+Waf220+1ULS74GXtLXAPCiNXl5Og+PHA7xT8ElQ== +"@aws-sdk/token-providers@3.731.1": + version "3.731.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.731.1.tgz#02cd2ed586635f1ccdc91a1763994dbb545f9983" + integrity sha512-t34GOPwBZsX7zGHjiTXmMHGY3kHM7fLiQ60Jqk0On9P0ASHTDE5U75RgCXboE3u+qEv9wyKyaqMNyMWj9qQlFg== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/nested-clients" "3.731.1" + "@aws-sdk/types" "3.731.0" "@smithy/property-provider" "^4.0.0" "@smithy/shared-ini-file-loader" "^4.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/types@3.723.0", "@aws-sdk/types@^3.222.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.723.0.tgz#f0c5a6024a73470421c469b6c1dd5bc4b8fb851b" - integrity sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA== +"@aws-sdk/types@3.731.0", "@aws-sdk/types@^3.222.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.731.0.tgz#c35cc2a8c4c9eca768563037ffbdc0cb599f4cd4" + integrity sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q== dependencies: "@smithy/types" "^4.0.0" tslib "^2.6.2" @@ -595,12 +549,12 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.726.0.tgz#0b39d4e2fe4b8b4a35d7e3714f1ed126114befd9" - integrity sha512-sLd30ASsPMoPn3XBK50oe/bkpJ4N8Bpb7SbhoxcY3Lk+fSASaWxbbXE81nbvCnkxrZCvkPOiDHzJCp1E2im71A== +"@aws-sdk/util-endpoints@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.731.0.tgz#21822554efd1f9a22742a4163a312a5dc9372a46" + integrity sha512-riztxTAfncFS9yQWcBJffGgOgLoKSa63ph+rxWJxKl6BHAmWEvHICj1qDcVmnWfIcvJ5cClclY75l9qKaUH7rQ== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/types" "^4.0.0" "@smithy/util-endpoints" "^3.0.0" tslib "^2.6.2" @@ -612,23 +566,23 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-user-agent-browser@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.723.0.tgz#64b0b4413c1be1585f95c3e2606429cc9f86df83" - integrity sha512-Wh9I6j2jLhNFq6fmXydIpqD1WyQLyTfSxjW9B+PXSnPyk3jtQW8AKQur7p97rO8LAUzVI0bv8kb3ZzDEVbquIg== +"@aws-sdk/util-user-agent-browser@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.731.0.tgz#09139c7a5d04b0d07571f57b405ca71f761e4d3a" + integrity sha512-EnYXxTkCNCjTTBjW/pelRPv4Thsi9jepoB6qQjPMA9/ixrZ71BhhQecz9kgqzZLR9BPCwb6hgJ/Yd702jqJ4aQ== dependencies: - "@aws-sdk/types" "3.723.0" + "@aws-sdk/types" "3.731.0" "@smithy/types" "^4.0.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.726.0.tgz#f093568a730b0d58ef7eca231f27309b11b8ef61" - integrity sha512-iEj6KX9o6IQf23oziorveRqyzyclWai95oZHDJtYav3fvLJKStwSjygO4xSF7ycHcTYeCHSLO1FFOHgGVs4Viw== +"@aws-sdk/util-user-agent-node@3.731.0": + version "3.731.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.731.0.tgz#97751200f073326b170263aabc43d1c01b6520bf" + integrity sha512-Rze78Ym5Bx7aWMvmZE2iL3JPo2INNCC5N9rLVx98Gg1G0ZaxclVRUvJrh1AojNlOFxU+otkxAe7FA3Foy2iLLQ== dependencies: - "@aws-sdk/middleware-user-agent" "3.726.0" - "@aws-sdk/types" "3.723.0" + "@aws-sdk/middleware-user-agent" "3.731.0" + "@aws-sdk/types" "3.731.0" "@smithy/node-config-provider" "^4.0.0" "@smithy/types" "^4.0.0" tslib "^2.6.2" @@ -1728,10 +1682,10 @@ react-is "^18.2.0" react-shallow-renderer "^16.15.0" -"@chromatic-com/storybook@^3.2.3": - version "3.2.3" - resolved "https://registry.yarnpkg.com/@chromatic-com/storybook/-/storybook-3.2.3.tgz#0f4d167ac80fcb38293a92c230c43446049b6758" - integrity sha512-3+hfANx79kIjP1qrOSLxpoAXOiYUA0S7A0WI0A24kASrv7USFNNW8etR5TjUilMb0LmqKUn3wDwUK2h6aceQ9g== +"@chromatic-com/storybook@^3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@chromatic-com/storybook/-/storybook-3.2.4.tgz#8cb44d9475be18675498b17a6c6ad479872a35f1" + integrity sha512-5/bOOYxfwZ2BktXeqcCpOVAoR6UCoeART5t9FVy22hoo8F291zOuX4y3SDgm10B1GVU/ZTtJWPT2X9wZFlxYLg== dependencies: chromatic "^11.15.0" filesize "^10.0.12" @@ -3043,10 +2997,10 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.20.0.tgz#03554155b45d8b529adf635b2f6ad1165d70d8b4" integrity sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg== -"@remix-run/router@1.21.0": - version "1.21.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.0.tgz#c65ae4262bdcfe415dbd4f64ec87676e4a56e2b5" - integrity sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA== +"@remix-run/router@1.21.1": + version "1.21.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.1.tgz#bf15274d3856c395402719fa6b1dc8cc5245aaf7" + integrity sha512-KeBYSwohb8g4/wCcnksvKTYlg69O62sQeLynn2YE+5z7JWEj95if27kclW9QqbrlsQ2DINI8fjbV3zyuKfwjKg== "@rtsao/scc@^1.1.0": version "1.1.0" @@ -4160,18 +4114,23 @@ lodash "^4.17.21" redent "^3.0.0" -"@testing-library/react@^16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.1.0.tgz#aa0c61398bac82eaf89776967e97de41ac742d71" - integrity sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg== +"@testing-library/react@^16.2.0": + version "16.2.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.2.0.tgz#c96126ee01a49cdb47175721911b4a9432afc601" + integrity sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ== dependencies: "@babel/runtime" "^7.12.5" -"@testing-library/user-event@14.5.2", "@testing-library/user-event@^14.5.2": +"@testing-library/user-event@14.5.2": version "14.5.2" resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== +"@testing-library/user-event@^14.6.0": + version "14.6.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.0.tgz#6748ec1ac6df9291e92b6abc0f3530b3842bf34d" + integrity sha512-+jsfK7kVJbqnCYtLTln8Ja/NmVrZRwBJHmHR9IxIVccMWSOZ6Oy0FkDJNeyVu4QSpMNmRfy10Xb76ObRDlWWBQ== + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -4727,10 +4686,10 @@ dependencies: "@types/node" "*" -"@types/qs@*", "@types/qs@^6.9.17": - version "6.9.17" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" - integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== +"@types/qs@*", "@types/qs@^6.9.18": + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== "@types/range-parser@*": version "1.2.3" @@ -9319,10 +9278,10 @@ fined@^2.0.0: object.pick "^1.3.0" parse-filepath "^1.0.2" -flag-icons@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/flag-icons/-/flag-icons-7.2.3.tgz#b67f379fa0ef28c4e605319a78035131bdd8ced7" - integrity sha512-X2gUdteNuqdNqob2KKTJTS+ZCvyWeLCtDz9Ty8uJP17Y4o82Y+U/Vd4JNrdwTAjagYsRznOn9DZ+E/Q52qbmqg== +flag-icons@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/flag-icons/-/flag-icons-7.3.2.tgz#c5ffaf25fb2be97498703a068fa699416bca9629" + integrity sha512-QkaZ6Zvai8LIjx+UNAHUJ5Dhz9OLZpBDwCRWxF6YErxIcR16jTkIFm3bFu54EkvKQy4+wicW+Gm7/0631wVQyQ== flagged-respawn@^2.0.0: version "2.0.0" @@ -11584,10 +11543,10 @@ joi@^17.6.0: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" -jotai@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.11.0.tgz#923f8351e0b2d721036af892c0ae25625049d120" - integrity sha512-zKfoBBD1uDw3rljwHkt0fWuja1B76R7CjznuBO+mSX6jpsO1EBeWNRKpeaQho9yPI/pvCv4recGfgOXGxwPZvQ== +jotai@2.11.1: + version "2.11.1" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.11.1.tgz#9fd12aaba8458783482c77c8d7038d6e974fc679" + integrity sha512-41Su098mpHIX29hF/XOpDb0SqF6EES7+HXfrhuBqVSzRkxX48hD5i8nGsEewWZNAsBWJCTTmuz8M946Ih2PfcQ== jpeg-js@^0.3.4: version "0.3.7" @@ -13891,10 +13850,10 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.5.0, postcss@^8.3.11, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47: - version "8.5.0" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.0.tgz#15244b9fd65f809b2819682456f0e7e1e30c145b" - integrity sha512-27VKOqrYfPncKA2NrFOVhP5MGAfHKLYn/Q0mz9cNQyRAKYi3VNHwYU2qKKqPCqgBmeeJ0uAFB56NumXZ5ZReXg== +postcss@8.5.1, postcss@^8.3.11, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47: + version "8.5.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214" + integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ== dependencies: nanoid "^3.3.8" picocolors "^1.1.1" @@ -14105,12 +14064,12 @@ qs@6.13.0: dependencies: side-channel "^1.0.6" -qs@^6.11.0, qs@^6.11.2, qs@^6.12.3, qs@^6.13.1: - version "6.13.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.1.tgz#3ce5fc72bd3a8171b85c99b93c65dd20b7d1b16e" - integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== +qs@^6.11.0, qs@^6.11.2, qs@^6.12.3, qs@^6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: - side-channel "^1.0.6" + side-channel "^1.1.0" querystring-es3@^0.2.1: version "0.2.1" @@ -15346,17 +15305,7 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -side-channel@^1.1.0: +side-channel@^1.0.4, side-channel@^1.0.6, side-channel@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== From 6ff97250ca3bacc4634dab9f1345dd76da79eeaf Mon Sep 17 00:00:00 2001 From: Joan Gallego Girona Date: Tue, 21 Jan 2025 10:16:55 +0100 Subject: [PATCH 23/69] Allow setting default data to appContext (#7603) --- app/api/permissions/permissionsContext.ts | 4 + app/api/utils/AppContext.ts | 8 +- app/api/utils/specs/appContext.spec.ts | 19 +++ app/worker.ts | 135 ++++++++++------------ 4 files changed, 94 insertions(+), 72 deletions(-) diff --git a/app/api/permissions/permissionsContext.ts b/app/api/permissions/permissionsContext.ts index 4bc8571198..491dfa271c 100644 --- a/app/api/permissions/permissionsContext.ts +++ b/app/api/permissions/permissionsContext.ts @@ -23,4 +23,8 @@ export const permissionsContext = { setCommandContext: () => { appContext.set('user', permissionsContext.commandUser); }, + + setCommandContextAsDefault: () => { + appContext.setValueAsDefault('user', permissionsContext.commandUser); + }, }; diff --git a/app/api/utils/AppContext.ts b/app/api/utils/AppContext.ts index bf14475915..238da00b29 100644 --- a/app/api/utils/AppContext.ts +++ b/app/api/utils/AppContext.ts @@ -7,6 +7,8 @@ interface ContextData { class AppContext { private storage = new AsyncLocalStorage(); + private defaultData: { [k: string]: any } = {}; + private getContextObject() { const data = this.storage.getStore(); if (!data) { @@ -17,7 +19,7 @@ class AppContext { async run(cb: () => Promise, data: ContextData = {}): Promise { return new Promise((resolve, reject) => { - this.storage.run(data, () => { + this.storage.run({ ...this.defaultData, ...data }, () => { cb().then(resolve).catch(reject); }); }); @@ -30,6 +32,10 @@ class AppContext { set(key: string, value: unknown) { this.getContextObject()[key] = value; } + + setValueAsDefault(key: string, value: unknown) { + this.defaultData[key] = value; + } } const appContext = new AppContext(); diff --git a/app/api/utils/specs/appContext.spec.ts b/app/api/utils/specs/appContext.spec.ts index 9c88db75ce..c770acda16 100644 --- a/app/api/utils/specs/appContext.spec.ts +++ b/app/api/utils/specs/appContext.spec.ts @@ -48,6 +48,25 @@ describe('appContext', () => { }); }); + describe('setValueAsDefault', () => { + it('should set a value that will be used as default when run is executed', async () => { + appContext.setValueAsDefault('defaultKey', 'defaultValue'); + await appContext.run( + async () => { + expect(appContext.get('defaultKey')).toBe('defaultValue'); + expect(appContext.get('tenant')).toBe('test_tenant'); + }, + { tenant: 'test_tenant' } + ); + await appContext.run( + async () => { + expect(appContext.get('defaultKey')).toBe('another value'); + }, + { defaultKey: 'another value' } + ); + }); + }); + describe('when outside a context', () => { const error = new Error('Accessing nonexistent async context'); diff --git a/app/worker.ts b/app/worker.ts index 5bdbbe2880..26890af529 100644 --- a/app/worker.ts +++ b/app/worker.ts @@ -41,89 +41,82 @@ process.on('uncaughtException', uncaughtError); DB.connect(config.DBHOST, dbAuth) .then(async () => { await tenants.setupTenants(); + permissionsContext.setCommandContextAsDefault(); setupWorkerSockets(); - await tenants.run(async () => { - permissionsContext.setCommandContext(); - - systemLogger.info('[Worker] - ==> 📡 starting external services...'); - - const services: Record = { - ocr_manager: ocrManager, - at_service: new ATServiceListener(), - information_extractor: new InformationExtraction(), - convert_pdf: new ConvertToPdfWorker(), - preserve_integration: new DistributedLoop( - 'preserve_integration', - async () => preserveSync.syncAllTenants(), - { - port: config.redis.port, - host: config.redis.host, - delayTimeBetweenTasks: 30000, - } - ), - toc_service: new DistributedLoop( - 'toc_service', - async () => tocService.processAllTenants(), - { - port: config.redis.port, - host: config.redis.host, - delayTimeBetweenTasks: 30000, - } - ), - sync_job: new DistributedLoop('sync_job', async () => syncWorker.runAllTenants(), { + systemLogger.info('[Worker] - ==> 📡 starting external services...'); + + const services: Record = { + ocr_manager: ocrManager, + at_service: new ATServiceListener(), + information_extractor: new InformationExtraction(), + convert_pdf: new ConvertToPdfWorker(), + preserve_integration: new DistributedLoop( + 'preserve_integration', + async () => preserveSync.syncAllTenants(), + { port: config.redis.port, host: config.redis.host, - delayTimeBetweenTasks: 1000, - }), - - pdf_segmentation: new PDFSegmentation(), - twitter_integration: new TwitterIntegration(), - }; - - services.segmentation_distributed_loop = new DistributedLoop( - 'segmentation_repeat', - services.pdf_segmentation.segmentPdfs, - { port: config.redis.port, host: config.redis.host, delayTimeBetweenTasks: 5000 } + delayTimeBetweenTasks: 30000, + } + ), + toc_service: new DistributedLoop('toc_service', async () => tocService.processAllTenants(), { + port: config.redis.port, + host: config.redis.host, + delayTimeBetweenTasks: 30000, + }), + sync_job: new DistributedLoop('sync_job', async () => syncWorker.runAllTenants(), { + port: config.redis.port, + host: config.redis.host, + delayTimeBetweenTasks: 1000, + }), + + pdf_segmentation: new PDFSegmentation(), + twitter_integration: new TwitterIntegration(), + }; + + services.segmentation_distributed_loop = new DistributedLoop( + 'segmentation_repeat', + services.pdf_segmentation.segmentPdfs, + { port: config.redis.port, host: config.redis.host, delayTimeBetweenTasks: 5000 } + ); + + services.twitter_distributed_loop = new DistributedLoop( + 'twitter_repeat', + services.twitter_integration.addTweetsRequestsToQueue, + { port: config.redis.port, host: config.redis.host, delayTimeBetweenTasks: 120000 } + ); + + Object.values(services).forEach(service => service.start()); + + process.on('SIGINT', async () => { + systemLogger.info( + '[Worker Graceful shutdown] - Received SIGINT, waiting for graceful stop...' ); - services.twitter_distributed_loop = new DistributedLoop( - 'twitter_repeat', - services.twitter_integration.addTweetsRequestsToQueue, - { port: config.redis.port, host: config.redis.host, delayTimeBetweenTasks: 120000 } + const stoppedServices: string[] = []; + + const stopPromises = Promise.all( + Object.entries(services).map(async ([name, service]) => { + await service.stop(); + stoppedServices.push(name); + }) ); + const firstToFinish = await Promise.race([stopPromises, sleep(10_000)]); - Object.values(services).forEach(service => service.start()); + if (Array.isArray(firstToFinish)) { + systemLogger.info('[Worker Graceful shutdown] - Services stopped successfully!'); + } else { + const notStoppedServices = Object.keys(services) + .filter(service => !stoppedServices.includes(service)) + .join(', '); - process.on('SIGINT', async () => { systemLogger.info( - '[Worker Graceful shutdown] - Received SIGINT, waiting for graceful stop...' + `[Worker Graceful shutdown] - These services [${notStoppedServices}] did not stop in time, initiating forceful shutdown...` ); + } - const stoppedServices: string[] = []; - - const stopPromises = Promise.all( - Object.entries(services).map(async ([name, service]) => { - await service.stop(); - stoppedServices.push(name); - }) - ); - const firstToFinish = await Promise.race([stopPromises, sleep(10_000)]); - - if (Array.isArray(firstToFinish)) { - systemLogger.info('[Worker Graceful shutdown] - Services stopped successfully!'); - } else { - const notStoppedServices = Object.keys(services) - .filter(service => !stoppedServices.includes(service)) - .join(', '); - - systemLogger.info( - `[Worker Graceful shutdown] - These services [${notStoppedServices}] did not stop in time, initiating forceful shutdown...` - ); - } - - process.exit(0); - }); + process.exit(0); }); }) .catch(error => { From 438bc37f8682b3ade02123088fe622591f7f86bf Mon Sep 17 00:00:00 2001 From: Daneryl Date: Tue, 21 Jan 2025 10:17:01 +0100 Subject: [PATCH 24/69] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f36dabca2..82c69786ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uwazi", - "version": "1.196.0", + "version": "1.196.1", "description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.", "keywords": [ "react" From ae8130885dc187b0069764d3213ceaaf0ddfb9a3 Mon Sep 17 00:00:00 2001 From: Daneryl Date: Tue, 21 Jan 2025 10:18:24 +0100 Subject: [PATCH 25/69] Merge back from production and Bump rc version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 914e310940..7235b8214b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uwazi", - "version": "1.197.0-rc1", + "version": "1.197.0-rc2", "description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.", "keywords": [ "react" From 3291d32c2090640899181e51e60ad76fddbdf988 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 21 Jan 2025 10:57:10 -0300 Subject: [PATCH 26/69] wip await useNavigate and useRevalidator --- app/react/I18N/components/I18NLink.tsx | 14 +++++++------- app/react/Library/actions/libraryActions.js | 4 ++-- app/react/Markdown/components/SearchBox.js | 4 ++-- app/react/V2/Routes/Settings/Pages/PageEditor.tsx | 10 +++++----- .../V2/Routes/Settings/Thesauri/EditThesaurus.tsx | 4 ++-- .../V2/Routes/Settings/Thesauri/ThesaurusForm.tsx | 8 ++++---- .../Settings/Thesauri/components/ThesauriTable.tsx | 4 ++-- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/app/react/I18N/components/I18NLink.tsx b/app/react/I18N/components/I18NLink.tsx index 5841be31dc..e0ec9b3559 100644 --- a/app/react/I18N/components/I18NLink.tsx +++ b/app/react/I18N/components/I18NLink.tsx @@ -48,20 +48,20 @@ const I18NLink = (props: I18NLinkProps) => { }, delay); }; - const _navigate = () => { - navigate(to, { replace }); + const _navigate = async () => { + await navigate(to, { replace }); scrollToHashWithRetry(location.hash); }; - const onClickHandler = (e: { preventDefault: () => void }) => { + const onClickHandler = async (e: { preventDefault: () => void }) => { e.preventDefault(); if (disabled) return; if (onClick && confirmTitle) { props.mainContext.confirm({ - accept: () => { + accept: async () => { onClick(e); - _navigate(); + await _navigate(); }, title: confirmTitle, message: confirmMessage, @@ -71,10 +71,10 @@ const I18NLink = (props: I18NLinkProps) => { if (onClick) { onClick(e); - _navigate(); + await _navigate(); return; } - _navigate(); + await _navigate(); }; useEffect(() => { diff --git a/app/react/Library/actions/libraryActions.js b/app/react/Library/actions/libraryActions.js index 5bd66756e8..a27f35847b 100644 --- a/app/react/Library/actions/libraryActions.js +++ b/app/react/Library/actions/libraryActions.js @@ -231,7 +231,7 @@ function encodeSearch(_search, appendQ = true) { return appendQ ? `?q=${encodedSearch}` : encodedSearch; } -function setSearchInUrl(searchParams, location, navigate) { +async function setSearchInUrl(searchParams, location, navigate) { const { pathname } = location; const path = `${pathname}/`.replace(/\/\//g, '/'); const query = new URLSearchParams(location.search); @@ -246,7 +246,7 @@ function searchDocuments( limit = 30, from = 0 ) { - return (dispatch, getState) => { + return async (dispatch, getState) => { const state = getState().library; const currentSearch = search || state.search; const currentFilters = filters || state.filters; diff --git a/app/react/Markdown/components/SearchBox.js b/app/react/Markdown/components/SearchBox.js index 4bf5ea0942..b878084a83 100644 --- a/app/react/Markdown/components/SearchBox.js +++ b/app/react/Markdown/components/SearchBox.js @@ -11,8 +11,8 @@ import { SearchTipsContent } from 'app/App/SearchTipsContent'; const SearchBox = ({ placeholder, classname }) => { const navigate = useNavigate(); - const search = ({ searchTerm }) => { - navigate(`/library/?q=${rison.encode({ searchTerm })}`); + const search = async ({ searchTerm }) => { + await navigate(`/library/?q=${rison.encode({ searchTerm })}`); }; return ( diff --git a/app/react/V2/Routes/Settings/Pages/PageEditor.tsx b/app/react/V2/Routes/Settings/Pages/PageEditor.tsx index b8f0726a46..a4a1db5fb2 100644 --- a/app/react/V2/Routes/Settings/Pages/PageEditor.tsx +++ b/app/react/V2/Routes/Settings/Pages/PageEditor.tsx @@ -83,13 +83,13 @@ const PageEditor = () => { }); }; - const handleRevalidate = (response: Page) => { + const handleRevalidate = async (response: Page) => { if (!page.sharedId) { - navigate(`/${response.language}/settings/pages/page/${response.sharedId}`, { + await navigate(`/${response.language}/settings/pages/page/${response.sharedId}`, { replace: true, }); } else { - revalidator.revalidate(); + await revalidator.revalidate(); } }; @@ -106,7 +106,7 @@ const PageEditor = () => { notify(response); if (!hasErrors) { - handleRevalidate(response); + await handleRevalidate(response); } }; @@ -119,7 +119,7 @@ const PageEditor = () => { if (!hasErrors) { const pageUrl = getPageUrl(response.sharedId!, response.title); window.open(`${window.location.origin}/${pageUrl}`); - handleRevalidate(response); + await handleRevalidate(response); } }; diff --git a/app/react/V2/Routes/Settings/Thesauri/EditThesaurus.tsx b/app/react/V2/Routes/Settings/Thesauri/EditThesaurus.tsx index 42ba24df11..eb4e4b2c07 100644 --- a/app/react/V2/Routes/Settings/Thesauri/EditThesaurus.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/EditThesaurus.tsx @@ -168,13 +168,13 @@ const EditThesaurus = () => { }} disabled={isEmpty(getValues().name)} getThesaurus={getCurrentStatus} - onSuccess={(savedThesaurus: ThesaurusSchema) => { + onSuccess={async (savedThesaurus: ThesaurusSchema) => { setValue('_id', savedThesaurus._id); setNotifications({ type: 'success', text: Thesauri updated., }); - navigate(`../edit/${savedThesaurus._id}`); + await navigate(`../edit/${savedThesaurus._id}`); setIsImporting(false); }} onFailure={() => { diff --git a/app/react/V2/Routes/Settings/Thesauri/ThesaurusForm.tsx b/app/react/V2/Routes/Settings/Thesauri/ThesaurusForm.tsx index 93831f4285..1959914ff0 100644 --- a/app/react/V2/Routes/Settings/Thesauri/ThesaurusForm.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/ThesaurusForm.tsx @@ -43,11 +43,11 @@ const ThesaurusForm = ({ const [thesauri, setThesauri] = useAtom(thesauriAtom); const setNotifications = useSetAtom(notificationAtom); - const handleRevalidate = (savedThesaurus: ClientThesaurus) => { + const handleRevalidate = async (savedThesaurus: ClientThesaurus) => { if (!thesaurus?._id) { - navigate(`../edit/${savedThesaurus._id}`); + await navigate(`../edit/${savedThesaurus._id}`); } else { - revalidator.revalidate(); + await revalidator.revalidate(); } }; @@ -68,7 +68,7 @@ const ThesaurusForm = ({ Thesauri added. ), }); - handleRevalidate(savedThesaurus); + await handleRevalidate(savedThesaurus); }; const formSubmit: SubmitHandler = async data => { diff --git a/app/react/V2/Routes/Settings/Thesauri/components/ThesauriTable.tsx b/app/react/V2/Routes/Settings/Thesauri/components/ThesauriTable.tsx index bcb1677042..580e05e026 100644 --- a/app/react/V2/Routes/Settings/Thesauri/components/ThesauriTable.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/components/ThesauriTable.tsx @@ -21,8 +21,8 @@ interface ThesauriTableProps { const ThesauriTable = ({ currentThesauri, setSelectedThesauri }: ThesauriTableProps) => { const navigate = useNavigate(); - const navigateToEditThesaurus = (thesaurus: Row) => { - navigate(`./edit/${thesaurus.original._id}`); + const navigateToEditThesaurus = async (thesaurus: Row) => { + await navigate(`./edit/${thesaurus.original._id}`); }; return ( From 54eccc43a49adae85fa05c8a702a65c3c1b354be Mon Sep 17 00:00:00 2001 From: John Date: Tue, 21 Jan 2025 11:17:08 -0300 Subject: [PATCH 27/69] await navigates and revalidators --- app/react/V2/Routes/Settings/Account/Account.tsx | 2 +- .../Account/Components/TwoFactorSetup.tsx | 2 +- .../V2/Routes/Settings/Collection/Collection.tsx | 2 +- .../Settings/CustomUploads/CustomUploads.tsx | 4 ++-- .../CustomUploads/components/DropzoneModal.tsx | 4 ++-- .../components/EditFileSidepanel.tsx | 2 +- .../V2/Routes/Settings/Filters/FiltersTable.tsx | 2 +- app/react/V2/Routes/Settings/IX/IXDashboard.tsx | 4 ++-- .../V2/Routes/Settings/IX/IXSuggestions.tsx | 16 +++++++++------- .../V2/Routes/Settings/MenuConfig/MenuConfig.tsx | 2 +- app/react/V2/Routes/Settings/Pages/PagesList.tsx | 2 +- .../ParagraphExtraction/ParagraphExtraction.tsx | 4 ++-- .../RelationshipTypes/RelationshipTypes.tsx | 4 ++-- .../V2/Routes/Settings/Thesauri/ThesauriList.tsx | 2 +- 14 files changed, 27 insertions(+), 25 deletions(-) diff --git a/app/react/V2/Routes/Settings/Account/Account.tsx b/app/react/V2/Routes/Settings/Account/Account.tsx index 7b93bead71..69190dc09a 100644 --- a/app/react/V2/Routes/Settings/Account/Account.tsx +++ b/app/react/V2/Routes/Settings/Account/Account.tsx @@ -62,7 +62,7 @@ const Account = () => { type: 'success', text: Account updated, }); - revalidator.revalidate(); + await revalidator.revalidate(); } resetField('password'); diff --git a/app/react/V2/Routes/Settings/Account/Components/TwoFactorSetup.tsx b/app/react/V2/Routes/Settings/Account/Components/TwoFactorSetup.tsx index 18135674d4..7085cf785c 100644 --- a/app/react/V2/Routes/Settings/Account/Components/TwoFactorSetup.tsx +++ b/app/react/V2/Routes/Settings/Account/Components/TwoFactorSetup.tsx @@ -57,7 +57,7 @@ const TwoFactorSetup = ({ closePanel, isOpen }: TwoFactorSetupProps) => { const enable2fa = async () => { try { await api.post('auth2fa-enable', new RequestParams({ token })); - revalidator.revalidate(); + await revalidator.revalidate(); closePanel(); setNotifications({ type: 'success', diff --git a/app/react/V2/Routes/Settings/Collection/Collection.tsx b/app/react/V2/Routes/Settings/Collection/Collection.tsx index 112309876e..0ce9059103 100644 --- a/app/react/V2/Routes/Settings/Collection/Collection.tsx +++ b/app/react/V2/Routes/Settings/Collection/Collection.tsx @@ -112,7 +112,7 @@ const Collection = () => { text: Settings updated, }); } - revalidator.revalidate(); + await revalidator.revalidate(); }; const labelWithTip = (label: string, tip: React.ReactNode) => ( diff --git a/app/react/V2/Routes/Settings/CustomUploads/CustomUploads.tsx b/app/react/V2/Routes/Settings/CustomUploads/CustomUploads.tsx index ad78aead3e..f6c2571d0c 100644 --- a/app/react/V2/Routes/Settings/CustomUploads/CustomUploads.tsx +++ b/app/react/V2/Routes/Settings/CustomUploads/CustomUploads.tsx @@ -93,7 +93,7 @@ const CustomUploads = () => { setConfirmationModal(false); const response = await remove(file._id); notify([response], Deleted custom file); - revalidator.revalidate(); + await revalidator.revalidate(); }, }); }; @@ -104,7 +104,7 @@ const CustomUploads = () => { setSelectedRows([]); const responses = await Promise.all(filesToDelete.map(async fileId => remove(fileId))); notify(responses, Deleted custom file); - revalidator.revalidate(); + await revalidator.revalidate(); }; return ( diff --git a/app/react/V2/Routes/Settings/CustomUploads/components/DropzoneModal.tsx b/app/react/V2/Routes/Settings/CustomUploads/components/DropzoneModal.tsx index f92f2ea73e..67271d9a57 100644 --- a/app/react/V2/Routes/Settings/CustomUploads/components/DropzoneModal.tsx +++ b/app/react/V2/Routes/Settings/CustomUploads/components/DropzoneModal.tsx @@ -31,8 +31,8 @@ const DropzoneModal = ({ notify, isOpen, setIsOpen, uploadService }: DropzoneMod uploadService.onProgress((filename, progress) => { updateProgress({ filename, progress }); }); - uploadService.onUploadComplete(() => { - revalidator.revalidate(); + uploadService.onUploadComplete(async () => { + await revalidator.revalidate(); }); const results = await uploadService.upload([...filesToUpload]); updateProgress({ filename: undefined, progress: undefined }); diff --git a/app/react/V2/Routes/Settings/CustomUploads/components/EditFileSidepanel.tsx b/app/react/V2/Routes/Settings/CustomUploads/components/EditFileSidepanel.tsx index bfc19b2678..e3cfe7b307 100644 --- a/app/react/V2/Routes/Settings/CustomUploads/components/EditFileSidepanel.tsx +++ b/app/react/V2/Routes/Settings/CustomUploads/components/EditFileSidepanel.tsx @@ -58,7 +58,7 @@ const EditFileSidepanel = ({ showSidepanel, closeSidepanel, file }: EditFileSide const response = await update(updatedFile); closeSidepanel(); notify(response); - revalidator.revalidate(); + await revalidator.revalidate(); }; return ( diff --git a/app/react/V2/Routes/Settings/Filters/FiltersTable.tsx b/app/react/V2/Routes/Settings/Filters/FiltersTable.tsx index fdb75c9eb2..98b99c3d1d 100644 --- a/app/react/V2/Routes/Settings/Filters/FiltersTable.tsx +++ b/app/react/V2/Routes/Settings/Filters/FiltersTable.tsx @@ -114,7 +114,7 @@ const FiltersTable = () => { setSettings(response); setDisabled(false); setHasChanges(false); - revalidator.revalidate(); + await revalidator.revalidate(); return setNotifications({ type: 'success', text: Filters saved }); }; diff --git a/app/react/V2/Routes/Settings/IX/IXDashboard.tsx b/app/react/V2/Routes/Settings/IX/IXDashboard.tsx index d8a49eebc4..44c5d4b296 100644 --- a/app/react/V2/Routes/Settings/IX/IXDashboard.tsx +++ b/app/react/V2/Routes/Settings/IX/IXDashboard.tsx @@ -71,7 +71,7 @@ const IXDashboard = () => { try { await extractorsAPI.remove(extractorIds); - revalidator.revalidate(); + await revalidator.revalidate(); setNotifications({ type: 'success', text: Extractor/s deleted, @@ -92,7 +92,7 @@ const IXDashboard = () => { try { await extractorsAPI.save(extractor); - revalidator.revalidate(); + await revalidator.revalidate(); setNotifications({ type: 'success', text: Saved successfully., diff --git a/app/react/V2/Routes/Settings/IX/IXSuggestions.tsx b/app/react/V2/Routes/Settings/IX/IXSuggestions.tsx index 8b3acd3c44..6088d97da0 100644 --- a/app/react/V2/Routes/Settings/IX/IXSuggestions.tsx +++ b/app/react/V2/Routes/Settings/IX/IXSuggestions.tsx @@ -124,10 +124,10 @@ const IXSuggestions = () => { useEffect(() => { socket.on( 'ix_model_status', - (extractorId: string, modelStatus: string, _: string, data: any) => { + async (extractorId: string, modelStatus: string, _: string, data: any) => { if (extractorId === extractor._id) { setStatus({ status: modelStatus as ixStatus, data }); - revalidate(); + await revalidate(); if ((data && data.total === data.processed) || modelStatus === 'ready') { setStatus({ status: 'ready' }); } @@ -145,8 +145,10 @@ const IXSuggestions = () => { }, [aggregation]); useEffect(() => { + const navigatePromise = async (path: string) => navigate(path, { replace: true }); + if (searchParams.has('sort') && !sorting.length) { - navigate(location.pathname, { replace: true }); + navigatePromise(location.pathname).catch(_e => {}); } if (sorting.length && sorting[0].id) { @@ -158,9 +160,9 @@ const IXSuggestions = () => { const order = sorting[0].desc ? 'desc' : 'asc'; - navigate(`${location.pathname}?sort={"property":"${_property}","order":"${order}"}`, { - replace: true, - }); + navigatePromise( + `${location.pathname}?sort={"property":"${_property}","order":"${order}"}` + ).catch(_e => {}); } }, [sorting]); @@ -225,7 +227,7 @@ const IXSuggestions = () => { } else { setStatus({ status: 'cancel' }); } - revalidate(); + await revalidate(); } } catch (error) {} }; diff --git a/app/react/V2/Routes/Settings/MenuConfig/MenuConfig.tsx b/app/react/V2/Routes/Settings/MenuConfig/MenuConfig.tsx index 92dde189db..c44d65a4d3 100644 --- a/app/react/V2/Routes/Settings/MenuConfig/MenuConfig.tsx +++ b/app/react/V2/Routes/Settings/MenuConfig/MenuConfig.tsx @@ -69,7 +69,7 @@ const MenuConfig = () => { const save = async () => { const settings = await SettingsAPI.saveLinks(linkState.map(sanitizeIds)); setSettings(settings); - revalidator.revalidate(); + await revalidator.revalidate(); setNotifications({ type: 'success', text: Updated, diff --git a/app/react/V2/Routes/Settings/Pages/PagesList.tsx b/app/react/V2/Routes/Settings/Pages/PagesList.tsx index 4b5f67fc7a..8f16613b50 100644 --- a/app/react/V2/Routes/Settings/Pages/PagesList.tsx +++ b/app/react/V2/Routes/Settings/Pages/PagesList.tsx @@ -55,7 +55,7 @@ const PagesList = () => { ); const hasErrors = result.find(res => res instanceof FetchResponseError) !== undefined; setNotifications(deletionNotification(hasErrors)); - revalidator.revalidate(); + await revalidator.revalidate(); }; const columns = [ diff --git a/app/react/V2/Routes/Settings/ParagraphExtraction/ParagraphExtraction.tsx b/app/react/V2/Routes/Settings/ParagraphExtraction/ParagraphExtraction.tsx index 10ab988f92..37530642bf 100644 --- a/app/react/V2/Routes/Settings/ParagraphExtraction/ParagraphExtraction.tsx +++ b/app/react/V2/Routes/Settings/ParagraphExtraction/ParagraphExtraction.tsx @@ -52,7 +52,7 @@ const ParagraphExtractorDashboard = () => { try { await extractorsAPI.remove(extractorIds); - revalidator.revalidate(); + await revalidator.revalidate(); setNotifications({ type: 'success', text: Extractor/s deleted, @@ -69,7 +69,7 @@ const ParagraphExtractorDashboard = () => { }; const handleSave = async () => { - revalidator.revalidate(); + await revalidator.revalidate(); setNotifications({ type: 'success', text: Paragraph Extractor added, diff --git a/app/react/V2/Routes/Settings/RelationshipTypes/RelationshipTypes.tsx b/app/react/V2/Routes/Settings/RelationshipTypes/RelationshipTypes.tsx index e00d5f00e7..7e12ccf877 100644 --- a/app/react/V2/Routes/Settings/RelationshipTypes/RelationshipTypes.tsx +++ b/app/react/V2/Routes/Settings/RelationshipTypes/RelationshipTypes.tsx @@ -86,7 +86,7 @@ const RelationshipTypes = () => { }); setIsSidepanelOpen(false); } - revalidator.revalidate(); + await revalidator.revalidate(); setRelationshipTypes(relationshipTypes); }; @@ -106,7 +106,7 @@ const RelationshipTypes = () => { }); setShowConfirmationModal(false); } - revalidator.revalidate(); + await revalidator.revalidate(); setRelationshipTypes(relationshipTypes); }; diff --git a/app/react/V2/Routes/Settings/Thesauri/ThesauriList.tsx b/app/react/V2/Routes/Settings/Thesauri/ThesauriList.tsx index 1b1f11caf7..34d3fce905 100644 --- a/app/react/V2/Routes/Settings/Thesauri/ThesauriList.tsx +++ b/app/react/V2/Routes/Settings/Thesauri/ThesauriList.tsx @@ -62,7 +62,7 @@ const ThesauriList = () => { text: e.message, }); } finally { - revalidator.revalidate(); + await revalidator.revalidate(); setShowConfirmationModal(false); } }; From eb10c8cc546c4ec395155e0ff7dbfe1f4b394a87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 14:13:19 -0500 Subject: [PATCH 28/69] Bump the eslint group with 2 updates (#7600) Bumps the eslint group with 2 updates: [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) and [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier). Updates `eslint-plugin-jest` from 28.10.0 to 28.11.0 - [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases) - [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md) - [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v28.10.0...v28.11.0) Updates `eslint-plugin-prettier` from 5.2.1 to 5.2.3 - [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases) - [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/master/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v5.2.1...v5.2.3) --- updated-dependencies: - dependency-name: eslint-plugin-jest dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint - dependency-name: eslint-plugin-prettier dependency-type: direct:development update-type: version-update:semver-patch dependency-group: eslint ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mercy --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 2de821fad0..9e3e8e00ea 100644 --- a/package.json +++ b/package.json @@ -347,10 +347,10 @@ "eslint-plugin-cypress": "^4.1.0", "eslint-plugin-import": "v2.31.0", "eslint-plugin-jasmine": "4.2.2", - "eslint-plugin-jest": "v28.10.0", + "eslint-plugin-jest": "v28.11.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "5.2.1", + "eslint-plugin-prettier": "5.2.3", "eslint-plugin-react": "v7.37.4", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-storybook": "^0.11.2", diff --git a/yarn.lock b/yarn.lock index aa008660e9..8e5b58e725 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8579,10 +8579,10 @@ eslint-plugin-jasmine@4.2.2: resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.2.2.tgz#fa1d0510b239ab09f72f1e7dfee3e6dbd319edbb" integrity sha512-nALbewRk63uz28UGNhUTJyd6GofXxVNFpWFNAwr9ySc6kpSRIoO4suwZqIYz3cfJmCacilmjp7+1Ocjr7zRagA== -eslint-plugin-jest@v28.10.0: - version "28.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.10.0.tgz#4b35b8abb0f7cfe699bff8d9060270a2ddd770ea" - integrity sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA== +eslint-plugin-jest@v28.11.0: + version "28.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz#2641ecb4411941bbddb3d7cf8a8ff1163fbb510e" + integrity sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig== dependencies: "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -8619,10 +8619,10 @@ eslint-plugin-node@^11.1.0: resolve "^1.10.1" semver "^6.1.0" -eslint-plugin-prettier@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" - integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== +eslint-plugin-prettier@5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz#c4af01691a6fa9905207f0fbba0d7bea0902cce5" + integrity sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw== dependencies: prettier-linter-helpers "^1.0.0" synckit "^0.9.1" From 038167d8fd7d0bcc3c9528c090c103ac9aefbcf0 Mon Sep 17 00:00:00 2001 From: mfacar Date: Wed, 22 Jan 2025 11:19:44 -0500 Subject: [PATCH 29/69] sets TextEncoder/TextDecoder for jsdom in jest config --- app/setUpJestClient.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/setUpJestClient.js b/app/setUpJestClient.js index 05aa88079f..0018174d49 100644 --- a/app/setUpJestClient.js +++ b/app/setUpJestClient.js @@ -1,7 +1,10 @@ /* eslint-disable import/no-extraneous-dependencies */ import '@testing-library/jest-dom'; +import { TextEncoder, TextDecoder } from 'util'; import Adapter from '@cfaester/enzyme-adapter-react-18'; +Object.assign(global, { TextDecoder, TextEncoder }); + const { configure } = require('enzyme'); configure({ adapter: new Adapter() }); From ce9767b3a090471de712ac43455b0d6c4823860f Mon Sep 17 00:00:00 2001 From: Mercy Date: Wed, 22 Jan 2025 13:33:43 -0500 Subject: [PATCH 30/69] 7561 - PDF view pagination for small zoom level (#7606) * forces loading of partially visible pages * limit forcing of pagination over partial visible pages only for explicit navigation * reverts added test due change of approach --- app/react/Viewer/PDFView.js | 4 ++-- app/react/Viewer/actions/specs/uiActions.spec.js | 13 +++++++++++++ app/react/Viewer/actions/uiActions.js | 3 ++- app/react/Viewer/components/Paginator.js | 4 ++-- app/react/Viewer/components/specs/Paginator.spec.js | 6 +++--- app/react/Viewer/specs/PDFView.spec.js | 2 +- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/app/react/Viewer/PDFView.js b/app/react/Viewer/PDFView.js index cd8774d351..58acaca0c3 100644 --- a/app/react/Viewer/PDFView.js +++ b/app/react/Viewer/PDFView.js @@ -79,12 +79,12 @@ class PDFViewComponent extends Component { } } - changePage(nextPage) { + changePage(nextPage, force = false) { const { raw = 'false' } = searchParamsFromSearchParams(this.props.searchParams); const notRaw = String(raw).toLowerCase() === 'false'; if (notRaw) { - return scrollToPage(nextPage); + return scrollToPage(nextPage, 50, force); } return this.changeBrowserHistoryPage(nextPage, notRaw); diff --git a/app/react/Viewer/actions/specs/uiActions.spec.js b/app/react/Viewer/actions/specs/uiActions.spec.js index 8db46f8e76..8cb834f321 100644 --- a/app/react/Viewer/actions/specs/uiActions.spec.js +++ b/app/react/Viewer/actions/specs/uiActions.spec.js @@ -262,6 +262,19 @@ describe('Viewer uiActions', () => { }); }); + describe('scrollToPage', () => { + it('should scroll to the page passed forcing the load', async () => { + spyOn(scroller, 'to').and.callFake(async () => Promise.resolve()); + actions.scrollToPage(3, 1, true); + expect(scroller.to).toHaveBeenCalledWith('.document-viewer div#page-3', '.document-viewer', { + dividerOffset: 1, + duration: 1, + force: true, + offset: 50, + }); + }); + }); + describe('highlightSnippet', () => { it('should unmark all and mark snippets passed only once (only the ones for the pages being rendered)', () => { const container = document.createElement('div'); diff --git a/app/react/Viewer/actions/uiActions.js b/app/react/Viewer/actions/uiActions.js index 13ea9fb916..e5cf9284e0 100644 --- a/app/react/Viewer/actions/uiActions.js +++ b/app/react/Viewer/actions/uiActions.js @@ -114,11 +114,12 @@ export function highlightSnippet(snippet) { }); } -export function scrollToPage(page, duration = 50) { +export function scrollToPage(page, duration = 50, force = false) { scroller.to(`.document-viewer div#page-${page}`, '.document-viewer', { duration, dividerOffset: 1, offset: 50, + force, }); } diff --git a/app/react/Viewer/components/Paginator.js b/app/react/Viewer/components/Paginator.js index f98a73f3a7..f59f3033ce 100644 --- a/app/react/Viewer/components/Paginator.js +++ b/app/react/Viewer/components/Paginator.js @@ -20,7 +20,7 @@ const Paginator = ({ page = 1, totalPages = 1, onPageChange = () => {} }) => { queryParams={{ page: prevPage }} onClick={e => { e.preventDefault(); - onPageChange(prevPage); + onPageChange(prevPage, true); }} {...disableButton(page, 1)} > @@ -31,7 +31,7 @@ const Paginator = ({ page = 1, totalPages = 1, onPageChange = () => {} }) => { queryParams={{ page: nextPage }} onClick={e => { e.preventDefault(); - onPageChange(nextPage); + onPageChange(nextPage, true); }} {...disableButton(page, totalPages)} > diff --git a/app/react/Viewer/components/specs/Paginator.spec.js b/app/react/Viewer/components/specs/Paginator.spec.js index 15ee01a937..d53c6ed949 100644 --- a/app/react/Viewer/components/specs/Paginator.spec.js +++ b/app/react/Viewer/components/specs/Paginator.spec.js @@ -77,7 +77,7 @@ describe('Paginator', () => { }); describe('when passing onPageChange callback', () => { - it('should execute callback on prev/next passing the page selecte', () => { + it('should execute callback on prev/next passing the adjacent page forcing navigation for partially visible pages', () => { page = 5; const props = { totalPages: 25, @@ -91,13 +91,13 @@ describe('Paginator', () => { .find(CurrentLocationLink) .at(0) .simulate('click', { preventDefault: () => {} }); - expect(props.onPageChange).toHaveBeenCalledWith(4); + expect(props.onPageChange).toHaveBeenCalledWith(4, true); component .find(CurrentLocationLink) .at(1) .simulate('click', { preventDefault: () => {} }); - expect(props.onPageChange).toHaveBeenCalledWith(6); + expect(props.onPageChange).toHaveBeenCalledWith(6, true); }); }); }); diff --git a/app/react/Viewer/specs/PDFView.spec.js b/app/react/Viewer/specs/PDFView.spec.js index 32ae116b5d..45ac02ace4 100644 --- a/app/react/Viewer/specs/PDFView.spec.js +++ b/app/react/Viewer/specs/PDFView.spec.js @@ -271,7 +271,7 @@ describe('PDFView', () => { render(); component.find({ page: 15 }).at(0).props().changePage(16); expect(mockNavigate).not.toHaveBeenCalled(); - expect(uiActions.scrollToPage).toHaveBeenCalledWith(16); + expect(uiActions.scrollToPage).toHaveBeenCalledWith(16, 50, false); }); }); }); From cca70da423847b84069da7eb840abf2d136d12ef Mon Sep 17 00:00:00 2001 From: mfacar Date: Wed, 22 Jan 2025 21:28:25 -0500 Subject: [PATCH 31/69] updates snapshots --- .../__snapshots__/SortDropdown.spec.tsx.snap | 10 ++++++++++ .../__snapshots__/Thesauri.spec.tsx.snap | 19 ++----------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/app/react/Library/components/specs/__snapshots__/SortDropdown.spec.tsx.snap b/app/react/Library/components/specs/__snapshots__/SortDropdown.spec.tsx.snap index 94f5d5f137..9d4879b0a8 100644 --- a/app/react/Library/components/specs/__snapshots__/SortDropdown.spec.tsx.snap +++ b/app/react/Library/components/specs/__snapshots__/SortDropdown.spec.tsx.snap @@ -37,6 +37,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • Title @@ -45,6 +46,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • Date added @@ -53,6 +55,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • Date modified @@ -61,6 +64,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • Search relevance @@ -69,6 +73,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • Date @@ -77,6 +82,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • Number @@ -85,6 +91,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • My select @@ -93,6 +100,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • Sortable name @@ -101,6 +109,7 @@ exports[`Sort dropdown when there is an active search term should display sort b
  • Inherited 1 @@ -110,6 +119,7 @@ exports[`Sort dropdown when there is an active search term should display sort b diff --git a/app/react/V2/Routes/Settings/Thesauri/specs/__snapshots__/Thesauri.spec.tsx.snap b/app/react/V2/Routes/Settings/Thesauri/specs/__snapshots__/Thesauri.spec.tsx.snap index 89d8ef512f..a03bdaac68 100644 --- a/app/react/V2/Routes/Settings/Thesauri/specs/__snapshots__/Thesauri.spec.tsx.snap +++ b/app/react/V2/Routes/Settings/Thesauri/specs/__snapshots__/Thesauri.spec.tsx.snap @@ -269,6 +269,7 @@ exports[`Settings Thesauri ThesauriList render existing thesauri should show a l > - -
    + {inlineEditState.inlineEdit && inlineEditState.context && } ); }; diff --git a/app/react/App/DropdownMenu.tsx b/app/react/App/DropdownMenu.tsx index 1a0fb4f7bb..7b71a7703d 100644 --- a/app/react/App/DropdownMenu.tsx +++ b/app/react/App/DropdownMenu.tsx @@ -1,7 +1,7 @@ +import { useOnClickOutsideElement } from 'app/utils/useOnClickOutsideElementHook'; import { I18NLink, Translate } from 'app/I18N'; import { Icon } from 'UI'; import React, { useRef, useState, useCallback } from 'react'; -import { useOnClickOutsideElement } from 'app/utils/useOnClickOutsideElementHook'; import { ILink, ISublink } from 'app/V2/shared/types'; import { IImmutable } from 'shared/types/Immutable'; diff --git a/app/react/App/SearchTipsContent.tsx b/app/react/App/SearchTipsContent.tsx index 3e9ec3e3a8..5b6ee330bd 100644 --- a/app/react/App/SearchTipsContent.tsx +++ b/app/react/App/SearchTipsContent.tsx @@ -1,55 +1,53 @@ import React from 'react'; import { t } from 'app/I18N'; -const SearchTipsContent = () => { - return ( -
      -
    • - {t( - 'System', - 'Search Tips: wildcard', - 'Use an * for wildcard search. Ie: "juris*" will match words ' + - 'such as jurisdiction, jurisdictional, jurists, jurisprudence, etc.', - false - )} -
    • -
    • - {t( - 'System', - 'Search Tips: one char wildcard', - '? for one character wildcard. Ie: "198?" will match 1980 to 1989 and also 198a, 198b, etc.', - false - )} -
    • -
    • - {t( - 'System', - 'Search Tips: exact term', - 'Exact term match by enclosing your search string with quotes. Ie. "Costa Rica"' + - ' will toss different results compared to Costa Rica without quotes.', - false - )} -
    • -
    • - {t( - 'System', - 'Search Tips: proximity', - '~ for proximity searches. Ie: "the status"~5 will find anything having "the" and' + - '"status" within a distance of 5 words, such as "the procedural status", "the specific legal status".', - false - )} -
    • -
    • - {t( - 'System', - 'Search Tips: boolean', - 'AND, OR and NOT for boolean searches. Ie. "status AND women NOT Nicaragua" will match anything ' + - 'containing both the words status and women, and necessarily not containing the word Nicaragua.', - false - )} -
    • -
    - ); -}; +const SearchTipsContent = () => ( +
      +
    • + {t( + 'System', + 'Search Tips: wildcard', + 'Use an * for wildcard search. Ie: "juris*" will match words ' + + 'such as jurisdiction, jurisdictional, jurists, jurisprudence, etc.', + false + )} +
    • +
    • + {t( + 'System', + 'Search Tips: one char wildcard', + '? for one character wildcard. Ie: "198?" will match 1980 to 1989 and also 198a, 198b, etc.', + false + )} +
    • +
    • + {t( + 'System', + 'Search Tips: exact term', + 'Exact term match by enclosing your search string with quotes. Ie. "Costa Rica"' + + ' will toss different results compared to Costa Rica without quotes.', + false + )} +
    • +
    • + {t( + 'System', + 'Search Tips: proximity', + '~ for proximity searches. Ie: "the status"~5 will find anything having "the" and' + + '"status" within a distance of 5 words, such as "the procedural status", "the specific legal status".', + false + )} +
    • +
    • + {t( + 'System', + 'Search Tips: boolean', + 'AND, OR and NOT for boolean searches. Ie. "status AND women NOT Nicaragua" will match anything ' + + 'containing both the words status and women, and necessarily not containing the word Nicaragua.', + false + )} +
    • +
    +); export { SearchTipsContent }; diff --git a/app/react/App/scss/layout/_header.scss b/app/react/App/scss/layout/_header.scss index ca0943a5e3..892e0c559c 100644 --- a/app/react/App/scss/layout/_header.scss +++ b/app/react/App/scss/layout/_header.scss @@ -1,4 +1,4 @@ -@use "sass:color"; +@use 'sass:color'; @import '../config/colors'; @import '../elements/tooltip'; @@ -254,14 +254,6 @@ header { } } - .live-on { - color: #88eacd; - } - - .live-off { - color: #ffe66b; - } - button.singleItem { padding-left: 1em; } diff --git a/app/react/App/sockets.js b/app/react/App/sockets.js index c1785eb0c2..af401ebbe7 100644 --- a/app/react/App/sockets.js +++ b/app/react/App/sockets.js @@ -1,7 +1,8 @@ import { actions } from 'app/BasicReducer'; -import { t, Translate } from 'app/I18N'; +import { t } from 'app/I18N'; import { notificationActions } from 'app/Notifications'; import { documentProcessed } from 'app/Uploads/actions/uploadsActions'; +import { atomStore, translationsAtom } from 'V2/atoms'; import { store } from '../store'; import { socket, reconnectSocket } from '../socket'; @@ -58,10 +59,28 @@ socket.on('thesauriDelete', thesauri => { store.dispatch(actions.remove('thesauris', { _id: thesauri.id })); }); -socket.on('translationsChange', translations => { - store.dispatch(actions.update('translations', translations, 'locale')); - t.resetCachedTranslation(); - Translate.resetCachedTranslation(); +socket.on('translationsChange', languageTranslations => { + const translations = atomStore.get(translationsAtom); + const modifiedLanguage = translations.find( + translation => translation.locale === languageTranslations.locale + ); + if (modifiedLanguage) { + modifiedLanguage.contexts = languageTranslations.contexts; + } else { + translations.push(languageTranslations); + } + atomStore.set(translationsAtom, translations); +}); + +socket.on('translationKeysChange', translationsEntries => { + const translations = atomStore.get(translationsAtom); + translationsEntries.forEach(item => { + const modifiedContext = translations + .find(translation => translation.locale === item.language) + .contexts.find(c => c.id && c.id === item.context.id); + modifiedContext.values[item.key] = item.value; + }); + atomStore.set(translationsAtom, translations); }); socket.on('translationsInstallDone', () => { @@ -88,9 +107,9 @@ socket.on('translationsInstallError', errorMessage => { }); socket.on('translationsDelete', locale => { - store.dispatch(actions.remove('translations', { locale }, 'locale')); - t.resetCachedTranslation(); - Translate.resetCachedTranslation(); + const translations = atomStore.get(translationsAtom); + const updatedTranslations = translations.filter(language => language.locale !== locale); + atomStore.set(translationsAtom, updatedTranslations); }); socket.on('translationsDeleteDone', () => { diff --git a/app/react/App/specs/__snapshots__/Confirm.spec.js.snap b/app/react/App/specs/__snapshots__/Confirm.spec.js.snap index c850ab82e4..8985807101 100644 --- a/app/react/App/specs/__snapshots__/Confirm.spec.js.snap +++ b/app/react/App/specs/__snapshots__/Confirm.spec.js.snap @@ -9,21 +9,21 @@ exports[`CantDeleteTemplateAlert extraConfirm option should render a confirm inp >

    - + Confirm action - +

    - Are you sure you want to continue? - +

    - + If you want to continue, please type - + ' CONFIRM ' @@ -41,9 +41,9 @@ exports[`CantDeleteTemplateAlert extraConfirm option should render a confirm inp onClick={[Function]} type="button" > - + Cancel - + @@ -68,16 +68,16 @@ exports[`CantDeleteTemplateAlert noCancel option should hide the cancel button 1 >

    - + Confirm action - +

    - Are you sure you want to continue? - +

    @@ -87,9 +87,9 @@ exports[`CantDeleteTemplateAlert noCancel option should hide the cancel button 1 onClick={[Function]} type="button" > - + Accept - +
    diff --git a/app/react/App/specs/__snapshots__/Cookiepopup.spec.js.snap b/app/react/App/specs/__snapshots__/Cookiepopup.spec.js.snap index 867950e1ec..29a3c72095 100644 --- a/app/react/App/specs/__snapshots__/Cookiepopup.spec.js.snap +++ b/app/react/App/specs/__snapshots__/Cookiepopup.spec.js.snap @@ -13,9 +13,9 @@ exports[`Cookiepopup when the cookiepolicy is active and the cookie not exists s + To bring you a better experience, this site uses cookies. - + } removeNotification={[Function]} type="success" diff --git a/app/react/App/specs/fixtures/fixtures.ts b/app/react/App/specs/fixtures/fixtures.ts new file mode 100644 index 0000000000..3205bc1a23 --- /dev/null +++ b/app/react/App/specs/fixtures/fixtures.ts @@ -0,0 +1,155 @@ +import { ClientTranslationSchema } from 'app/istore'; + +const currentTranslations: ClientTranslationSchema[] = [ + { + locale: 'en', + contexts: [ + { + id: 'id1', + label: 'Documents', + type: 'Entity', + values: { + Documents: 'Document', + Select: 'Select', + Title: 'Title', + }, + }, + ], + }, + { + locale: 'es', + contexts: [ + { + id: 'id1', + label: 'Documents', + type: 'Entity', + values: { + Documents: 'Documento', + Select: 'Selector', + Title: 'Título', + }, + }, + ], + }, +]; + +const updatedTranslation: ClientTranslationSchema = { + locale: 'en', + contexts: [ + { + id: 'id1', + label: 'Documents', + type: 'Entity', + values: { + Documents: 'Document', + Select: 'Select', + Title: 'Update title', + }, + }, + ], +}; + +const newLanguage: ClientTranslationSchema = { + locale: 'fr', + contexts: [ + { + id: 'id1', + label: 'Documents', + type: 'Entity', + values: { + Documents: 'Document', + Select: 'Select', + Title: 'Title', + }, + }, + ], +}; + +const translationKeysChangeArguments = [ + { + language: 'en', + value: 'Select', + key: 'Select', + context: { + id: 'id1', + label: 'Documents', + type: 'Entity', + }, + }, + { + language: 'es', + value: 'Select ES', + key: 'Select', + context: { + id: 'id1', + label: 'Documents', + type: 'Entity', + }, + }, + { + language: 'fr', + value: 'Select FR', + key: 'Select', + context: { + id: 'id1', + label: 'Documents', + type: 'Entity', + }, + }, +]; + +const translationKeysChangeResult = [ + { + locale: 'en', + contexts: [ + { + id: 'id1', + label: 'Documents', + type: 'Entity', + values: { + Documents: 'Document', + Select: 'Select', + Title: 'Title', + }, + }, + ], + }, + { + locale: 'es', + contexts: [ + { + id: 'id1', + label: 'Documents', + type: 'Entity', + values: { + Documents: 'Documento', + Select: 'Select ES', + Title: 'Título', + }, + }, + ], + }, + { + locale: 'fr', + contexts: [ + { + id: 'id1', + label: 'Documents', + type: 'Entity', + values: { + Documents: 'Document', + Select: 'Select FR', + Title: 'Title', + }, + }, + ], + }, +]; + +export { + updatedTranslation, + currentTranslations, + newLanguage, + translationKeysChangeResult, + translationKeysChangeArguments, +}; diff --git a/app/react/App/specs/sockets.spec.js b/app/react/App/specs/sockets.spec.js index a68978f88d..54e36e36a0 100644 --- a/app/react/App/specs/sockets.spec.js +++ b/app/react/App/specs/sockets.spec.js @@ -1,10 +1,19 @@ /** * @jest-environment jsdom */ +/* eslint-disable max-statements */ import * as uploadActions from 'app/Uploads/actions/uploadsActions'; +import { atomStore, translationsAtom } from 'V2/atoms'; import { socket } from '../../socket'; import '../sockets'; import { store } from '../../store'; +import { + currentTranslations, + newLanguage, + updatedTranslation, + translationKeysChangeArguments, + translationKeysChangeResult, +} from './fixtures/fixtures'; describe('sockets', () => { beforeEach(() => { @@ -113,13 +122,42 @@ describe('sockets', () => { }); describe('translationsChange', () => { + beforeEach(() => { + atomStore.set( + translationsAtom, + currentTranslations.map(t => ({ ...t })) + ); + spyOn(atomStore, 'set'); + }); + it('should emit a translationsChange event', () => { - socket._callbacks.$translationsChange[0]({ id: '123' }); - expect(store.dispatch).toHaveBeenCalledWith({ - customIndex: 'locale', - type: 'translations/UPDATE', - value: { id: '123' }, - }); + socket._callbacks.$translationsChange[0](updatedTranslation); + expect(atomStore.set).toHaveBeenCalledWith( + expect.any(Object), + expect.arrayContaining([updatedTranslation, currentTranslations[1]]) + ); + }); + + it('should add a new language to the translations', () => { + socket._callbacks.$translationsChange[0](newLanguage); + expect(atomStore.set).toHaveBeenCalledWith( + expect.any(Object), + expect.arrayContaining([...currentTranslations, newLanguage]) + ); + }); + }); + + describe('translationKeysChange', () => { + const initialTranslations = [...currentTranslations.map(t => ({ ...t })), newLanguage]; + + beforeEach(() => { + atomStore.set(translationsAtom, initialTranslations); + spyOn(atomStore, 'set'); + }); + + it('should emit a translationKeysChange event', () => { + socket._callbacks.$translationKeysChange[0](translationKeysChangeArguments); + expect(atomStore.set).toHaveBeenCalledWith(expect.any(Object), translationKeysChangeResult); }); }); @@ -152,13 +190,17 @@ describe('sockets', () => { }); describe('translationsDelete', () => { + beforeEach(() => { + atomStore.set( + translationsAtom, + currentTranslations.map(t => ({ ...t })) + ); + spyOn(atomStore, 'set'); + }); + it('should emit a translationsDelete event', () => { - socket._callbacks.$translationsDelete[0]('localeString'); - expect(store.dispatch).toHaveBeenCalledWith({ - customIndex: 'locale', - type: 'translations/REMOVE', - value: { locale: 'localeString' }, - }); + socket._callbacks.$translationsDelete[0]('es'); + expect(atomStore.set).toHaveBeenCalledWith(expect.any(Object), [currentTranslations[0]]); }); }); diff --git a/app/react/Attachments/components/AttachmentForm.js b/app/react/Attachments/components/AttachmentForm.js index 9b38b393cd..caeff3d6eb 100644 --- a/app/react/Attachments/components/AttachmentForm.js +++ b/app/react/Attachments/components/AttachmentForm.js @@ -5,7 +5,7 @@ import { Form, Field } from 'react-redux-form'; import { FormGroup, Select } from 'app/ReactReduxForms'; import { elasticLanguages } from 'shared/language'; -import t from 'app/I18N/t'; +import { t } from 'app/I18N'; import ShowIf from 'app/App/ShowIf'; export class AttachmentForm extends Component { diff --git a/app/react/Attachments/components/UploadAttachment.js b/app/react/Attachments/components/UploadAttachment.js index 7b033a6bab..c6a0648dd0 100644 --- a/app/react/Attachments/components/UploadAttachment.js +++ b/app/react/Attachments/components/UploadAttachment.js @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import t from 'app/I18N/t'; +import { t } from 'app/I18N'; import { Icon } from 'UI'; import { uploadAttachment } from '../actions/actions'; diff --git a/app/react/Attachments/components/specs/__snapshots__/AttachmentsList.spec.js.snap b/app/react/Attachments/components/specs/__snapshots__/AttachmentsList.spec.js.snap index 53f6e31efe..feaa909232 100644 --- a/app/react/Attachments/components/specs/__snapshots__/AttachmentsList.spec.js.snap +++ b/app/react/Attachments/components/specs/__snapshots__/AttachmentsList.spec.js.snap @@ -23,9 +23,9 @@ exports[`AttachmentsList When parent is Target Document should treat all Attachm } >

    - + Supporting files - +

    @@ -58,9 +58,9 @@ exports[`AttachmentsList should render a sorted list of attachments (files) 1`] } >

    - + Supporting files - +

    - + Supporting files - +

    - + Supporting files - +

    - + Supporting files - +

    diff --git a/app/react/Attachments/components/specs/__snapshots__/AttachmentsModal.spec.tsx.snap b/app/react/Attachments/components/specs/__snapshots__/AttachmentsModal.spec.tsx.snap index c009fe2f1a..1f6d43f296 100644 --- a/app/react/Attachments/components/specs/__snapshots__/AttachmentsModal.spec.tsx.snap +++ b/app/react/Attachments/components/specs/__snapshots__/AttachmentsModal.spec.tsx.snap @@ -12,7 +12,7 @@ exports[`Attachments Modal Attachment from web Should match render of web form 1 >

    Supporting files @@ -38,7 +38,7 @@ exports[`Attachments Modal Attachment from web Should match render of web form 1 Cancel @@ -62,7 +62,7 @@ exports[`Attachments Modal Attachment from web Should match render of web form 1 style="" > Upload from computer @@ -77,7 +77,7 @@ exports[`Attachments Modal Attachment from web Should match render of web form 1 style="font-weight: bold;" > Add from web @@ -155,7 +155,7 @@ exports[`Attachments Modal Attachment from web Should match render of web form 1   Add from URL @@ -181,7 +181,7 @@ exports[`Attachments Modal Should match render of upload form 1`] = ` >

    Supporting files @@ -207,7 +207,7 @@ exports[`Attachments Modal Should match render of upload form 1`] = ` Cancel @@ -231,7 +231,7 @@ exports[`Attachments Modal Should match render of upload form 1`] = ` style="font-weight: bold;" > Upload from computer @@ -245,7 +245,7 @@ exports[`Attachments Modal Should match render of upload form 1`] = ` role="tab" > Add from web @@ -286,7 +286,7 @@ exports[`Attachments Modal Should match render of upload form 1`] = `   Upload and select file @@ -300,7 +300,7 @@ exports[`Attachments Modal Should match render of upload form 1`] = ` class="attachments-modal__dropzone-title" > Drag and drop file in this window to upload diff --git a/app/react/Attachments/components/specs/__snapshots__/WebMediaResourceForm.spec.tsx.snap b/app/react/Attachments/components/specs/__snapshots__/WebMediaResourceForm.spec.tsx.snap index 7a728abf7e..e181110ade 100644 --- a/app/react/Attachments/components/specs/__snapshots__/WebMediaResourceForm.spec.tsx.snap +++ b/app/react/Attachments/components/specs/__snapshots__/WebMediaResourceForm.spec.tsx.snap @@ -40,9 +40,9 @@ exports[`Should match render of wem media form 1`] = ` icon="link" />   - + Add from URL - + `; @@ -105,9 +105,9 @@ exports[`should also display a name field when hasName is true 1`] = ` icon="link" />   - + Add from URL - + `; diff --git a/app/react/ConnectionsList/components/specs/ConnectionsGroup.spec.js b/app/react/ConnectionsList/components/specs/ConnectionsGroup.spec.js index 63527f9028..5cb30aefeb 100644 --- a/app/react/ConnectionsList/components/specs/ConnectionsGroup.spec.js +++ b/app/react/ConnectionsList/components/specs/ConnectionsGroup.spec.js @@ -1,9 +1,7 @@ -import { fromJS as Immutable } from 'immutable'; import React from 'react'; - +import { fromJS as Immutable } from 'immutable'; import { shallow } from 'enzyme'; import ShowIf from 'app/App/ShowIf'; - import { ConnectionsGroup } from '../ConnectionsGroup'; describe('ConnectionsGroup', () => { @@ -58,12 +56,16 @@ describe('ConnectionsGroup', () => { expect(subItem1.props().title).toBe('template 1'); expect(subItem1.find('input').props().checked).toBe(false); - expect(subItem1.find('.multiselectItem-name').text()).toBe('template 1'); + expect(subItem1.find('.multiselectItem-name').children().children().text()).toBe( + 'template 1' + ); expect(subItem1.find('.multiselectItem-results').text()).toBe('1'); expect(subItem2.props().title).toBe('template 2'); expect(subItem2.find('input').props().checked).toBe(false); - expect(subItem2.find('.multiselectItem-name').text()).toBe('template 2'); + expect(subItem2.find('.multiselectItem-name').children().children().text()).toBe( + 'template 2' + ); expect(subItem2.find('.multiselectItem-results').text()).toBe('2'); }); diff --git a/app/react/Documents/components/specs/__snapshots__/DocumentContentSnippets.spec.js.snap b/app/react/Documents/components/specs/__snapshots__/DocumentContentSnippets.spec.js.snap index d78695d607..b956b0df0b 100644 --- a/app/react/Documents/components/specs/__snapshots__/DocumentContentSnippets.spec.js.snap +++ b/app/react/Documents/components/specs/__snapshots__/DocumentContentSnippets.spec.js.snap @@ -5,7 +5,11 @@ exports[`SnippetList should render all document snippets 1`] = `
  • - Document contents + + Document contents +
  • - + Edit - + `; diff --git a/app/react/Documents/components/specs/__snapshots__/MetadataFieldSnippets.spec.js.snap b/app/react/Documents/components/specs/__snapshots__/MetadataFieldSnippets.spec.js.snap index 618af0de66..43f296cb90 100644 --- a/app/react/Documents/components/specs/__snapshots__/MetadataFieldSnippets.spec.js.snap +++ b/app/react/Documents/components/specs/__snapshots__/MetadataFieldSnippets.spec.js.snap @@ -8,7 +8,11 @@ exports[`SnippetList should properly render title snippets with Title label as h - Summary + + Summary +
  • - Summary + + Summary +
  • - Search text + + Search text +

    - Search text description + + Search text description +

    `; @@ -24,10 +32,18 @@ exports[`SearchText blankState when there is search term should render a no matc icon="search" />

    - No text match + + No text match +

    - No text match description + + No text match description +

    `; diff --git a/app/react/Forms/components/specs/Switcher.spec.tsx b/app/react/Forms/components/specs/Switcher.spec.tsx index 8d5906823a..1a09c57a4d 100644 --- a/app/react/Forms/components/specs/Switcher.spec.tsx +++ b/app/react/Forms/components/specs/Switcher.spec.tsx @@ -40,7 +40,7 @@ describe('Switcher', () => { it('should receive alternative elements for values', () => { render({ leftLabel: ALL, rightLabel: NONE }); - const labels = component.find('Connect(Translate)'); + const labels = component.find('Translate'); expect(labels.at(0).props().children).toEqual('ALL'); expect(labels.at(1).props().children).toEqual('NONE'); }); @@ -54,7 +54,7 @@ describe('Switcher', () => { it('should render default labels AND/OR', () => { render(); - const labels = component.find('Connect(Translate)'); + const labels = component.find('Translate'); expect(labels.at(0).props().children).toEqual('AND'); expect(labels.at(1).props().children).toEqual('OR'); }); diff --git a/app/react/Forms/components/specs/__snapshots__/DateRange.spec.js.snap b/app/react/Forms/components/specs/__snapshots__/DateRange.spec.js.snap index 224a91aca5..cb1d26c690 100644 --- a/app/react/Forms/components/specs/__snapshots__/DateRange.spec.js.snap +++ b/app/react/Forms/components/specs/__snapshots__/DateRange.spec.js.snap @@ -8,11 +8,11 @@ exports[`DateRange should allow using the local timezone 1`] = ` - From: - + - To: - + - From: - + - To: - + - No options found + + No options found +
  • -5 - + x more - + @@ -526,9 +530,9 @@ exports[`MultiSelect should not render an empty group 1`] = ` -2 - + x more - + diff --git a/app/react/I18N/I18NLinkV2.tsx b/app/react/I18N/I18NLinkV2.tsx new file mode 100644 index 0000000000..a418caa87f --- /dev/null +++ b/app/react/I18N/I18NLinkV2.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { useAtomValue } from 'jotai'; +import { NavLinkProps, NavLink } from 'react-router-dom'; +import { localeAtom } from 'V2/atoms'; + +type I18NLinkProps = NavLinkProps & { to: string; activeClassname?: string }; + +const I18NLink = (props: I18NLinkProps) => { + const { to: link, className, activeClassname, ...rest } = props; + const locale = useAtomValue(localeAtom); + const parsedLink = link.startsWith('/') ? link.slice(1) : link; + const to = locale ? `/${locale}/${parsedLink}` : `/${parsedLink}`; + + return ( + `${className || ''} ${isActive ? activeClassname : ''}`} + // eslint-disable-next-line react/jsx-props-no-spreading + {...rest} + /> + ); +}; + +export { I18NLink }; diff --git a/app/react/I18N/Translate.tsx b/app/react/I18N/Translate.tsx new file mode 100644 index 0000000000..dca43aba2f --- /dev/null +++ b/app/react/I18N/Translate.tsx @@ -0,0 +1,82 @@ +/* eslint-disable max-statements */ +import React, { Fragment, ReactNode } from 'react'; +import { useAtom, useAtomValue } from 'jotai'; +import { translationsAtom, inlineEditAtom, localeAtom } from 'V2/atoms'; + +const parseMarkdownMarker = ( + line: string, + regexp: RegExp, + wrapper: (text: string) => ReactNode +) => { + const matches = line.match(regexp); + if (matches == null) { + return matches; + } + const parts = matches.input?.split(matches[0]); + return ( + <> + {parts?.length && parts[0]} + {wrapper(matches[1])} + {parts?.length && parts[1]} + + ); +}; + +const parseMarkdownBoldMarker = (line: string) => + parseMarkdownMarker(line, /\*{2}(.*)\*{2}/, text => {text}); + +const parseMarkdownItalicMarker = (line: string) => + parseMarkdownMarker(line, /\*(.*)\*/, text => {text}); + +type TranslateProps = { + className?: string; + children?: string; + context?: string; + translationKey?: string; +}; + +const Translate = ({ className, children, context = 'System', translationKey }: TranslateProps) => { + const translations = useAtomValue(translationsAtom); + const locale = useAtomValue(localeAtom); + const [inlineEditState, setInlineEditState] = useAtom(inlineEditAtom); + + const language = translations.find(translation => translation.locale === locale); + const activeClassName = inlineEditState.inlineEdit ? 'translation active' : 'translation'; + + const translationContext = language?.contexts.find(ctx => ctx.id === context) || { values: {} }; + const text = translationContext.values[(translationKey || children)!] || children; + const lines = text ? text.split('\n') : []; + + return ( + { + if (inlineEditState.inlineEdit) { + event.stopPropagation(); + event.preventDefault(); + setInlineEditState({ + inlineEdit: inlineEditState.inlineEdit, + context, + translationKey: (translationKey || children)!, + }); + } + }} + className={`${activeClassName} ${className || ''}`} + > + {lines.map((line, index) => { + const boldMatches = parseMarkdownBoldMarker(line); + const italicMatches = parseMarkdownItalicMarker(line); + return ( + + {boldMatches || + italicMatches || ( // eslint-disable-next-line react/jsx-no-useless-fragment + <>{line} + )} + {index < lines.length - 1 &&
    } +
    + ); + })} +
    + ); +}; + +export { Translate }; diff --git a/app/react/I18N/TranslateModal.tsx b/app/react/I18N/TranslateModal.tsx new file mode 100644 index 0000000000..336bfa78f3 --- /dev/null +++ b/app/react/I18N/TranslateModal.tsx @@ -0,0 +1,131 @@ +/* eslint-disable react/jsx-props-no-spreading */ +import React from 'react'; +import { useAtom, useAtomValue, useSetAtom } from 'jotai'; +import { useFieldArray, useForm } from 'react-hook-form'; +import { FetchResponseError } from 'shared/JSONRequest'; +import { Modal } from 'V2/Components/UI'; +import { settingsAtom, translationsAtom, inlineEditAtom, notificationAtom } from 'V2/atoms'; +import { InputField } from 'app/V2/Components/Forms'; +import { Button } from 'V2/Components/UI/Button'; +import { TranslationValue } from 'V2/shared/types'; +import { postV2 } from 'V2/api/translations'; +import { t } from './translateFunction'; + +const TranslateModal = () => { + const [inlineEditState, setInlineEditState] = useAtom(inlineEditAtom); + const [translations] = useAtom(translationsAtom); + const setNotifications = useSetAtom(notificationAtom); + const context = translations[0].contexts.find(ctx => ctx.id === inlineEditState.context)!; + const { languages = [] } = useAtomValue(settingsAtom); + + const { + register, + handleSubmit, + control, + reset, + formState: { errors, isDirty, isSubmitting }, + } = useForm<{ data: TranslationValue[] }>({ + mode: 'onSubmit', + }); + + const { fields } = useFieldArray({ control, name: 'data' }); + + React.useEffect(() => { + const initialValues = translations.map(translation => { + const language = languages.find(lang => lang.key === translation.locale)!; + const languageContext = translation.contexts.find(c => c.id === context?.id); + const value = + languageContext?.values[inlineEditState.translationKey] || inlineEditState.translationKey; + return { + language: language.key, + value, + key: inlineEditState.translationKey, + }; + }); + reset({ data: initialValues }); + }, [context, inlineEditState.translationKey, languages, reset, translations]); + + const closeModal = () => { + setInlineEditState({ inlineEdit: true, translationKey: '', context: '' }); + }; + + const submit = async ({ data }: { data: TranslationValue[] }) => { + if (isDirty) { + const response = await postV2(data, context); + if (response === 200) { + setNotifications({ + type: 'success', + text: t('System', 'Translations saved', null, false), + }); + } + if (response instanceof FetchResponseError) { + const message = response.json?.prettyMessage + ? response.json.prettyMessage + : response.message; + setNotifications({ + type: 'error', + text: t('System', 'An error occurred', null, false), + details: message, + }); + } + } + closeModal(); + }; + + return ( + inlineEditState.context && ( +
    +
    + +
    + + {t('System', 'Translate', 'Translate', false)} + + {t('System', 'Close', 'Close', false)} + + + + {fields?.map((field, index) => ( + + {field.language.toUpperCase()} + + } + id={field.id} + key={field.id} + {...register(`data.${index}.value`, { required: true })} + hasErrors={errors.data && errors.data[index] !== undefined} + disabled={isSubmitting} + /> + ))} + + + + + +
    +
    +
    +
    + ) + ); +}; + +export { TranslateModal }; diff --git a/app/react/I18N/actions/I18NActions.js b/app/react/I18N/actions/I18NActions.js index 38f5e911aa..49b4f6a53a 100644 --- a/app/react/I18N/actions/I18NActions.js +++ b/app/react/I18N/actions/I18NActions.js @@ -2,8 +2,8 @@ import { actions as formActions } from 'react-redux-form'; import * as notifications from 'app/Notifications/actions/notificationsActions'; import { store } from 'app/store'; import { RequestParams } from 'app/utils/RequestParams'; +import { t } from 'app/I18N'; import I18NApi from '../I18NApi'; -import t from '../t'; export function inlineEditTranslation(contextId, key) { return dispatch => { diff --git a/app/react/I18N/components/I18N.js b/app/react/I18N/components/I18N.js index 3339a99b4a..72295f0c8f 100644 --- a/app/react/I18N/components/I18N.js +++ b/app/react/I18N/components/I18N.js @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; -export class I18N extends Component { +class I18NComponent extends Component { render() { const dictionary = this.props.dictionaries.toJS().find(d => d.locale === this.props.locale) || { values: {}, @@ -13,7 +13,7 @@ export class I18N extends Component { } } -I18N.propTypes = { +I18NComponent.propTypes = { children: PropTypes.string, locale: PropTypes.string, dictionaries: PropTypes.object, @@ -21,4 +21,4 @@ I18N.propTypes = { const mapStateToProps = ({ locale, dictionaries }) => ({ locale, dictionaries }); -export default connect(mapStateToProps)(I18N); +export const I18N = connect(mapStateToProps)(I18NComponent); diff --git a/app/react/I18N/components/I18NMenu.tsx b/app/react/I18N/components/I18NMenu.tsx index 0e74a6e592..8d49d472c2 100644 --- a/app/react/I18N/components/I18NMenu.tsx +++ b/app/react/I18N/components/I18NMenu.tsx @@ -1,28 +1,21 @@ +/* eslint-disable react/no-multi-comp */ /* eslint-disable react-hooks/rules-of-hooks */ import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { bindActionCreators, Dispatch } from 'redux'; -import { connect, ConnectedProps } from 'react-redux'; -import { IImmutable } from 'shared/types/Immutable'; +import { Location, useLocation } from 'react-router-dom'; +import { useAtom, useAtomValue } from 'jotai'; +import { ChevronUpIcon, ChevronDownIcon } from '@heroicons/react/20/solid'; import { LanguagesListSchema } from 'shared/types/commonTypes'; -import { Icon } from 'UI'; -import { actions, Translate, t } from 'app/I18N'; -import { IStore } from 'app/istore'; -import { NeedAuthorization } from 'app/Auth'; +import { NeedAuthorization } from 'V2/Components/UI'; import { useOnClickOutsideElement } from 'app/utils/useOnClickOutsideElementHook'; -import { Location, useLocation } from 'react-router-dom'; +import { inlineEditAtom, localeAtom, settingsAtom, userAtom } from 'V2/atoms'; +import { Translate, t } from 'app/I18N'; const locationSearch = (location: Location) => { const cleanSearch = location.search.split(/page=\d+|&page=\d+/).join(''); return cleanSearch === '?' ? '' : cleanSearch; }; -const prepareValues = ( - languageMap: IImmutable, - locale: string, - location: Location -) => { - const languages: LanguagesListSchema = languageMap.toJS(); - +const prepareValues = (languages: LanguagesListSchema, locale: string, location: Location) => { const selectedLanguage = languages.find(lang => lang.key === locale) || languages.find(lang => lang.default); @@ -37,28 +30,20 @@ const prepareValues = ( return { languages, selectedLanguage, urlLocation, path }; }; -const mapStateToProps = (state: IStore) => ({ - languages: state.settings.collection.get('languages'), - i18nmode: state.inlineEdit.get('inlineEdit'), - locale: state.locale, - user: state.user, -}); +const SVGCircle = ({ fill }: { fill: string }) => ( + + + +); -const mapDispatchToProps = (dispatch: Dispatch<{}>) => - bindActionCreators({ toggleInlineEdit: actions.toggleInlineEdit }, dispatch); +// eslint-disable-next-line max-statements +const I18NMenu = () => { + const [inlineEditState, setInlineEditState] = useAtom(inlineEditAtom); + const locale = useAtomValue(localeAtom); + const user = useAtomValue(userAtom); + const { languages: languageList } = useAtomValue(settingsAtom); -const connector = connect(mapStateToProps, mapDispatchToProps); - -type mappedProps = ConnectedProps; - -const i18NMenuComponent = ({ - languages: languageMap, - i18nmode, - user, - locale, - toggleInlineEdit, -}: mappedProps) => { - if (!languageMap || languageMap.size < 1 || (languageMap!.size <= 1 && !user.get('_id'))) { + if (!languageList || languageList.length < 1 || (languageList.length <= 1 && !user?._id)) { return
    ; } @@ -68,7 +53,7 @@ const i18NMenuComponent = ({ const [dropdownOpen, setDropdownOpen] = useState(false); const { languages, selectedLanguage, path, urlLocation } = prepareValues( - languageMap!, + languageList, locale, location ); @@ -88,21 +73,27 @@ const i18NMenuComponent = ({ return (
  • - {i18nmode && ( + {inlineEditState.inlineEdit && (
    @@ -112,7 +103,7 @@ const i18NMenuComponent = ({ )} - {!i18nmode && ( + {!inlineEditState.inlineEdit && (
    @@ -34,7 +42,11 @@ exports[`ItemSnippet should first metadata snippet if metadata only has metadata
    - Summary + + Summary +
    - Show more + + Show more +
    @@ -61,7 +77,11 @@ exports[`ItemSnippet should first metadata snippet when there are no document co
    - Title + + Title +
    - Show more + + Show more +
    @@ -88,7 +112,11 @@ exports[`ItemSnippet should first title snippet if metadata only has title snipp
    - Title + + Title +
    - Show more + + Show more +
    @@ -115,7 +147,11 @@ exports[`ItemSnippet should show first document snippet if there are not metadat
    - Document contents + + Document contents +
    - Show more + + Show more +
    diff --git a/app/react/Library/actions/exportActions.ts b/app/react/Library/actions/exportActions.ts index 8eda955c04..b688f4d468 100644 --- a/app/react/Library/actions/exportActions.ts +++ b/app/react/Library/actions/exportActions.ts @@ -72,9 +72,11 @@ const requestHandler = ( .catch(err => { clearState(dispatch); if (err.status === 403) { - dispatch(notify(t('System', 'Invalid captcha'), 'danger')); + dispatch(notify(t('System', 'Invalid captcha', null, false), 'danger')); } else { - dispatch(notify(t('System', 'An error has occurred during data export'), 'danger')); + dispatch( + notify(t('System', 'An error has occurred during data export', null, false), 'danger') + ); } return err; }); diff --git a/app/react/Library/components/specs/DocumentTypesList.spec.js b/app/react/Library/components/specs/DocumentTypesList.spec.js index cf13ce71d2..a9034c955f 100644 --- a/app/react/Library/components/specs/DocumentTypesList.spec.js +++ b/app/react/Library/components/specs/DocumentTypesList.spec.js @@ -2,9 +2,13 @@ import React from 'react'; import { shallow } from 'enzyme'; import Immutable from 'immutable'; - import { DocumentTypesList } from '../DocumentTypesList'; +jest.mock('app/I18N', () => ({ + t: (_context, key) => key, + Translate: ({ children }) => children, +})); + describe('DocumentTypesList', () => { let component; let props; diff --git a/app/react/Library/components/specs/__snapshots__/Doc.spec.js.snap b/app/react/Library/components/specs/__snapshots__/Doc.spec.js.snap index bb71456b61..752e0ecaa6 100644 --- a/app/react/Library/components/specs/__snapshots__/Doc.spec.js.snap +++ b/app/react/Library/components/specs/__snapshots__/Doc.spec.js.snap @@ -54,6 +54,9 @@ exports[`Doc when target reference is specified should pass the target reference icon="exchange-alt" /> + @@ -88,6 +91,9 @@ exports[`Doc when target reference is specified should pass the target reference icon="exchange-alt" /> + diff --git a/app/react/Library/components/specs/__snapshots__/NestedFilter.spec.js.snap b/app/react/Library/components/specs/__snapshots__/NestedFilter.spec.js.snap index fab308b214..6c7c2c359c 100644 --- a/app/react/Library/components/specs/__snapshots__/NestedFilter.spec.js.snap +++ b/app/react/Library/components/specs/__snapshots__/NestedFilter.spec.js.snap @@ -25,9 +25,9 @@ exports[`NestedFilter should render a text filter field with a label and passing >   - + Strict mode - + diff --git a/app/react/Library/components/specs/__snapshots__/QuickLabelHeader.spec.tsx.snap b/app/react/Library/components/specs/__snapshots__/QuickLabelHeader.spec.tsx.snap index f4c3a77266..999ffe41cf 100644 --- a/app/react/Library/components/specs/__snapshots__/QuickLabelHeader.spec.tsx.snap +++ b/app/react/Library/components/specs/__snapshots__/QuickLabelHeader.spec.tsx.snap @@ -18,14 +18,22 @@ exports[`QuickLabelPanel should render with thesaurus 1`] = ` - Back to thesaurus + + Back to thesaurus +

    - Quick labeling for + + Quick labeling for +   thesaurus1 @@ -44,7 +52,11 @@ exports[`QuickLabelPanel should render without thesaurus 1`] = ` className="content-header-title" >

    - Ooops... please go + + Ooops... please go +   - Back to thesauri + + Back to thesauri +

    diff --git a/app/react/Library/components/specs/__snapshots__/QuickLabelPanel.spec.tsx.snap b/app/react/Library/components/specs/__snapshots__/QuickLabelPanel.spec.tsx.snap index 56c9fbcf3d..99b3235532 100644 --- a/app/react/Library/components/specs/__snapshots__/QuickLabelPanel.spec.tsx.snap +++ b/app/react/Library/components/specs/__snapshots__/QuickLabelPanel.spec.tsx.snap @@ -16,9 +16,9 @@ exports[`QuickLabelPanel should render correctly 1`] = ` 2 - + selected - +

  • - + View - + `; @@ -26,9 +26,9 @@ exports[`ViewDocButton should render a view button poiting to the doc url with t icon="angle-right" /> - + View - + `; @@ -42,9 +42,9 @@ exports[`ViewDocButton when targetReference is provided should render view butto icon="angle-right" /> - + View - + `; @@ -58,8 +58,8 @@ exports[`ViewDocButton when targetReference is provided should render view butto icon="angle-right" /> - + View - + `; diff --git a/app/react/Markdown/components/specs/EntityData.spec.tsx b/app/react/Markdown/components/specs/EntityData.spec.tsx index adef62f2e3..72b14bdda4 100644 --- a/app/react/Markdown/components/specs/EntityData.spec.tsx +++ b/app/react/Markdown/components/specs/EntityData.spec.tsx @@ -4,7 +4,9 @@ import React, { act } from 'react'; import { screen, RenderResult } from '@testing-library/react'; import { renderConnectedContainer } from 'app/utils/test/renderConnected'; -import { state } from './fixture/state'; +import { TestAtomStoreProvider } from 'V2/testing'; +import { localeAtom, translationsAtom } from 'V2/atoms'; +import { state, translations } from './fixture/state'; import { EntityData, EntityDataProps } from '../EntityData'; describe('EntityData Markdown', () => { @@ -25,7 +27,17 @@ describe('EntityData Markdown', () => { const render = async (props: EntityDataProps) => { await act(async () => { - ({ renderResult } = renderConnectedContainer(, () => state)); + ({ renderResult } = renderConnectedContainer( + + + , + () => state + )); }); }; diff --git a/app/react/Markdown/components/specs/__snapshots__/ContactForm.spec.js.snap b/app/react/Markdown/components/specs/__snapshots__/ContactForm.spec.js.snap index 329520e05d..3542446a4b 100644 --- a/app/react/Markdown/components/specs/__snapshots__/ContactForm.spec.js.snap +++ b/app/react/Markdown/components/specs/__snapshots__/ContactForm.spec.js.snap @@ -31,9 +31,9 @@ exports[`ContactForm should render the ContactForm 1`] = ` className="form-group-label" htmlFor="name" > - + Name - + @@ -57,9 +57,9 @@ exports[`ContactForm should render the ContactForm 1`] = ` className="form-group-label" htmlFor="email" > - + Email - + @@ -83,9 +83,9 @@ exports[`ContactForm should render the ContactForm 1`] = ` className="form-group-label" htmlFor="message" > - + Message - + @@ -115,9 +115,9 @@ exports[`ContactForm should render the ContactForm 1`] = ` - + Send - + diff --git a/app/react/Markdown/components/specs/__snapshots__/MarkdownMedia.spec.tsx.snap b/app/react/Markdown/components/specs/__snapshots__/MarkdownMedia.spec.tsx.snap index a4af7d19a6..ea160de429 100644 --- a/app/react/Markdown/components/specs/__snapshots__/MarkdownMedia.spec.tsx.snap +++ b/app/react/Markdown/components/specs/__snapshots__/MarkdownMedia.spec.tsx.snap @@ -217,14 +217,14 @@ exports[`MarkdownMedia render uploaded files should render the edition mode 1`] type="button" > Add timelink
    Timelinks diff --git a/app/react/Markdown/components/specs/fixture/state.ts b/app/react/Markdown/components/specs/fixture/state.ts index ad60a33d94..3672ab2b40 100644 --- a/app/react/Markdown/components/specs/fixture/state.ts +++ b/app/react/Markdown/components/specs/fixture/state.ts @@ -40,20 +40,19 @@ const state = { }, ]), thesauris: Immutable.fromJS([{}]), - translations: Immutable.fromJS([ - { - locale: 'en', - contexts: [ - { - id: 't1', - values: { Title: 'Title translated', 'Main Image': 'Main Image translated' }, - }, - ], - }, - ]), settings: { collection: Immutable.fromJS({ newNameGeneration: true }) }, - inlineEdit: Immutable.fromJS({ inlineEdit: false }), - locale: 'en', }; -export { state }; +const translations = [ + { + locale: 'en', + contexts: [ + { + id: 't1', + values: { Title: 'Title translated', 'Main Image': 'Main Image translated' }, + }, + ], + }, +]; + +export { state, translations }; diff --git a/app/react/Markdown/specs/__snapshots__/MarkdownViewer.spec.js.snap b/app/react/Markdown/specs/__snapshots__/MarkdownViewer.spec.js.snap index 79f670d9ca..8db0544671 100644 --- a/app/react/Markdown/specs/__snapshots__/MarkdownViewer.spec.js.snap +++ b/app/react/Markdown/specs/__snapshots__/MarkdownViewer.spec.js.snap @@ -306,11 +306,11 @@ exports[`MarkdownViewer render should render customHook components and show an e
    - Custom component markup error: unsupported values! Please check your configuration - +
    diff --git a/app/react/Metadata/components/specs/__snapshots__/GeolocationViewer.spec.js.snap b/app/react/Metadata/components/specs/__snapshots__/GeolocationViewer.spec.js.snap index 78f252d949..32d98e666a 100644 --- a/app/react/Metadata/components/specs/__snapshots__/GeolocationViewer.spec.js.snap +++ b/app/react/Metadata/components/specs/__snapshots__/GeolocationViewer.spec.js.snap @@ -12,15 +12,15 @@ exports[`GeolocationViewer should not fail if points is just an empty array 1`] className="print-view-alt" >

    - + Latitude - + :

    - + Longitude - + :

    @@ -66,16 +66,16 @@ exports[`GeolocationViewer should render a map with markers when onlyForCards is className="print-view-alt" >

    - + Latitude - + : 13

    - + Longitude - + : 7

    diff --git a/app/react/Metadata/components/specs/__snapshots__/IconField.spec.js.snap b/app/react/Metadata/components/specs/__snapshots__/IconField.spec.js.snap index 16586ee119..ebd6b15b40 100644 --- a/app/react/Metadata/components/specs/__snapshots__/IconField.spec.js.snap +++ b/app/react/Metadata/components/specs/__snapshots__/IconField.spec.js.snap @@ -7,9 +7,9 @@ exports[`IconField should be open when has value 1`] = ` - + remove icon - + @@ -19,9 +19,9 @@ exports[`IconField should be open when has value 1`] = ` open={true} showLabel={ - + add icon - + @@ -33,13 +33,13 @@ exports[`IconField should be open when has value 1`] = ` >
  • - + remove icon - + @@ -73,9 +73,9 @@ exports[`IconField should render IconSelector with toggleDisplay 1`] = ` open={false} showLabel={ - + add icon - + @@ -87,13 +87,13 @@ exports[`IconField should render IconSelector with toggleDisplay 1`] = ` >
  • - Label + + Label +
    - Geolocation Label + + Geolocation Label +
    - label array + + label array +
    - Link + + Link +
    - Media Label + + Media Label +
    - Image Label + + Image Label +
    - label array + + label array +
    - label array + + label array +
    - withUrl + + withUrl +
    - withUrl + + withUrl +
    - metadata without property + + metadata without property +
    - No property + + No property +
    `; @@ -330,7 +378,11 @@ exports[`Metadata should render sorted property with sorted styles 1`] = `
    - sortedBy + + sortedBy +
    - Label + + Label +
    - label + + label +
    - label + + label +
    - label array + + label array +
    + > + +
    diff --git a/app/react/Relationships/components/specs/LoadMoreRelationshipsButton.spec.js b/app/react/Relationships/components/specs/LoadMoreRelationshipsButton.spec.js index e7dd43429b..166dfd263d 100644 --- a/app/react/Relationships/components/specs/LoadMoreRelationshipsButton.spec.js +++ b/app/react/Relationships/components/specs/LoadMoreRelationshipsButton.spec.js @@ -1,9 +1,13 @@ import React from 'react'; import { shallow } from 'enzyme'; import { fromJS } from 'immutable'; - import { LoadMoreRelationshipsButton, mapStateToProps } from '../LoadMoreRelationshipsButton'; +jest.mock('app/I18N', () => ({ + t: (_context, key) => key, + Translate: ({ children }) => children, +})); + describe('LoadMoreRelationshipsButton', () => { let component; let props; diff --git a/app/react/Relationships/components/specs/RelationshipsFormButtons.spec.tsx b/app/react/Relationships/components/specs/RelationshipsFormButtons.spec.tsx index a7f54e1c7c..559dfefe31 100644 --- a/app/react/Relationships/components/specs/RelationshipsFormButtons.spec.tsx +++ b/app/react/Relationships/components/specs/RelationshipsFormButtons.spec.tsx @@ -78,7 +78,7 @@ describe('RelationshipsFormButtons', () => { render(user, { editing: false }); const buttons = component.find('button'); expect(buttons.length).toBe(1); - expect(buttons.at(0).find('span').text()).toEqual('Edit'); + expect(buttons.at(0).find('span.translation').text()).toEqual('Edit'); } ); it.each([editorUser, adminUser, collaboratorUser])( @@ -87,8 +87,8 @@ describe('RelationshipsFormButtons', () => { render(user, { editing: true }); const buttons = component.find('button'); expect(buttons.length).toBe(2); - expect(buttons.at(0).find('span').text()).toEqual('Cancel'); - expect(buttons.at(1).find('span').text()).toEqual('Save'); + expect(buttons.at(0).find('span.translation').text()).toEqual('Cancel'); + expect(buttons.at(1).find('span.translation').text()).toEqual('Save'); } ); }); diff --git a/app/react/Relationships/components/specs/__snapshots__/HubRelationshipMetadata.spec.js.snap b/app/react/Relationships/components/specs/__snapshots__/HubRelationshipMetadata.spec.js.snap index 9fd7bd5a97..54df749c77 100644 --- a/app/react/Relationships/components/specs/__snapshots__/HubRelationshipMetadata.spec.js.snap +++ b/app/react/Relationships/components/specs/__snapshots__/HubRelationshipMetadata.spec.js.snap @@ -91,7 +91,11 @@ exports[`HubRelationshipMetadata should render the metadata correctly when text key="text" >
    - Text + + Text +
    - Back to + + Back to + 'Thes' @@ -29,7 +33,11 @@ exports[`EntityViewer should render 1 1`] = ` - Documents including suggestion: + + Documents including suggestion: + 'Topic1' @@ -39,13 +47,21 @@ exports[`EntityViewer should render 1 1`] = ` />
    - Document + + Document + 4 - of + + of + >39 @@ -87,19 +103,31 @@ exports[`EntityViewer should render 2 1`] = ` - Documents for custom filter + + Documents for custom filter +
    - Document + + Document + 1 - of + + of + 10 diff --git a/app/react/SemanticSearch/components/specs/__snapshots__/DocumentResults.spec.js.snap b/app/react/SemanticSearch/components/specs/__snapshots__/DocumentResults.spec.js.snap index 4f73e1727a..16b2742933 100644 --- a/app/react/SemanticSearch/components/specs/__snapshots__/DocumentResults.spec.js.snap +++ b/app/react/SemanticSearch/components/specs/__snapshots__/DocumentResults.spec.js.snap @@ -59,9 +59,9 @@ exports[`DocumentResults render should render results summary and snippets above
    - + Threshold - + 30.00 % @@ -73,9 +73,21 @@ exports[`DocumentResults render should render results summary and snippets above + Precision + + } min={0.3} - minLabel="Exploration" + minLabel={ + + Exploration + + } model=".threshold" step={0.01} /> @@ -86,9 +98,9 @@ exports[`DocumentResults render should render results summary and snippets above className="metadata-type-numeric" >
    - + Number of sentences above threshold - +
    2 @@ -98,9 +110,9 @@ exports[`DocumentResults render should render results summary and snippets above className="metadata-type-numeric" >
    - + % of sentences above threshold - +
    50.00 diff --git a/app/react/SemanticSearch/components/specs/__snapshots__/ResultsFiltersPanel.spec.js.snap b/app/react/SemanticSearch/components/specs/__snapshots__/ResultsFiltersPanel.spec.js.snap index a87445724d..030d32035e 100644 --- a/app/react/SemanticSearch/components/specs/__snapshots__/ResultsFiltersPanel.spec.js.snap +++ b/app/react/SemanticSearch/components/specs/__snapshots__/ResultsFiltersPanel.spec.js.snap @@ -11,7 +11,11 @@ exports[`ResultsFiltersPanel render should render search filters and instruction
    - Fine tune + + Fine tune +
    - Threshold + + Threshold + 80.00%
    @@ -32,9 +40,21 @@ exports[`ResultsFiltersPanel render should render search filters and instruction + Precision + + } min={0.3} - minLabel="Exploration" + minLabel={ + + Exploration + + } model=".threshold" prefix="threshold" step={0.01} @@ -46,16 +66,32 @@ exports[`ResultsFiltersPanel render should render search filters and instruction key="Minimum relevant sentences per document" >
    - Minimum relevant sentences per document + + Minimum relevant sentences per document +
    + + + } min={1} - minLabel="" + minLabel={ + + + + } model=".minRelevantSentences" prefix="minRelevantSentences" step={1} @@ -75,25 +111,25 @@ exports[`ResultsFiltersPanel render should render search filters and instruction size="2x" />

    - Semantic search is a technique to provide contextual results. Its ability to capture concepts and word associations in human language enables the retrieval of related information such as synonyms, connected categories or entities, etc. . - +

    - The threshold determines how close the results match the search concept. Move the slider to the right to narrow down the concept of the search query. The obtained results will be more precise. Move the slider to the left to more broaden the concept and explore related content. - +

    - Semantic search is applied to each sentence in a document. Filter the documents by the minimum number of sentences that exceed the threshold. - +

    diff --git a/app/react/SemanticSearch/components/specs/__snapshots__/SemanticSearchMultieditPanel.spec.js.snap b/app/react/SemanticSearch/components/specs/__snapshots__/SemanticSearchMultieditPanel.spec.js.snap index 628dcd9b04..5c362bf7b7 100644 --- a/app/react/SemanticSearch/components/specs/__snapshots__/SemanticSearchMultieditPanel.spec.js.snap +++ b/app/react/SemanticSearch/components/specs/__snapshots__/SemanticSearchMultieditPanel.spec.js.snap @@ -51,17 +51,17 @@ exports[`SemanticSearchMultieditPanel open should not open side panel if there a size="2x" />

    - + Warning: you are editing multiple entities. Fields marked with a - + - + will be updated with the same value. - +

    - Cancel + + Cancel + @@ -153,17 +161,17 @@ exports[`SemanticSearchMultieditPanel should render multi edit form for semantic size="2x" />

    - + Warning: you are editing multiple entities. Fields marked with a - + - + will be updated with the same value. - +

    - Cancel + + Cancel + diff --git a/app/react/SemanticSearch/components/specs/__snapshots__/SemanticSearchResults.spec.js.snap b/app/react/SemanticSearch/components/specs/__snapshots__/SemanticSearchResults.spec.js.snap index 46235b5664..a55ad71855 100644 --- a/app/react/SemanticSearch/components/specs/__snapshots__/SemanticSearchResults.spec.js.snap +++ b/app/react/SemanticSearch/components/specs/__snapshots__/SemanticSearchResults.spec.js.snap @@ -17,9 +17,9 @@ exports[`SemanticSearchResults should render results in ItemList 1`] = ` >

    - + Semantic search - + :   - + Edit all documents matching this criteria - +

    - + documents - +
    @@ -66,16 +66,16 @@ exports[`SemanticSearchResults should render results in ItemList 1`] = ` className="metadata-type-text" >
    - + Sentences above threshold - +
    2 - + out of - + ( 50.00 @@ -117,16 +117,16 @@ exports[`SemanticSearchResults should render results in ItemList 1`] = ` className="metadata-type-text" >
    - + Sentences above threshold - +
    1 - + out of - + ( 40.00 @@ -169,18 +169,18 @@ exports[`SemanticSearchResults should render results in ItemList 1`] = ` - + of - + 0 - + documents - +

    - + x more - +
    @@ -215,9 +215,9 @@ exports[`SemanticSearchResults when the search is empty should render not found className="row panels-layout" >

    - + Search not found - +

    ({ ...thesaurus, - name: t(thesaurus._id, thesaurus.name, null, false), + name: t(thesaurus._id!.toString(), thesaurus.name, null, false), })), 'name' ); diff --git a/app/react/Templates/components/specs/FormConfigSelect.spec.tsx b/app/react/Templates/components/specs/FormConfigSelect.spec.tsx index 8aa0ebf1c6..36c8b9e53b 100644 --- a/app/react/Templates/components/specs/FormConfigSelect.spec.tsx +++ b/app/react/Templates/components/specs/FormConfigSelect.spec.tsx @@ -3,14 +3,41 @@ */ import React from 'react'; import Immutable from 'immutable'; -import { screen, RenderResult } from '@testing-library/react'; +import { screen, RenderResult, act } from '@testing-library/react'; import { Provider } from 'react-redux'; +import { Provider as AtomProvider } from 'jotai'; import { MockStoreEnhanced } from 'redux-mock-store'; import { defaultState, renderConnectedContainer } from 'app/utils/test/renderConnected'; -import { store } from 'app/store'; -import { t } from 'app/I18N'; +import { atomStore, localeAtom, translationsAtom } from 'V2/atoms'; +import { ClientTranslationSchema } from 'app/istore'; import { FormConfigSelect } from '../FormConfigSelect'; +const translations: ClientTranslationSchema[] = [ + { + locale: 'es', + contexts: [ + { + _id: '1', + id: '1', + label: 'Thesauri 1', + values: { + 'Thesauri 1': 'Diccionario B', + }, + type: 'Thesaurus', + }, + { + _id: '2', + id: '2', + label: 'Thesauri 2', + values: { + 'Thesauri 2': 'Diccionario A', + }, + type: 'Thesaurus', + }, + ], + }, +]; + const defineTemplateInStore = ( content: string, _id?: string, @@ -36,11 +63,11 @@ describe('FormConfigSelect', () => { let renderResult: RenderResult; let reduxStore: MockStoreEnhanced; let state: any; + let locale = 'en'; beforeEach(() => { state = { ...defaultState, - locale: 'en', template: { ...defineTemplateInStore('1', 'id1') }, thesauris: Immutable.fromJS([ { _id: '1', values: [], name: 'Thesauri 1' }, @@ -49,37 +76,17 @@ describe('FormConfigSelect', () => { templates: Immutable.fromJS([ { properties: [{ content: '1', type: 'select' }], name: 'template1' }, ]), - translations: Immutable.fromJS([ - { - locale: 'es', - contexts: [ - { - _id: '1', - id: '1', - label: 'Thesauri 1', - values: { - 'Thesauri 1': 'Diccionario B', - }, - type: 'Thesaurus', - }, - { - _id: '2', - id: '2', - label: 'Thesauri 2', - values: { - 'Thesauri 2': 'Diccionario A', - }, - type: 'Thesaurus', - }, - ], - }, - ]), }; }); const render = () => { + atomStore.set(translationsAtom, translations); + atomStore.set(localeAtom, locale); + ({ store: reduxStore, renderResult } = renderConnectedContainer( - , + + + , () => state )); }; @@ -92,9 +99,7 @@ describe('FormConfigSelect', () => { }); it('should render the select with the sorted translated dictionaries', () => { - state.locale = 'es'; - jest.spyOn(store!, 'getState').mockImplementationOnce(() => ({ ...state })); - t.resetCachedTranslation(); + locale = 'es'; render(); const options = screen.getAllByText('Diccionario', { exact: false }); @@ -103,17 +108,17 @@ describe('FormConfigSelect', () => { }); describe('validation', () => { - it('should show a warning when changing the select thesaurus', () => { - t.resetCachedTranslation(); + it('should show a warning when changing the select thesaurus', async () => { render(); state = { ...state, template: { ...defineTemplateInStore('2', 'id1') } }; - renderResult.rerender( - - - - ); + await act(() => { + reduxStore.dispatch({ + type: 'rrf/change', + value: 'id1', + }); + }); const warning = screen.queryByText( 'By making this change, any values from the previous thesaurus', diff --git a/app/react/Templates/components/specs/TemplateAsPageControl.spec.tsx b/app/react/Templates/components/specs/TemplateAsPageControl.spec.tsx index 84380c3862..ff6148d33b 100644 --- a/app/react/Templates/components/specs/TemplateAsPageControl.spec.tsx +++ b/app/react/Templates/components/specs/TemplateAsPageControl.spec.tsx @@ -10,6 +10,11 @@ import { TemplateAsPageControl } from '../TemplateAsPageControl'; const middlewares = [thunk]; +jest.mock('app/I18N', () => ({ + t: (_context: string, key: string) => key, + Translate: ({ children }: { children: React.ReactElement }) => children, +})); + describe('TemplateAsPageControl', () => { const mockStoreCreator: MockStoreCreator = configureStore(middlewares); let component: ShallowWrapper; diff --git a/app/react/Templates/components/specs/__snapshots__/FormConfigMultimedia.spec.js.snap b/app/react/Templates/components/specs/__snapshots__/FormConfigMultimedia.spec.js.snap index 0a7333779f..0dd51cf8d0 100644 --- a/app/react/Templates/components/specs/__snapshots__/FormConfigMultimedia.spec.js.snap +++ b/app/react/Templates/components/specs/__snapshots__/FormConfigMultimedia.spec.js.snap @@ -6,9 +6,9 @@ exports[`FormConfigMultimedia should allow excluding "required" 1`] = ` className="form-group" > - + This property will be shown without the label. - + - + This property will be shown using all the width available. - + - + This property will appear in the library cards as part of the basic info. - +
    @@ -53,9 +53,9 @@ exports[`FormConfigMultimedia should allow excluding "required" 1`] = ` className="form-group" >

    - + Fit - +   - will show the entire media inside the container. - +
    - + Fill - +   - will attempt to fill the container, using its entire width. In cards, cropping is likely to occur. - +

    @@ -230,9 +230,9 @@ exports[`FormConfigMultimedia should allow excluding "style" 1`] = ` className="form-group" > - + This property will be shown without the label. - + - + This property will be shown using all the width available. - + - You won't be able to save an entity if this property is empty. - + - + This property will appear in the library cards as part of the basic info. - + - + This property will be shown without the label. - + - + This property will be shown using all the width available. - + - You won't be able to save an entity if this property is empty. - + - + This property will appear in the library cards as part of the basic info. - +
    @@ -365,9 +365,9 @@ exports[`FormConfigMultimedia should allow setting a help text 1`] = ` className="form-group" >

    - + Fit - +   - will show the entire media inside the container. - +
    - + Fill - +   - will attempt to fill the container, using its entire width. In cards, cropping is likely to occur. - +

    diff --git a/app/react/Templates/components/specs/__snapshots__/FormConfigRelationship.spec.js.snap b/app/react/Templates/components/specs/__snapshots__/FormConfigRelationship.spec.js.snap index 40a1358af8..fc256811f7 100644 --- a/app/react/Templates/components/specs/__snapshots__/FormConfigRelationship.spec.js.snap +++ b/app/react/Templates/components/specs/__snapshots__/FormConfigRelationship.spec.js.snap @@ -8,9 +8,9 @@ exports[`FormConfigRelationship when the fields are invalid and dirty or the for - + Forgot Password? - + @@ -87,9 +87,9 @@ exports[`Login on instance should render the component with the login form 1`] = className="btn btn-block btn-lg btn-primary" type="submit" > - + Login - +

    @@ -127,7 +127,11 @@ exports[`Login submit() on response failure when authorization conflict (2fa req className="form-group login-token" >
    - Two-step verification + + Two-step verification +
    - Authentication code + + Authentication code +

    - + Open the two-factor Authenticator app on your device - +
    - + to view your authentication code and verify your identity. - +

    - + Return to login - +

    @@ -176,9 +184,9 @@ exports[`Login submit() on response failure when authorization conflict (2fa req className="btn btn-block btn-lg btn-primary" type="submit" > - + Verify - +

    @@ -216,7 +224,11 @@ exports[`Login submit() on response failure when authorization failure should se className="form-group login-token has-error" >
    - Two-step verification + + Two-step verification +
    - Authentication code + + Authentication code + - Two-factor verification failed + + Two-factor verification failed +

    - + Open the two-factor Authenticator app on your device - +
    - + to view your authentication code and verify your identity. - +

    - + Return to login - +

    @@ -272,9 +292,9 @@ exports[`Login submit() on response failure when authorization failure should se className="btn btn-block btn-lg btn-primary" type="submit" > - + Verify - +

    diff --git a/app/react/V2/Components/Forms/Geolocation.tsx b/app/react/V2/Components/Forms/Geolocation.tsx index 6cff296396..48f99d7d93 100644 --- a/app/react/V2/Components/Forms/Geolocation.tsx +++ b/app/react/V2/Components/Forms/Geolocation.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import { Translate } from 'app/I18N'; import { Map, Layer } from 'app/Map/MapContainer'; -import { Label, InputField } from 'app/V2/Components/Forms'; +import { Label, InputField } from 'V2/Components/Forms'; interface GeolocationProps { name: string; diff --git a/app/react/V2/Components/Forms/specs/MultiselectList.cy.tsx b/app/react/V2/Components/Forms/specs/MultiselectList.cy.tsx index 3ecb07d0f1..3ccafd4980 100644 --- a/app/react/V2/Components/Forms/specs/MultiselectList.cy.tsx +++ b/app/react/V2/Components/Forms/specs/MultiselectList.cy.tsx @@ -1,8 +1,6 @@ import React from 'react'; import 'cypress-axe'; -import { Provider } from 'react-redux'; import { mount } from '@cypress/react18'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { MultiselectList } from '../MultiselectList'; describe('MultiselectList.cy.tsx', () => { @@ -58,16 +56,14 @@ describe('MultiselectList.cy.tsx', () => { beforeEach(() => { cy.viewport(450, 650); mount( - -
    - { - selected = selectedItems; - }} - /> -
    -
    +
    + { + selected = selectedItems; + }} + /> +
    ); }); @@ -145,17 +141,15 @@ describe('MultiselectList.cy.tsx', () => { cy.viewport(450, 650); mount( - -
    - { - selections.push(...selectedItems); - }} - allowSelelectAll - /> -
    -
    +
    + { + selections.push(...selectedItems); + }} + allowSelelectAll + /> +
    ); cy.contains('button', 'Select all').click(); @@ -179,17 +173,15 @@ describe('MultiselectList.cy.tsx', () => { cy.viewport(450, 650); mount( - -
    - { - selections.push(...selectedItems); - }} - allowSelelectAll - /> -
    -
    +
    + { + selections.push(...selectedItems); + }} + allowSelelectAll + /> +
    ); cy.contains('button', 'Select all').click(); @@ -211,11 +203,9 @@ describe('MultiselectList.cy.tsx', () => { it('should show matching options even when not selected', () => { cy.viewport(450, 650); mount( - -
    - {}} items={pizzas} value={['MGT']} /> -
    -
    +
    + {}} items={pizzas} value={['MGT']} /> +
    ); cy.get('input[type=text]').type('pepperoni'); @@ -228,11 +218,9 @@ describe('MultiselectList.cy.tsx', () => { it('should show blank state property if there is no items passed to the component', () => { cy.viewport(450, 650); mount( - -
    - {}} items={[]} /> -
    -
    +
    + {}} items={[]} /> +
    ); cy.contains('No items available').should('be.visible'); }); @@ -240,11 +228,9 @@ describe('MultiselectList.cy.tsx', () => { it('should accept a blank state string', () => { cy.viewport(450, 650); mount( - -
    - {}} items={[]} blankState="nada" /> -
    -
    +
    + {}} items={[]} blankState="nada" /> +
    ); cy.contains('nada').should('be.visible'); }); @@ -252,15 +238,9 @@ describe('MultiselectList.cy.tsx', () => { it('should accept a blank state component', () => { cy.viewport(450, 650); mount( - -
    - {}} - items={[]} - blankState={
    no items string
    } - /> -
    -
    +
    + {}} items={[]} blankState={
    no items string
    } /> +
    ); cy.contains('no items string').should('be.visible'); }); diff --git a/app/react/V2/Components/Layouts/SettingsContent.tsx b/app/react/V2/Components/Layouts/SettingsContent.tsx index 8407bc1ff1..4c61e29905 100644 --- a/app/react/V2/Components/Layouts/SettingsContent.tsx +++ b/app/react/V2/Components/Layouts/SettingsContent.tsx @@ -2,7 +2,7 @@ import React, { PropsWithChildren } from 'react'; import { Breadcrumb } from 'flowbite-react'; import { ChevronLeftIcon } from '@heroicons/react/20/solid'; -import { I18NLink, Translate } from 'app/I18N'; +import { Translate, I18NLinkV2 as I18NLink } from 'app/I18N'; interface SettingsContentProps extends PropsWithChildren { className?: string; @@ -38,8 +38,10 @@ const SettingsHeader = ({ contextId, title, children, path, className }: Setting {Array.from(path?.entries() || []).map(([key, value]) => ( - - {key} + + + {key} + ))} {title !== undefined && ( diff --git a/app/react/V2/Components/Layouts/specs/SettingsContent.cy.tsx b/app/react/V2/Components/Layouts/specs/SettingsContent.cy.tsx index 40f4b33491..18c9ac9950 100644 --- a/app/react/V2/Components/Layouts/specs/SettingsContent.cy.tsx +++ b/app/react/V2/Components/Layouts/specs/SettingsContent.cy.tsx @@ -1,37 +1,33 @@ import React from 'react'; import 'cypress-axe'; import { BrowserRouter } from 'react-router-dom'; -import { Provider } from 'react-redux'; import { mount } from '@cypress/react18'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { SettingsContent } from '../SettingsContent'; describe('ConfirmationModal', () => { const render = () => { mount(
    - - - - - - - Body - - - Footer - - - + + + + + + Body + + + Footer + +
    ); }; @@ -47,7 +43,7 @@ describe('ConfirmationModal', () => { cy.get('[data-testid="settings-content-header"]') .invoke('text') .should('contain', 'Root PathMiddle PathLeafCurrent page'); - cy.get('a[href="/en/settings"]').should('not.be.visible'); + cy.get('a[href="/settings"]').should('not.be.visible'); cy.contains('a', 'Root Path').invoke('attr', 'href').should('include', '#top'); cy.contains('a', 'Middle Path').invoke('attr', 'href').should('include', '#bottom'); cy.contains('a', 'Leaf').invoke('attr', 'href').should('include', '#footer'); @@ -58,6 +54,6 @@ describe('ConfirmationModal', () => { it('should have an arrow to return to settings menu for mobile', () => { cy.viewport(450, 650); render(); - cy.get('a[href="/en/settings"]').should('be.visible'); + cy.get('a[href="/settings"]').should('be.visible'); }); }); diff --git a/app/react/V2/Components/PDFViewer/specs/PDF.spec.tsx b/app/react/V2/Components/PDFViewer/specs/PDF.spec.tsx index 2e6ea167ff..58f85e5763 100644 --- a/app/react/V2/Components/PDFViewer/specs/PDF.spec.tsx +++ b/app/react/V2/Components/PDFViewer/specs/PDF.spec.tsx @@ -5,9 +5,8 @@ import React from 'react'; import { render, act, queryAllByAttribute, cleanup, RenderResult } from '@testing-library/react'; import { configMocks, mockIntersectionObserver } from 'jsdom-testing-mocks'; -import { Provider } from 'react-redux'; import { pdfScaleAtom } from 'V2/atoms'; -import { TestAtomStoreProvider, LEGACY_createStore as createStore } from 'V2/testing'; +import { TestAtomStoreProvider } from 'V2/testing'; import PDF, { PDFProps } from '../PDF'; import * as helpers from '../functions/helpers'; @@ -78,11 +77,9 @@ describe('PDF', () => { const renderComponet = (scrollToPage?: PDFProps['scrollToPage']) => { renderResult = render( - - - - - + + + ); }; diff --git a/app/react/V2/Components/UI/Modal.tsx b/app/react/V2/Components/UI/Modal.tsx index 454f9e64dd..4521a00d37 100644 --- a/app/react/V2/Components/UI/Modal.tsx +++ b/app/react/V2/Components/UI/Modal.tsx @@ -6,9 +6,10 @@ type modalSizeType = 'sm' | 'md' | 'lg' | 'xl' | 'xxl' | 'xxxl'; interface ModalProps { children: string | React.ReactNode; size: modalSizeType; + id?: string; } -const Modal = ({ children, size }: ModalProps) => { +const Modal = ({ children, size, id }: ModalProps) => { const sizes = { sm: 'max-w-sm', md: 'max-w-md min-w-[24rem]', @@ -25,6 +26,7 @@ const Modal = ({ children, size }: ModalProps) => { data-testid="modal" role="dialog" aria-label="Modal" + id={id} >
    {children}
    diff --git a/app/react/V2/Components/UI/specs/CopyValueInput.cy.tsx b/app/react/V2/Components/UI/specs/CopyValueInput.cy.tsx index ad5c286618..e353765e06 100644 --- a/app/react/V2/Components/UI/specs/CopyValueInput.cy.tsx +++ b/app/react/V2/Components/UI/specs/CopyValueInput.cy.tsx @@ -1,17 +1,13 @@ import React from 'react'; import 'cypress-axe'; import { mount } from '@cypress/react18'; -import { Provider } from 'react-redux'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { CopyValueInput } from '../CopyValueInput'; describe('CopyValueInput', () => { const Component = () => ( - -
    - -
    -
    +
    + +
    ); before(() => { @@ -41,9 +37,8 @@ describe('CopyValueInput', () => { cy.get('input').should('have.value', 'some testing value'); cy.get('[data-testid="copy-value-button"]').focus(); cy.get('[data-testid="copy-value-button"]').realClick(); - cy.window() // + cy.window() .then(async win => win.navigator.clipboard.readText()) - .should('equal', 'some testing value'); }); }); diff --git a/app/react/V2/Components/UI/specs/NotificationsContainer.cy.tsx b/app/react/V2/Components/UI/specs/NotificationsContainer.cy.tsx index 91de3a2288..d2c5141a5d 100644 --- a/app/react/V2/Components/UI/specs/NotificationsContainer.cy.tsx +++ b/app/react/V2/Components/UI/specs/NotificationsContainer.cy.tsx @@ -1,8 +1,6 @@ import React from 'react'; import { Provider, useSetAtom } from 'jotai'; import { mount } from '@cypress/react18'; -import { Provider as ReduxProvider } from 'react-redux'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { notificationAtom, notificationAtomType } from 'V2/atoms'; import { NotificationsContainer } from '../NotificationsContainer'; @@ -21,14 +19,12 @@ describe('Notifications container', () => { }; return ( - - <> - - - - + <> + + + ); }; diff --git a/app/react/V2/Routes/Settings/ActivityLog/components/FiltersSidePanel.tsx b/app/react/V2/Routes/Settings/ActivityLog/components/FiltersSidePanel.tsx index cdecc22c79..fa7e848d4f 100644 --- a/app/react/V2/Routes/Settings/ActivityLog/components/FiltersSidePanel.tsx +++ b/app/react/V2/Routes/Settings/ActivityLog/components/FiltersSidePanel.tsx @@ -6,7 +6,7 @@ import { Translate, t } from 'app/I18N'; import { InputField, DateRangePicker, MultiSelect } from 'app/V2/Components/Forms'; import { useAtomValue } from 'jotai'; import { ClientSettings } from 'app/apiResponseTypes'; -import { settingsAtom, translationsAtom } from 'app/V2/atoms'; +import { settingsAtom, localeAtom } from 'app/V2/atoms'; interface ActivityLogSearch { username: string; @@ -36,7 +36,7 @@ const methodOptions = ['CREATE', 'UPDATE', 'DELETE', 'MIGRATE', 'WARNING'].map(m const FiltersSidePanel = ({ isOpen, onClose, onSubmit, appliedFilters }: FiltersSidePanelProps) => { const { dateFormat = 'YYYY-MM-DD' } = useAtomValue(settingsAtom); - const { locale } = useAtomValue<{ locale: string }>(translationsAtom); + const locale = useAtomValue(localeAtom); const [currentFilters, setCurrentFilters] = useState(appliedFilters); useEffect(() => { diff --git a/app/react/V2/Routes/Settings/Languages/components/InstallLanguagesModal.tsx b/app/react/V2/Routes/Settings/Languages/components/InstallLanguagesModal.tsx index 7287aefb72..131c0674ee 100644 --- a/app/react/V2/Routes/Settings/Languages/components/InstallLanguagesModal.tsx +++ b/app/react/V2/Routes/Settings/Languages/components/InstallLanguagesModal.tsx @@ -22,6 +22,7 @@ const InstallLanguagesModal = ({ setShowModal, languages }: InstallLanguagesModa })); const install = async () => { + setShowModal(false); await requestAction( I18NApi.addLanguage, new RequestParams(languages.filter(l => selected.includes(l.key))), @@ -57,7 +58,6 @@ const InstallLanguagesModal = ({ setShowModal, languages }: InstallLanguagesModa Selected @@ -242,7 +242,7 @@ exports[`Settings Thesauri ThesauriList Thesaurus deletion should show the selec 2 of @@ -268,8 +268,8 @@ exports[`Settings Thesauri ThesauriList render existing thesauri should show a l data-testid="settings-content-header" > Navigate back @@ -328,7 +328,7 @@ exports[`Settings Thesauri ThesauriList render existing thesauri should show a l data-testid="flowbite-breadcrumb-item" > Thesauri @@ -360,7 +360,7 @@ exports[`Settings Thesauri ThesauriList render existing thesauri should show a l class="text-base font-semibold text-left text-gray-900 bg-white" > Thesauri @@ -381,7 +381,7 @@ exports[`Settings Thesauri ThesauriList render existing thesauri should show a l >
    `; @@ -135,10 +143,18 @@ exports[`ConnectionsList when there are no references should render a blank stat icon="sitemap" />

    - No References + + No References +

    - No References description + + No References description +

    `; diff --git a/app/react/Viewer/components/specs/__snapshots__/Paginator.spec.js.snap b/app/react/Viewer/components/specs/__snapshots__/Paginator.spec.js.snap index 91de2eb172..a33368199f 100644 --- a/app/react/Viewer/components/specs/__snapshots__/Paginator.spec.js.snap +++ b/app/react/Viewer/components/specs/__snapshots__/Paginator.spec.js.snap @@ -45,22 +45,14 @@ exports[`Paginator should render a previous button and next button based on the onClick={[Function]} to="undefined?page=4" > - - + - - Previous - - - + Previous + +
    @@ -87,22 +79,14 @@ exports[`Paginator should render a previous button and next button based on the onClick={[Function]} to="undefined?page=6" > - - + - - Next - - - + Next + + @@ -157,22 +141,14 @@ exports[`Paginator when base Url already has the query string "?" should add the onClick={[Function]} to="undefined?page=2" > - - + - - Previous - - - + Previous + + @@ -199,22 +175,14 @@ exports[`Paginator when base Url already has the query string "?" should add the onClick={[Function]} to="undefined?page=4" > - - + - - Next - - - + Next + + @@ -272,22 +240,14 @@ exports[`Paginator when on first page should disable the prev link 1`] = ` rel="nofollow" to="undefined?page=1" > - - + - - Previous - - - + Previous + + @@ -314,22 +274,14 @@ exports[`Paginator when on first page should disable the prev link 1`] = ` onClick={[Function]} to="undefined?page=2" > - - + - - Next - - - + Next + + @@ -384,22 +336,14 @@ exports[`Paginator when on last page should disable the next link 1`] = ` onClick={[Function]} to="undefined?page=24" > - - + - - Previous - - - + Previous + + @@ -429,22 +373,14 @@ exports[`Paginator when on last page should disable the next link 1`] = ` rel="nofollow" to="undefined?page=25" > - - + - - Next - - - + Next + + diff --git a/app/react/entry-server.tsx b/app/react/entry-server.tsx index 4780605e83..f7eba356a7 100644 --- a/app/react/entry-server.tsx +++ b/app/react/entry-server.tsx @@ -24,7 +24,7 @@ import Root from './App/Root'; import RouteHandler from './App/RouteHandler'; import { ErrorBoundary } from './V2/Components/ErrorHandling'; import { atomStore, hydrateAtomStore } from './V2/atoms'; -import { I18NUtils, t, Translate } from './I18N'; +import { I18NUtils } from './I18N'; import { IStore } from './istore'; import { getRoutes } from './Routes'; import createReduxStore from './store'; @@ -154,10 +154,10 @@ const prepareStores = async (req: ExpressRequest, settings: ClientSettings, lang const reduxData = { user: userApiResponse.json, - translations: translationsApiResponse.json.rows, templates: templatesApiResponse.json.rows, thesauris: thesaurisApiResponse.json.rows, relationTypes: relationTypesApiResponse.json.rows, + translations: translationsApiResponse.json.rows, settings: { collection: { ...settingsApiResponse.json, links: settingsApiResponse.json.links || [] }, }, @@ -176,6 +176,7 @@ const prepareStores = async (req: ExpressRequest, settings: ClientSettings, lang thesauri: thesaurisApiResponse.json.rows, templates: templatesApiResponse.json.rows, user: userApiResponse.json, + translations: translationsApiResponse.json.rows, }, }; }; @@ -268,11 +269,6 @@ const getSSRProperties = async ( }; }; -const resetTranslations = () => { - t.resetCachedTranslation(); - Translate.resetCachedTranslation(); -}; - const EntryServer = async (req: ExpressRequest, res: Response) => { RouteHandler.renderedFromServer = true; const [settings, assets] = await Promise.all([ @@ -303,7 +299,7 @@ const EntryServer = async (req: ExpressRequest, res: Response) => { reduxState, matched ); - resetTranslations(); + hydrateAtomStore(atomStoreData); const componentHtml = ReactDOMServer.renderToString( diff --git a/app/react/stories/Buttons/EmbededButton.stories.tsx b/app/react/stories/Buttons/EmbededButton.stories.tsx index f10dd2018f..0ffc3ddc75 100644 --- a/app/react/stories/Buttons/EmbededButton.stories.tsx +++ b/app/react/stories/Buttons/EmbededButton.stories.tsx @@ -1,9 +1,7 @@ import React from 'react'; -import { Provider } from 'react-redux'; import { CheckCircleIcon } from '@heroicons/react/24/outline'; import type { Meta, StoryObj } from '@storybook/react'; -import { EmbededButton } from 'app/V2/Components/UI/EmbededButton'; -import { LEGACY_createStore as createStore } from 'V2/testing'; +import { EmbededButton } from 'V2/Components/UI/EmbededButton'; import { Translate } from 'app/I18N'; const meta: Meta = { @@ -15,18 +13,16 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    - - {args.children} - -
    -
    +
    + + {args.children} + +
    ), }; diff --git a/app/react/stories/CodeEditor.stories.tsx b/app/react/stories/CodeEditor.stories.tsx index b0ba61c698..90fee45c70 100644 --- a/app/react/stories/CodeEditor.stories.tsx +++ b/app/react/stories/CodeEditor.stories.tsx @@ -1,8 +1,6 @@ import React, { useRef, useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; -import { Provider } from 'react-redux'; import { CodeEditor, CodeEditorProps, CodeEditorInstance } from 'V2/Components/CodeEditor'; -import { LEGACY_createStore as createStore } from 'V2/testing'; const sampleJS = `const myButton = document.getElementById('myButton'); myButton.addEventListener('click', function () { @@ -85,30 +83,28 @@ const Component = ({ language, intialValue, fallbackElement }: CodeEditorProps) const [updatedCode, setUpdatedCode] = useState(); return ( - -
    -
    - { - editorInstance.current = editor; - }} - fallbackElement={fallbackElement} - /> -
    -
    - -
    -
    {updatedCode}
    +
    +
    + { + editorInstance.current = editor; + }} + fallbackElement={fallbackElement} + />
    - +
    + +
    +
    {updatedCode}
    +
    ); }; diff --git a/app/react/stories/ConfirmationModal.stories.tsx b/app/react/stories/ConfirmationModal.stories.tsx index 3a545ba018..26c1cee8bb 100644 --- a/app/react/stories/ConfirmationModal.stories.tsx +++ b/app/react/stories/ConfirmationModal.stories.tsx @@ -2,9 +2,7 @@ import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { fn } from '@storybook/test'; import { action } from '@storybook/addon-actions'; -import { Provider } from 'react-redux'; import { ConfirmationModal } from 'app/V2/Components/UI/ConfirmationModal'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { Translate } from 'app/I18N'; const meta: Meta = { @@ -22,24 +20,22 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    -
    - -
    +
    +
    +
    - +
    ), }; diff --git a/app/react/stories/ErrorBoundary.stories.tsx b/app/react/stories/ErrorBoundary.stories.tsx index 1275fb5fe0..22182ee724 100644 --- a/app/react/stories/ErrorBoundary.stories.tsx +++ b/app/react/stories/ErrorBoundary.stories.tsx @@ -1,7 +1,5 @@ import React, { ComponentClass } from 'react'; import type { Meta, StoryObj } from '@storybook/react'; -import { Provider } from 'react-redux'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { ErrorBoundary } from 'app/V2/Components/ErrorHandling'; import type { ErrorBoundaryProps } from 'app/V2/Components/ErrorHandling'; @@ -14,11 +12,9 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    - {args.children} -
    -
    +
    + {args.children} +
    ), }; diff --git a/app/react/stories/Forms/Checkbox.stories.tsx b/app/react/stories/Forms/Checkbox.stories.tsx index 0865a6099f..6d454e218f 100644 --- a/app/react/stories/Forms/Checkbox.stories.tsx +++ b/app/react/stories/Forms/Checkbox.stories.tsx @@ -3,8 +3,6 @@ import { Meta, StoryObj } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { fn } from '@storybook/test'; import { Checkbox } from 'app/V2/Components/Forms'; -import { LEGACY_createStore as createStore } from 'V2/testing'; -import { Provider } from 'react-redux'; const meta: Meta = { title: 'Forms/Checkbox', @@ -18,17 +16,15 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - - - + ), }; diff --git a/app/react/stories/Forms/ColorPicker.stories.tsx b/app/react/stories/Forms/ColorPicker.stories.tsx index 197496d078..8ec3da957c 100644 --- a/app/react/stories/Forms/ColorPicker.stories.tsx +++ b/app/react/stories/Forms/ColorPicker.stories.tsx @@ -1,10 +1,8 @@ import React from 'react'; -import { Provider as ReduxProvider } from 'react-redux'; import { Meta, StoryObj } from '@storybook/react'; import { fn } from '@storybook/test'; import { action } from '@storybook/addon-actions'; import { ColorPicker } from 'app/V2/Components/Forms'; -import { LEGACY_createStore as createStore } from 'V2/testing'; const meta: Meta = { title: 'Forms/ColorPicker', @@ -23,16 +21,14 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    - -
    -
    +
    + +
    ), }; diff --git a/app/react/stories/Forms/DatePicker.stories.tsx b/app/react/stories/Forms/DatePicker.stories.tsx index 32cb6c873a..4c7b1dcc1b 100644 --- a/app/react/stories/Forms/DatePicker.stories.tsx +++ b/app/react/stories/Forms/DatePicker.stories.tsx @@ -1,10 +1,9 @@ import React from 'react'; -import { Provider as ReduxProvider } from 'react-redux'; import { Meta, StoryObj } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { fn } from '@storybook/test'; -import { DatePicker } from 'app/V2/Components/Forms'; -import { LEGACY_createStore as createStore, TestAtomStoreProvider } from 'V2/testing'; +import { DatePicker } from 'V2/Components/Forms'; +import { TestAtomStoreProvider } from 'V2/testing'; import { settingsAtom } from 'V2/atoms'; const meta: Meta = { @@ -26,24 +25,22 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - - - - - + + + ), }; diff --git a/app/react/stories/Forms/DateRangePicker.stories.tsx b/app/react/stories/Forms/DateRangePicker.stories.tsx index d502972c38..7dbdbd1ea3 100644 --- a/app/react/stories/Forms/DateRangePicker.stories.tsx +++ b/app/react/stories/Forms/DateRangePicker.stories.tsx @@ -1,10 +1,8 @@ import React from 'react'; -import { Provider } from 'react-redux'; import { Meta, StoryObj } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { fn } from '@storybook/test'; import { DateRangePicker } from 'app/V2/Components/Forms'; -import { LEGACY_createStore as createStore } from 'V2/testing'; const meta: Meta = { title: 'Forms/DateRangePicker', @@ -24,23 +22,21 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    -
    - -
    +
    +
    +
    - +
    ), }; diff --git a/app/react/stories/Forms/EnableButtonCheckbox.stories.tsx b/app/react/stories/Forms/EnableButtonCheckbox.stories.tsx index 940a502932..5f79b6b5d0 100644 --- a/app/react/stories/Forms/EnableButtonCheckbox.stories.tsx +++ b/app/react/stories/Forms/EnableButtonCheckbox.stories.tsx @@ -1,8 +1,6 @@ import React from 'react'; import { Meta, StoryObj } from '@storybook/react'; import { EnableButtonCheckbox } from 'app/V2/Components/Forms'; -import { LEGACY_createStore as createStore } from 'V2/testing'; -import { Provider } from 'react-redux'; const meta: Meta = { title: 'Forms/EnableButtonCheckbox', @@ -14,14 +12,12 @@ type Story = StoryObj; const Primary: Story = { render: args => (
    - - - +
    ), }; diff --git a/app/react/stories/Forms/FileDropzone.stories.tsx b/app/react/stories/Forms/FileDropzone.stories.tsx index 149229e9e0..ca390cc4c5 100644 --- a/app/react/stories/Forms/FileDropzone.stories.tsx +++ b/app/react/stories/Forms/FileDropzone.stories.tsx @@ -1,8 +1,6 @@ import React from 'react'; import { Meta, StoryObj } from '@storybook/react'; import { FileDropzone } from 'app/V2/Components/Forms'; -import { LEGACY_createStore as createStore } from 'V2/testing'; -import { Provider } from 'react-redux'; const meta: Meta = { title: 'Forms/FileDropzone', @@ -13,11 +11,9 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    - -
    -
    +
    + +
    ), }; diff --git a/app/react/stories/Forms/InputField.stories.tsx b/app/react/stories/Forms/InputField.stories.tsx index 6f756da7e2..5b54f7a511 100644 --- a/app/react/stories/Forms/InputField.stories.tsx +++ b/app/react/stories/Forms/InputField.stories.tsx @@ -1,8 +1,6 @@ /* eslint-disable react/jsx-props-no-spreading */ import React from 'react'; import { Meta, StoryObj } from '@storybook/react'; -import { Provider } from 'react-redux'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { InputField } from 'V2/Components/Forms'; const meta: Meta = { @@ -14,13 +12,11 @@ type Story = StoryObj; const InputFieldStory: Story = { render: args => ( - -
    -
    - -
    +
    +
    +
    - +
    ), }; diff --git a/app/react/stories/Forms/MultiSelect.stories.tsx b/app/react/stories/Forms/MultiSelect.stories.tsx index 6b0fadf717..f1ef8c122c 100644 --- a/app/react/stories/Forms/MultiSelect.stories.tsx +++ b/app/react/stories/Forms/MultiSelect.stories.tsx @@ -1,8 +1,6 @@ import React from 'react'; import { Meta, StoryObj } from '@storybook/react'; -import { Provider } from 'react-redux'; import { MultiSelect } from 'V2/Components/Forms'; -import { LEGACY_createStore as createStore } from 'V2/testing'; const meta: Meta = { title: 'Forms/MultiSelect', @@ -13,23 +11,21 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    -
    -

    Multiselect component

    - -
    +
    +
    +

    Multiselect component

    +
    - +
    ), }; diff --git a/app/react/stories/Forms/MultiselectList.stories.tsx b/app/react/stories/Forms/MultiselectList.stories.tsx index c61c6d7374..1f4d396f83 100644 --- a/app/react/stories/Forms/MultiselectList.stories.tsx +++ b/app/react/stories/Forms/MultiselectList.stories.tsx @@ -1,8 +1,6 @@ import React, { useState } from 'react'; import { Meta, StoryObj } from '@storybook/react'; -import { Provider } from 'react-redux'; import { MultiselectList } from 'V2/Components/Forms'; -import { LEGACY_createStore as createStore } from 'V2/testing'; const meta: Meta = { title: 'Forms/MultiselectList', @@ -15,32 +13,30 @@ const StoryComponent = ({ args }: any) => { const [searchAndFocus, setSearchAndFocus] = useState(''); return ( - - <> -
    -
    - -
    + <> +
    +
    +
    - - - - +
    + + + ); }; diff --git a/app/react/stories/Forms/RadioSelect.stories.tsx b/app/react/stories/Forms/RadioSelect.stories.tsx index f0449a6c83..2d29fe2d32 100644 --- a/app/react/stories/Forms/RadioSelect.stories.tsx +++ b/app/react/stories/Forms/RadioSelect.stories.tsx @@ -3,8 +3,6 @@ import { Meta, StoryObj } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { fn } from '@storybook/test'; import { RadioSelect } from 'app/V2/Components/Forms'; -import { LEGACY_createStore as createStore } from 'V2/testing'; -import { Provider } from 'react-redux'; const meta: Meta = { title: 'Forms/RadioSelect', @@ -18,17 +16,15 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    - -
    -
    +
    + +
    ), }; diff --git a/app/react/stories/MediaPlayer.stories.tsx b/app/react/stories/MediaPlayer.stories.tsx index 92587ffd53..a663c482da 100644 --- a/app/react/stories/MediaPlayer.stories.tsx +++ b/app/react/stories/MediaPlayer.stories.tsx @@ -1,7 +1,5 @@ import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; -import { Provider } from 'react-redux'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { MediaPlayer } from 'V2/Components/UI'; const meta: Meta = { @@ -13,18 +11,16 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    -
    - -
    +
    +
    +
    - +
    ), }; diff --git a/app/react/stories/Notification.stories.tsx b/app/react/stories/Notification.stories.tsx index 64a10a6bbd..d913bdb31a 100644 --- a/app/react/stories/Notification.stories.tsx +++ b/app/react/stories/Notification.stories.tsx @@ -1,8 +1,6 @@ import React from 'react'; import { Meta, StoryObj } from '@storybook/react'; import { Notification } from 'V2/Components/UI/Notification'; -import { Provider } from 'react-redux'; -import { LEGACY_createStore as createStore } from 'V2/testing'; const meta: Meta = { title: 'Components/Notification', @@ -13,18 +11,16 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    -
    - -
    +
    +
    +
    - +
    ), }; diff --git a/app/react/stories/PDF.stories.tsx b/app/react/stories/PDF.stories.tsx index 6670cccfe8..8f08152bd3 100644 --- a/app/react/stories/PDF.stories.tsx +++ b/app/react/stories/PDF.stories.tsx @@ -1,8 +1,6 @@ import React from 'react'; import type { Meta, StoryObj } from '@storybook/react'; import { fn } from '@storybook/test'; -import { Provider } from 'react-redux'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { PDF } from 'V2/Components/PDFViewer'; import { highlights } from './fixtures/PDFStoryFixtures'; @@ -16,22 +14,20 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    -

    PDF Container:

    -
    - -
    -

    End of container

    +
    +

    PDF Container:

    +
    +
    - +

    End of container

    +
    ), }; diff --git a/app/react/stories/Paginator.stories.tsx b/app/react/stories/Paginator.stories.tsx index 9664ce3461..42b45c6e8b 100644 --- a/app/react/stories/Paginator.stories.tsx +++ b/app/react/stories/Paginator.stories.tsx @@ -1,9 +1,7 @@ import React from 'react'; import { MemoryRouter } from 'react-router-dom'; -import { Provider } from 'react-redux'; import type { Meta, StoryObj } from '@storybook/react'; import { Paginator } from 'app/V2/Components/UI'; -import { LEGACY_createStore as createStore } from 'V2/testing'; const meta: Meta = { title: 'Components/Paginator', @@ -15,18 +13,16 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - -
    -
    - -
    +
    +
    +
    - +
    ), }; diff --git a/app/react/stories/Sidepanel.stories.tsx b/app/react/stories/Sidepanel.stories.tsx index 2aaa56b1bd..c5f689fa82 100644 --- a/app/react/stories/Sidepanel.stories.tsx +++ b/app/react/stories/Sidepanel.stories.tsx @@ -1,8 +1,6 @@ import React, { useState } from 'react'; import { Meta, StoryObj } from '@storybook/react'; import { action } from '@storybook/addon-actions'; -import { Provider } from 'react-redux'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { Sidepanel, Button } from 'V2/Components/UI'; import { SidePanelProps } from 'app/V2/Components/UI/Sidepanel'; import { GeneratedContent } from './helpers/GeneratedContent'; @@ -16,70 +14,65 @@ const SidePanelContainer = (args: SidePanelProps) => { const [showSidepanel, setShowSidepanel] = useState(false); return ( - -
    -
    -
    -

    This a content title

    +
    +
    +
    +

    This a content title

    -

    - Lorem ipsum dolor sit amet consectetur adipisicing elit. -

    +

    Lorem ipsum dolor sit amet consectetur adipisicing elit.

    -

    - Fusce id mi eu mauris bibendum dignissim nec in sem. Sed ultrices varius mauris quis - placerat. Donec imperdiet sodales diam sed imperdiet. Aenean a nisl venenatis lectus - mattis pellentesque. Duis fermentum ante a ultricies feugiat. Proin dapibus luctus - purus id viverra. Aenean a aliquet nibh. Aenean facilisis justo quis sem auctor, nec - mollis tortor placerat. Cras eget enim mollis, mollis risus gravida, pharetra risus. - Mauris dapibus malesuada mi, quis ornare felis imperdiet eget. Donec sed quam non - dolor sodales hendrerit. Aenean suscipit, velit sed laoreet cursus, ante odio - tristique lectus, a porta eros felis eu sem. Curabitur eu gravida dolor. Ut iaculis - lacus vitae libero viverra interdum. Phasellus ac est consectetur, malesuada nisl nec, - blandit lorem. -

    +

    + Fusce id mi eu mauris bibendum dignissim nec in sem. Sed ultrices varius mauris quis + placerat. Donec imperdiet sodales diam sed imperdiet. Aenean a nisl venenatis lectus + mattis pellentesque. Duis fermentum ante a ultricies feugiat. Proin dapibus luctus purus + id viverra. Aenean a aliquet nibh. Aenean facilisis justo quis sem auctor, nec mollis + tortor placerat. Cras eget enim mollis, mollis risus gravida, pharetra risus. Mauris + dapibus malesuada mi, quis ornare felis imperdiet eget. Donec sed quam non dolor sodales + hendrerit. Aenean suscipit, velit sed laoreet cursus, ante odio tristique lectus, a + porta eros felis eu sem. Curabitur eu gravida dolor. Ut iaculis lacus vitae libero + viverra interdum. Phasellus ac est consectetur, malesuada nisl nec, blandit lorem. +

    -

    - Fusce id mi eu mauris bibendum dignissim nec in sem. Sed ultrices varius mauris quis - placerat. Donec imperdiet sodales diam sed imperdiet. Aenean a nisl venenatis lectus - mattis pellentesque. Duis fermentum ante a ultricies feugiat.  - - Proin dapibus luctus purus id viverra. - -  Aenean a aliquet nibh. Aenean facilisis justo quis sem auctor, nec mollis tortor - placerat. Cras eget enim mollis, mollis risus gravida, pharetra risus. Mauris dapibus - malesuada mi, quis ornare felis imperdiet eget. Donec sed quam non dolor sodales - hendrerit. Aenean suscipit, velit sed laoreet cursus, ante odio tristique lectus, a - porta eros felis eu sem. Curabitur eu gravida dolor. Ut iaculis lacus vitae libero - viverra interdum. Phasellus ac est consectetur, malesuada nisl nec, blandit lorem. -

    +

    + Fusce id mi eu mauris bibendum dignissim nec in sem. Sed ultrices varius mauris quis + placerat. Donec imperdiet sodales diam sed imperdiet. Aenean a nisl venenatis lectus + mattis pellentesque. Duis fermentum ante a ultricies feugiat.  + + Proin dapibus luctus purus id viverra. + +  Aenean a aliquet nibh. Aenean facilisis justo quis sem auctor, nec mollis tortor + placerat. Cras eget enim mollis, mollis risus gravida, pharetra risus. Mauris dapibus + malesuada mi, quis ornare felis imperdiet eget. Donec sed quam non dolor sodales + hendrerit. Aenean suscipit, velit sed laoreet cursus, ante odio tristique lectus, a + porta eros felis eu sem. Curabitur eu gravida dolor. Ut iaculis lacus vitae libero + viverra interdum. Phasellus ac est consectetur, malesuada nisl nec, blandit lorem. +

    -
    +
    - -
    - setShowSidepanel(false)} - size={args.size} - > - - - - - - - -
    + +
    + setShowSidepanel(false)} + size={args.size} + > + + + + + + +
    - +
    ); }; diff --git a/app/react/stories/Table.stories.tsx b/app/react/stories/Table.stories.tsx index 3fad235cf6..91077cbc5e 100644 --- a/app/react/stories/Table.stories.tsx +++ b/app/react/stories/Table.stories.tsx @@ -3,9 +3,7 @@ import React, { useRef, useState } from 'react'; import { Meta, StoryObj } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { Cell, createColumnHelper, SortingState } from '@tanstack/react-table'; -import { Provider } from 'react-redux'; import { Button, Table } from 'V2/Components/UI'; -import { LEGACY_createStore as createStore } from 'V2/testing'; import { BasicData, DataWithGroups, basicData, dataWithGroups } from './table/fixtures'; type StoryProps = { @@ -225,17 +223,15 @@ type Story = StoryObj; const Primary: Story = { render: args => ( - - - + ), }; diff --git a/app/react/utils/useOnClickOutsideElementHook.ts b/app/react/utils/useOnClickOutsideElementHook.ts index 050e479b3f..0640322475 100644 --- a/app/react/utils/useOnClickOutsideElementHook.ts +++ b/app/react/utils/useOnClickOutsideElementHook.ts @@ -13,7 +13,7 @@ export function useOnClickOutsideElement( cb(event); }; - document.addEventListener('click', onClickHandler); + document.addEventListener('click', onClickHandler, { capture: true }); return () => { document.removeEventListener('click', onClickHandler); }; diff --git a/app/shared/translate.js b/app/shared/translate.js index 0cd87d33ac..d52c4d828f 100644 --- a/app/shared/translate.js +++ b/app/shared/translate.js @@ -1,10 +1,8 @@ -/** @format */ - -export function getLocaleTranslation(translations, locale) { +function getLocaleTranslation(translations, locale) { return translations.find(d => d.locale === locale) || { contexts: [] }; } -export function getContext(translation, contextId = '') { +function getContext(translation, contextId = '') { return ( translation.contexts.find(ctx => ctx.id.toString() === contextId.toString()) || { values: {} } ); @@ -13,3 +11,5 @@ export function getContext(translation, contextId = '') { export default function translate(context, key, text) { return context.values[key] || text; } + +export { getLocaleTranslation, getContext }; diff --git a/cypress/e2e/__image_snapshots__/PDF display responsiveness IX sidepanel should open the pdf sidepanel and show in the correct page #0.png b/cypress/e2e/__image_snapshots__/PDF display responsiveness IX sidepanel should open the pdf sidepanel and show in the correct page #0.png deleted file mode 100644 index 981fe7e34c2fa2a79988b75d9b37ea667e18f322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104058 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�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 diff --git a/cypress/e2e/__image_snapshots__/PDF display responsiveness IX sidepanel should open the pdf sidepanel and show the correct page #0.png b/cypress/e2e/__image_snapshots__/PDF display responsiveness IX sidepanel should open the pdf sidepanel and show the correct page #0.png new file mode 100644 index 0000000000000000000000000000000000000000..d63b45bea5a70debb5738a788b56b9c0a0409a16 GIT binary patch literal 103827 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ⅅ4@^HYfccJDL%f9wt#Ra4n#LU>p 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 literal 0 HcmV?d00001 diff --git a/cypress/e2e/pdf-display.cy.ts b/cypress/e2e/pdf-display.cy.ts index 999821840b..afbb5ddde4 100644 --- a/cypress/e2e/pdf-display.cy.ts +++ b/cypress/e2e/pdf-display.cy.ts @@ -250,7 +250,8 @@ describe('PDF display', () => { cy.contains('td', 'Entity with pdf (es)'); }); - it('should open the pdf sidepanel and show in the correct page', () => { + it('should open the pdf sidepanel and show the correct page', () => { + cy.contains('button', 'Open PDF').scrollIntoView(); cy.contains('button', 'Open PDF').realTouch(); cy.contains('Loading').should('not.exist'); cy.get('#pdf-container').within(() => { @@ -262,23 +263,21 @@ describe('PDF display', () => { cy.get('#root').toMatchImageSnapshot(); }); - it('should only show visible pages', () => { - cy.get('#pdf-container').within(() => { - cy.get('#page-1-container .page').should('be.empty'); - cy.get('#page-2-container .page').should('not.be.empty'); - cy.get('#page-3-container .page').should('not.be.empty'); - cy.get('#page-10-container .page').should('be.empty'); - cy.get('#page-10-container').scrollIntoView(); - cy.get('#page-1-container .page').should('be.empty'); - cy.get('#page-2-container .page').should('be.empty'); - cy.get('#page-3-container .page').should('be.empty'); - cy.get('#page-10-container .page').should('not.be.empty'); - cy.get('#page-11-container .page').should('not.be.empty'); - cy.contains( - 'span[role="presentation"]', - 'El artículo 63.2 de la Convención exige que para que la Corte pueda disponer de' - ).should('be.visible'); - }); + it('should check page rendering', () => { + cy.get('#page-1-container .page').should('be.empty'); + cy.get('#page-2-container .page').should('not.be.empty'); + cy.get('#page-3-container .page').should('not.be.empty'); + cy.get('#page-10-container .page').should('be.empty'); + cy.get('#page-10-container').scrollIntoView(); + cy.get('#page-1-container .page').should('be.empty'); + cy.get('#page-2-container .page').should('be.empty'); + cy.get('#page-3-container .page').should('be.empty'); + cy.get('#page-10-container .page').should('not.be.empty'); + cy.get('#page-11-container .page').should('not.be.empty'); + cy.contains( + 'span[role="presentation"]', + 'El artículo 63.2 de la Convención exige que para que la Corte pueda disponer de' + ).should('be.visible'); }); }); }); diff --git a/cypress/e2e/settings/__snapshots__/activitylog.cy.ts.snap b/cypress/e2e/settings/__snapshots__/activitylog.cy.ts.snap index cee99896ce..b2bd629931 100644 --- a/cypress/e2e/settings/__snapshots__/activitylog.cy.ts.snap +++ b/cypress/e2e/settings/__snapshots__/activitylog.cy.ts.snap @@ -2,7 +2,7 @@ exports[`Activity log > should list the last activity log entries #0`] = ` UPDATEUPDATE `; @@ -14,7 +14,7 @@ exports[`Activity log > should list the last activity log entries #2`] = `

    Updated user:editor (58ada34d299e82674854510e)
    @@ -25,7 +25,7 @@ exports[`Activity log > should list the last activity log entries #3`] = ` CREATECREATE `; @@ -44,78 +44,6 @@ exports[`Activity log > should list the last activity log entries #5`] = ` `; exports[`Activity log > should open the detail of an entry #0`] = ` - -`; - -exports[`Activity log > should open the detail of an entry #1`] = `
    - editor (58ada34d299e82674854510e) + editor (58ada34d299e82674854510e)
    UPDATEUPDATE
    @@ -178,7 +108,7 @@ exports[`Activity log > should open the detail of an entry #1`] = ` >Body{"_id":"58ada34d299e82674854510e","username":"editor","__v":0,"role":"editor","groups":[{"_id":"5fda2b675917fe58048a88f4","name":"Activistas"},{"_id":"5fda2b6f5917fe58048a88f6","name":"Asesores + >{"_id":"58ada34d299e82674854510e","username":"editor","__v":1,"role":"editor","groups":[{"_id":"5fda2b675917fe58048a88f4","name":"Activistas"},{"_id":"5fda2b6f5917fe58048a88f6","name":"Asesores legales"}],"email":"editor@uwazi.com"}
    diff --git a/cypress/e2e/settings/languages.cy.ts b/cypress/e2e/settings/languages.cy.ts index 91c43de4ea..a62e2429de 100644 --- a/cypress/e2e/settings/languages.cy.ts +++ b/cypress/e2e/settings/languages.cy.ts @@ -1,15 +1,29 @@ import { clearCookiesAndLogin } from '../helpers/login'; import 'cypress-axe'; -const addLanguages = (languages: string[]) => { - languages.forEach(lang => { - cy.clearAndType('[data-testid=modal] input[type=text]', lang); - cy.contains('button', lang).click(); +const stringToTranslate = "*please keep this key secret and don't share it."; + +const addLanguages = () => { + cy.contains('Install Language').click(); + cy.get('[data-testid=modal]') + .should('be.visible') + .within(() => { + cy.get('input[type=text]').realClick().realType('Spanish'); + cy.contains('button', 'Spanish').should('be.visible').realClick(); + cy.get('input[type=text]').clear(); + cy.get('input[type=text]').realType('French'); + cy.contains('button', 'French').should('be.visible').realClick(); + cy.get('input[type=text]').clear(); + cy.contains('label', '(2)').click(); + cy.contains('span', '* French (fr)').should('be.visible'); + cy.contains('span', '* Spanish (es)').should('be.visible'); + }); + cy.get('[data-testid=modal]').within(() => { + cy.contains('button', 'Install (2)').realClick(); }); + cy.get('[data-testid=modal]').should('not.exist'); }; -const stringToTranslate = "*please keep this key secret and don't share it."; - describe('Languages', () => { before(() => { cy.blankState(); @@ -22,26 +36,31 @@ describe('Languages', () => { describe('Languages List', () => { it('should open the install language modal', () => { cy.contains('Install Language').click(); + cy.get('[data-testid=modal]').should('be.visible'); cy.checkA11y(); + cy.get('[data-testid=modal]').within(() => { + cy.contains('button', 'Cancel').click(); + }); }); it('should install new languages', () => { const BACKEND_LANGUAGE_INSTALL_DELAY = 25000; cy.intercept('POST', 'api/translations/languages').as('addLanguage'); - addLanguages(['Spanish', 'French']); - cy.contains('[data-testid=modal] button', 'Install').click(); + + addLanguages(); + cy.wait('@addLanguage'); cy.contains('Dismiss').click(); - cy.contains('Spanish', { timeout: BACKEND_LANGUAGE_INSTALL_DELAY }); - cy.contains('French', { timeout: BACKEND_LANGUAGE_INSTALL_DELAY }); + cy.contains('tr', 'Spanish', { timeout: BACKEND_LANGUAGE_INSTALL_DELAY }); + cy.contains('tr', 'French', { timeout: BACKEND_LANGUAGE_INSTALL_DELAY }); cy.contains('Languages installed successfully').click(); }); it('should render the list of installed languages', () => { cy.get('[data-testid=settings-languages]').toMatchImageSnapshot(); - cy.contains('English'); - cy.contains('Spanish'); - cy.contains('French'); + cy.contains('tr', 'English'); + cy.contains('tr', 'Spanish'); + cy.contains('tr', 'French'); cy.checkA11y(); }); }); diff --git a/cypress/e2e/settings/translations.cy.ts b/cypress/e2e/settings/translations.cy.ts index d32c6af17f..9458c24f75 100644 --- a/cypress/e2e/settings/translations.cy.ts +++ b/cypress/e2e/settings/translations.cy.ts @@ -52,7 +52,7 @@ describe('Translations', () => { }); it('should have breadcrumb navigation', () => { - cy.contains('li > a > .translation', 'Translations').click(); + cy.contains('li a > .translation', 'Translations').click(); cy.contains('caption', 'System translations'); }); @@ -145,12 +145,14 @@ describe('Translations', () => { it('should translate a text', () => { cy.contains('span', 'Filters').click(); - cy.get('input[id=es]').clear(); - cy.get('input[id=es]').type('Filtros', { delay: 0 }); - cy.get('input[id=en]').clear(); - cy.get('input[id=en]').type('Filtering', { delay: 0 }); - cy.contains('button', 'Submit').click(); - cy.get('[data-testid=modal]').should('not.exist'); + cy.get('#translationsFormModal').within(() => { + cy.get('input[name="data.1.value"]').clear(); + cy.get('input[name="data.1.value"]').type('Filtros', { delay: 0 }); + cy.get('input[name="data.0.value"]').clear(); + cy.get('input[name="data.0.value"]').type('Filtering', { delay: 0 }); + cy.contains('button', 'Save').click(); + }); + cy.get('#translationsFormModal').should('not.exist'); }); it('should deactive the live translate and check the translatations in english and spanish', () => { diff --git a/tailwind.config.js b/tailwind.config.js index 028918c9b4..6aeeb98522 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -3,7 +3,7 @@ const colors = require('tailwindcss/colors'); module.exports = { content: [ - './app/react/V2/**/*.{js,jsx,ts,tsx}', + './app/react/**/*.{js,jsx,ts,tsx}', './app/react/stories/**/*.{js,jsx,ts,tsx}', 'node_modules/flowbite-react/**/*.{js,jsx,ts,tsx}', 'node_modules/flowbite-datepicker/**/*.{js,jsx,ts,tsx,css}', From 4a8b74a5e4475746324b2f83f620b8d495a31a1c Mon Sep 17 00:00:00 2001 From: John Date: Tue, 28 Jan 2025 14:20:57 -0300 Subject: [PATCH 64/69] update import --- app/react/I18N/I18NLinkV2.tsx | 2 +- app/react/I18N/specs/I18NLinkV2.spec.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/react/I18N/I18NLinkV2.tsx b/app/react/I18N/I18NLinkV2.tsx index a418caa87f..e9501be751 100644 --- a/app/react/I18N/I18NLinkV2.tsx +++ b/app/react/I18N/I18NLinkV2.tsx @@ -1,6 +1,6 @@ import React from 'react'; +import { NavLinkProps, NavLink } from 'react-router'; import { useAtomValue } from 'jotai'; -import { NavLinkProps, NavLink } from 'react-router-dom'; import { localeAtom } from 'V2/atoms'; type I18NLinkProps = NavLinkProps & { to: string; activeClassname?: string }; diff --git a/app/react/I18N/specs/I18NLinkV2.spec.tsx b/app/react/I18N/specs/I18NLinkV2.spec.tsx index 1ae3d34cbe..4d2040b52f 100644 --- a/app/react/I18N/specs/I18NLinkV2.spec.tsx +++ b/app/react/I18N/specs/I18NLinkV2.spec.tsx @@ -4,7 +4,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import React from 'react'; import { render, RenderResult } from '@testing-library/react'; -import { BrowserRouter } from 'react-router-dom'; +import { BrowserRouter } from 'react-router'; import { TestAtomStoreProvider } from 'V2/testing'; import { localeAtom } from 'V2/atoms'; import { I18NLink } from '../I18NLinkV2'; From ae185c334d14c60f508e4c779c4458dbc8f615de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20P=C3=B3lit?= Date: Fri, 31 Jan 2025 08:00:20 -0500 Subject: [PATCH 65/69] 7487 update cookie (#7625) * Updated version and removed types * Removed cookie from dependabot ignore * Added resolutions to force everyone on the same cookie version * Hacked import of cookie to prevent undefined * Revert formatting * Reverted resolution to allow each package to use their required version. --- .github/dependabot.yml | 1 - app/api/socketio/setupSockets.ts | 5 ++-- package.json | 3 +-- yarn.lock | 46 +++++++++++++++++++++++--------- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 697fd9b5bf..02bb64963c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -16,7 +16,6 @@ updates: versions: [">= 0.10.1"] - dependency-name: Mongoose #Mongoose upgrade #7017 versions: [">= 8.4.3"] - - dependency-name: cookie - dependency-name: "@socket.io*" - dependency-name: bootstrap - dependency-name: express-prom-bundle diff --git a/app/api/socketio/setupSockets.ts b/app/api/socketio/setupSockets.ts index fa1409a2df..ea9102b5c6 100644 --- a/app/api/socketio/setupSockets.ts +++ b/app/api/socketio/setupSockets.ts @@ -1,5 +1,5 @@ import { createClient, RedisClient } from 'redis'; -import cookie from 'cookie'; +import * as cookie from 'cookie'; import { Server } from 'http'; import { Server as SocketIoServer } from 'socket.io'; import { Application, Request, Response, NextFunction } from 'express'; @@ -46,9 +46,10 @@ const setupApiSockets = (server: Server, app: Application) => { //eslint-disable-next-line @typescript-eslint/no-floating-promises socket.join(socket.request.headers.tenant || config.defaultTenant.name); const socketCookie = cookie.parse(socket.request.headers.cookie || ''); + if (socketCookie) { //eslint-disable-next-line @typescript-eslint/no-floating-promises - socket.join(socketCookie['connect.sid']); + socket.join(socketCookie['connect.sid'] || 'default-session-id'); } }); diff --git a/package.json b/package.json index 08f9f98da7..7b7d3089ad 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "clean-insights-sdk": "^2.6.2", "compression": "^1.7.5", "connect-mongo": "5.1.0", - "cookie": "0.7.0", + "cookie": "1.0.2", "cookie-parser": "1.4.7", "cors": "^2.8.5", "crypto-js": "^4.2.0", @@ -286,7 +286,6 @@ "@types/body-parser": "^1.19.5", "@types/cheerio": "^0.22.30", "@types/child-process-promise": "^2.2.1", - "@types/cookie": "^0.6.0", "@types/enzyme": "3.10.12", "@types/enzyme-adapter-react-16": "1.0.2", "@types/expect-puppeteer": "4.4.7", diff --git a/yarn.lock b/yarn.lock index aba63c7b8b..c4b5a1d81a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4296,11 +4296,6 @@ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== -"@types/cookie@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" - integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== - "@types/cookiejar@^2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.5.tgz#14a3e83fa641beb169a2dd8422d91c3c345a9a78" @@ -6898,11 +6893,6 @@ cookie-signature@1.0.7: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== -cookie@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.0.tgz#2148f68a77245d5c2c0005d264bc3e08cfa0655d" - integrity sha512-qCf+V4dtlNhSRXGAZatc1TasyFO6GjohcOul807YOb5ik3+kQSnb4d7iajeCL8QHaJ4uZEjCgiCJerKXwdRVlQ== - cookie@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" @@ -6913,6 +6903,11 @@ cookie@0.7.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== +cookie@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + cookie@~0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" @@ -15692,7 +15687,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15820,7 +15824,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -17256,7 +17267,7 @@ world-countries@5.0.0: resolved "https://registry.yarnpkg.com/world-countries/-/world-countries-5.0.0.tgz#6f75ebcce3d5224d84e9117eaf0d75a7726b6501" integrity sha512-wAfOT9Y5i/xnxNOdKJKXdOCw9Q3yQLahBUeuRol+s+o20F6h2a4tLEbJ1lBCYwEQ30Sf9Meqeipk1gib3YwF5w== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -17274,6 +17285,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 8853fe56ab8a4d40e766fbb27a39ad4597a6bda9 Mon Sep 17 00:00:00 2001 From: Daneryl Date: Fri, 31 Jan 2025 14:00:26 +0100 Subject: [PATCH 66/69] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7b7d3089ad..44a3272a3a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uwazi", - "version": "1.197.3", + "version": "1.197.4", "description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.", "keywords": [ "react" From 6f765c72e03d1d8d4b024d231d97ea9daa8c02b6 Mon Sep 17 00:00:00 2001 From: Alberto Casado Torres Date: Fri, 31 Jan 2025 15:50:23 +0100 Subject: [PATCH 67/69] removced prefetch of images (#7636) * removced prefetch of images * fixed e2e --- .../components/specs/MediaField.spec.tsx | 4 +- app/react/Metadata/components/ImageViewer.tsx | 37 +++---------------- .../components/specs/ImageViewer.spec.tsx | 17 +-------- contents/ui-translations/ar.csv | 2 +- contents/ui-translations/en.csv | 2 +- contents/ui-translations/es.csv | 2 +- contents/ui-translations/fr.csv | 2 +- contents/ui-translations/ko.csv | 2 +- contents/ui-translations/my.csv | 2 +- contents/ui-translations/ru.csv | 2 +- contents/ui-translations/th.csv | 2 +- contents/ui-translations/tr.csv | 2 +- cypress/e2e/media-metadata.cy.ts | 25 +++++++++++-- package.json | 2 +- 14 files changed, 40 insertions(+), 63 deletions(-) diff --git a/app/react/Forms/components/specs/MediaField.spec.tsx b/app/react/Forms/components/specs/MediaField.spec.tsx index b2d035c3bf..6d91ffbd81 100644 --- a/app/react/Forms/components/specs/MediaField.spec.tsx +++ b/app/react/Forms/components/specs/MediaField.spec.tsx @@ -174,9 +174,7 @@ describe('MediaField', () => { await render(imageProps); const img = renderResult.container.getElementsByTagName('img')[0]; fireEvent.error(img); - expect( - await screen.findByText('This file type is not supported on media fields') - ).toBeInTheDocument(); + expect(await screen.findByText('Error loading your image')).toBeInTheDocument(); }); }); }); diff --git a/app/react/Metadata/components/ImageViewer.tsx b/app/react/Metadata/components/ImageViewer.tsx index 222b48cb4a..3b45d927f5 100644 --- a/app/react/Metadata/components/ImageViewer.tsx +++ b/app/react/Metadata/components/ImageViewer.tsx @@ -1,50 +1,25 @@ import { Translate } from 'app/I18N'; -import React, { useState, useEffect } from 'react'; +import React, { useState } from 'react'; interface ImageViewerProps { + key?: string; + className?: string; src: string; alt: string; - className?: string; } -const ImageViewer = ({ alt, src, className }: ImageViewerProps) => { - const [imageExists, setImageExists] = useState(null); +const ImageViewer = (props: ImageViewerProps) => { const [errorFlag, setErrorFlag] = useState(false); - useEffect(() => { - const checkImageExists = async (url: string) => { - try { - const response = await fetch(url, { method: 'GET' }); - setImageExists(Boolean(response.ok)); - } catch (error) { - setImageExists(false); - } - }; - - // eslint-disable-next-line no-void - void checkImageExists(src); - }, [src]); - if (imageExists === false) { - return ( -
    - Image not found -
    - ); - } - if (errorFlag) { return (
    - This file type is not supported on media fields + Error loading your image
    ); } - if (imageExists === null) { - return Loading; - } - - return setErrorFlag(true)} alt={alt} />; + return setErrorFlag(true)} alt={props.alt} />; }; export { ImageViewer, type ImageViewerProps }; diff --git a/app/react/Metadata/components/specs/ImageViewer.spec.tsx b/app/react/Metadata/components/specs/ImageViewer.spec.tsx index f16619b36f..4e09edafb5 100644 --- a/app/react/Metadata/components/specs/ImageViewer.spec.tsx +++ b/app/react/Metadata/components/specs/ImageViewer.spec.tsx @@ -28,13 +28,6 @@ describe('ImageViewer', () => { }); }; - it('should render loading state initially', async () => { - //delay the fetch response - (global.fetch as jest.Mock).mockImplementation(async () => new Promise(() => {})); - await renderComponent(); - expect(screen.getByText('Loading')).toBeInTheDocument(); - }); - it('should render the image if it exists', async () => { (global.fetch as jest.Mock).mockResolvedValue({ ok: true }); @@ -45,14 +38,6 @@ describe('ImageViewer', () => { expect(img).toHaveAttribute('src', props.src); }); - it('should render an error message if the image does not exist', async () => { - (global.fetch as jest.Mock).mockResolvedValue({ ok: false }); - - await renderComponent(); - - expect(screen.getByText('Image not found')).toBeInTheDocument(); - }); - it('should handle image load errors with onError', async () => { (global.fetch as jest.Mock).mockResolvedValue({ ok: true }); @@ -66,6 +51,6 @@ describe('ImageViewer', () => { img.dispatchEvent(new Event('error')); }); - expect(screen.getByText('This file type is not supported on media fields')).toBeInTheDocument(); + expect(screen.getByText('Error loading your image')).toBeInTheDocument(); }); }); diff --git a/contents/ui-translations/ar.csv b/contents/ui-translations/ar.csv index 1133276fa8..d89acbd436 100644 --- a/contents/ui-translations/ar.csv +++ b/contents/ui-translations/ar.csv @@ -307,6 +307,7 @@ Entity types,أنواع الكيانات Entity updated,Entity updated Error,خطأ Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expand all Exploration,استكشاف @@ -377,7 +378,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.","If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io." "If you want to continue, please type",إذا كنت ترغب في المتابعة، يرجى كتابة -Image not found,Image not found Impact of property change warning,All entities and documents that have already this property assigned will loose its current value Import,استيراد Import asset,Import asset diff --git a/contents/ui-translations/en.csv b/contents/ui-translations/en.csv index f50d0f1924..2932771955 100644 --- a/contents/ui-translations/en.csv +++ b/contents/ui-translations/en.csv @@ -310,6 +310,7 @@ Entity types,Entity types Entity updated,Entity updated Error,Error Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expand all Exploration,Exploration @@ -380,7 +381,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.","If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io." "If you want to continue, please type","If you want to continue, please type" -Image not found,Image not found Impact of property change warning,"By making this change, any values from the previous thesaurus already assigned to entities will be lost." Import,Import Import asset,Import asset diff --git a/contents/ui-translations/es.csv b/contents/ui-translations/es.csv index 1f58a9d9ca..822a3767c4 100644 --- a/contents/ui-translations/es.csv +++ b/contents/ui-translations/es.csv @@ -306,6 +306,7 @@ Entity types,Tipos de entidades Entity updated,Entidad actualizada Error,Error Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expandir todo Exploration,Exploración @@ -376,7 +377,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.","Si utilizas una URL externa, utiliza una dirección completa. Ejemplo: http://www.uwazi.io." "If you want to continue, please type","Si quieres continuar, por favor escribe" -Image not found,Image not found Impact of property change warning,Todas las entidades y documentos que ya tienen esta propiedad asignada perderán su valor actual Import,Importar Import asset,Import asset diff --git a/contents/ui-translations/fr.csv b/contents/ui-translations/fr.csv index b775dc5d8f..0b01287600 100644 --- a/contents/ui-translations/fr.csv +++ b/contents/ui-translations/fr.csv @@ -307,6 +307,7 @@ Entity types,Types d'entités Entity updated,Entity updated Error,Erreur Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expand all Exploration,Exploration @@ -377,7 +378,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.","Si c'est une URL externe, utilisez une URL complète. Par exemple, http://www.uwazi.io." "If you want to continue, please type","Si vous voulez continuer, veuillez taper" -Image not found,Image not found Impact of property change warning,All entities and documents that have already this property assigned will loose its current value Import,Importer Import asset,Import asset diff --git a/contents/ui-translations/ko.csv b/contents/ui-translations/ko.csv index cc0dbcb863..03bbc90ce4 100644 --- a/contents/ui-translations/ko.csv +++ b/contents/ui-translations/ko.csv @@ -308,6 +308,7 @@ Entity types,엔티티 유형 Entity updated,Entity updated Error,오류 Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expand all Exploration,탐색 @@ -378,7 +379,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.",외부 URL 인 경우 전체 경로 (http://www. 부터 시작하는 전체 URL) 를 넣으십시오. "If you want to continue, please type",계속하려면 다음을 입력하십시오: -Image not found,Image not found Impact of property change warning,All entities and documents that have already this property assigned will loose its current value Import,업로드 Import asset,Import asset diff --git a/contents/ui-translations/my.csv b/contents/ui-translations/my.csv index 493df87535..555723d582 100644 --- a/contents/ui-translations/my.csv +++ b/contents/ui-translations/my.csv @@ -308,6 +308,7 @@ Entity types,ဖြည့်သွင်းချက် အမျိုးအစ Entity updated,Entity updated Error,ချွတ်ယွင်းချက် Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expand all Exploration,စူးစမ်းလေ့လာခြင်း @@ -378,7 +379,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.",ပြင်ပ URL ဖြစ်ပါက URL ပုံစံအပြည့်အစုံကို သုံးပါ။ ဥပမာ- http://www.uwazi.io။ "If you want to continue, please type",ဆက်လက်ဆောင်ရွက်လိုပါက ကျေးဇူးပြု၍ စာရိုက်ပါ -Image not found,Image not found Impact of property change warning,All entities and documents that have already this property assigned will loose its current value Import,ထည့်သွင်းရန် Import asset,Import asset diff --git a/contents/ui-translations/ru.csv b/contents/ui-translations/ru.csv index 93b5538b6a..21081fe843 100644 --- a/contents/ui-translations/ru.csv +++ b/contents/ui-translations/ru.csv @@ -305,6 +305,7 @@ Entity types,Типы объектов Entity updated,Entity updated Error,Ошибка Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expand all Exploration,Изучение @@ -375,7 +376,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.","Если это внешний URL, используйте полностью сформированный URL. Т. е. http://www.uwazi.io." "If you want to continue, please type","Если вы хотите продолжить, пожалуйста, введите" -Image not found,Image not found Impact of property change warning,All entities and documents that have already this property assigned will loose its current value Import,Импортировать Import asset,Import asset diff --git a/contents/ui-translations/th.csv b/contents/ui-translations/th.csv index 08bc7616d6..30bdb8a532 100644 --- a/contents/ui-translations/th.csv +++ b/contents/ui-translations/th.csv @@ -308,6 +308,7 @@ Entity types,ประเภทรายการ Entity updated,Entity updated Error,ข้อผิดพลาด Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expand all Exploration,ค้นหา @@ -378,7 +379,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.",หากเป็น URL จากภายนอก กรุณาใช้ URL แบบเต็มเช่น http://www.uwazi.io "If you want to continue, please type",ถ้าคุณต้องการดำเนินการต่อ กรุณาพิมพ์ -Image not found,Image not found Impact of property change warning,All entities and documents that have already this property assigned will loose its current value Import,นำเข้า Import asset,Import asset diff --git a/contents/ui-translations/tr.csv b/contents/ui-translations/tr.csv index cafc2780b9..4cd5ab3a5f 100644 --- a/contents/ui-translations/tr.csv +++ b/contents/ui-translations/tr.csv @@ -308,6 +308,7 @@ Entity types,Varlık türü Entity updated,Entity updated Error,Hata Error adding thesauri.,Error adding thesauri. +Error loading your image,Error loading your image Error updating thesauri.,Error updating thesauri. Expand all,Expand all Exploration,Arama @@ -378,7 +379,6 @@ ID,ID ID:,ID: "If it is an external URL, use a fully formed URL. Ie. http://www.uwazi.io.","Harici bir URL ise, tam olarak oluşturulmuş bir URL kullanın: http://www.uwazi.io." "If you want to continue, please type","Devam etmek istiyorsanız, lütfen yazın" -Image not found,Image not found Impact of property change warning,All entities and documents that have already this property assigned will loose its current value Import,İçe aktar Import asset,Import asset diff --git a/cypress/e2e/media-metadata.cy.ts b/cypress/e2e/media-metadata.cy.ts index 59ef6c4ba8..fd103b815b 100644 --- a/cypress/e2e/media-metadata.cy.ts +++ b/cypress/e2e/media-metadata.cy.ts @@ -70,7 +70,7 @@ describe('Media metadata', { defaultCommandTimeout: 5000 }, () => { }); }; - const addInvalidFile = (field: string) => { + const addInvalidVideoFile = (field: string) => { cy.contains(field).parentsUntil('.form-group').contains('button', 'Add file').scrollIntoView(); cy.contains(field).parentsUntil('.form-group').contains('button', 'Add file').click(); cy.contains('button', 'Select from computer'); @@ -89,6 +89,25 @@ describe('Media metadata', { defaultCommandTimeout: 5000 }, () => { .should('be.visible'); }; + const addInvalidImageFile = (field: string) => { + cy.contains(field).parentsUntil('.form-group').contains('button', 'Add file').scrollIntoView(); + cy.contains(field).parentsUntil('.form-group').contains('button', 'Add file').click(); + cy.contains('button', 'Select from computer'); + cy.get('.upload-button input[type=file]') + .first() + .selectFile('./cypress/test_files/sample.pdf', { + force: true, + }); + cy.contains(field) + .parentsUntil('.form-group') + .contains('Error loading your image') + .scrollIntoView(); + cy.contains(field) + .parentsUntil('.form-group') + .contains('Error loading your image') + .should('be.visible'); + }; + const checkMediaSnapshots = (selector: string) => { cy.get(selector).scrollIntoView({ offset: { top: -30, left: 0 } }); cy.get(selector).toMatchImageSnapshot({ disableTimersAndAnimations: true, threshold: 0.08 }); @@ -163,8 +182,8 @@ describe('Media metadata', { defaultCommandTimeout: 5000 }, () => { // eslint-disable-next-line max-statements it('should show an error for an invalid property and allow to replace it for a valid one', () => { addEntity('Reporte con propiedades audiovisuales corregidas'); - addInvalidFile('Fotografía'); - addInvalidFile('Video'); + addInvalidImageFile('Fotografía'); + addInvalidVideoFile('Video'); clickMediaAction('Fotografía', 'Unlink'); addImage(); clickMediaAction('Video', 'Unlink'); diff --git a/package.json b/package.json index 8e6f515c92..8f83370361 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uwazi", - "version": "1.198.0-rc4", + "version": "1.198.0-rc5", "description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.", "keywords": [ "react" From c9082cc0e453d6b735ed0a84177e140416358b31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 13:34:21 -0500 Subject: [PATCH 68/69] Bump the dev-minor-dependencies group with 10 updates (#7635) Bumps the dev-minor-dependencies group with 10 updates: | Package | From | To | | --- | --- | --- | | [@aws-sdk/client-s3](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-s3) | `3.731.1` | `3.738.0` | | [@remix-run/router](https://github.com/remix-run/react-router/tree/HEAD/packages/router) | `1.21.1` | `1.22.0` | | [jotai](https://github.com/pmndrs/jotai) | `2.11.1` | `2.11.2` | | [moment-timezone](https://github.com/moment/moment-timezone) | `0.5.46` | `0.5.47` | | [nodemailer](https://github.com/nodemailer/nodemailer) | `6.9.16` | `6.10.0` | | [@types/nodemailer](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/nodemailer) | `6.4.16` | `6.4.17` | | [@4tw/cypress-drag-drop](https://github.com/4teamwork/cypress-drag-drop) | `2.2.5` | `2.3.0` | | [@testing-library/user-event](https://github.com/testing-library/user-event) | `14.6.0` | `14.6.1` | | [cypress-axe](https://github.com/component-driven/cypress-axe) | `1.5.0` | `1.6.0` | | [cypress-real-events](https://github.com/dmtrKovalenko/cypress-real-events) | `1.13.0` | `1.14.0` | Updates `@aws-sdk/client-s3` from 3.731.1 to 3.738.0 - [Release notes](https://github.com/aws/aws-sdk-js-v3/releases) - [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.738.0/clients/client-s3) Updates `@remix-run/router` from 1.21.1 to 1.22.0 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/@remix-run/router@1.22.0/packages/router/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/@remix-run/router@1.22.0/packages/router) Updates `jotai` from 2.11.1 to 2.11.2 - [Release notes](https://github.com/pmndrs/jotai/releases) - [Commits](https://github.com/pmndrs/jotai/compare/v2.11.1...v2.11.2) Updates `moment-timezone` from 0.5.46 to 0.5.47 - [Release notes](https://github.com/moment/moment-timezone/releases) - [Changelog](https://github.com/moment/moment-timezone/blob/develop/changelog.md) - [Commits](https://github.com/moment/moment-timezone/compare/0.5.46...0.5.47) Updates `nodemailer` from 6.9.16 to 6.10.0 - [Release notes](https://github.com/nodemailer/nodemailer/releases) - [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodemailer/nodemailer/compare/v6.9.16...v6.10.0) Updates `@types/nodemailer` from 6.4.16 to 6.4.17 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/nodemailer) Updates `@4tw/cypress-drag-drop` from 2.2.5 to 2.3.0 - [Changelog](https://github.com/4teamwork/cypress-drag-drop/blob/master/CHANGELOG.md) - [Commits](https://github.com/4teamwork/cypress-drag-drop/compare/v2.2.5...v2.3.0) Updates `@testing-library/user-event` from 14.6.0 to 14.6.1 - [Release notes](https://github.com/testing-library/user-event/releases) - [Changelog](https://github.com/testing-library/user-event/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/user-event/compare/v14.6...v14.6.1) Updates `cypress-axe` from 1.5.0 to 1.6.0 - [Release notes](https://github.com/component-driven/cypress-axe/releases) - [Commits](https://github.com/component-driven/cypress-axe/compare/v1.5.0...v1.6.0) Updates `cypress-real-events` from 1.13.0 to 1.14.0 - [Release notes](https://github.com/dmtrKovalenko/cypress-real-events/releases) - [Commits](https://github.com/dmtrKovalenko/cypress-real-events/compare/v1.13.0...v1.14.0) --- updated-dependencies: - dependency-name: "@aws-sdk/client-s3" dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: "@remix-run/router" dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: jotai dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: moment-timezone dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: nodemailer dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: "@types/nodemailer" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: "@4tw/cypress-drag-drop" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: "@testing-library/user-event" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-minor-dependencies - dependency-name: cypress-axe dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-dependencies - dependency-name: cypress-real-events dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mercy --- package.json | 20 +- yarn.lock | 936 +++++++++++++++++++++++++-------------------------- 2 files changed, 478 insertions(+), 478 deletions(-) diff --git a/package.json b/package.json index 8f83370361..7f495985c8 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "cross-spawn": "^7.0.5" }, "dependencies": { - "@aws-sdk/client-s3": "3.731.1", + "@aws-sdk/client-s3": "3.738.0", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", @@ -104,7 +104,7 @@ "@huridocs/react-text-selection-handler": "^0.3.0", "@loadable/component": "^5.16.4", "@popperjs/core": "^2.11.8", - "@remix-run/router": "1.21.1", + "@remix-run/router": "1.22.0", "@sentry/node": "^7.114.0", "@sentry/react": "7.114.0", "@sentry/tracing": "^7.114.0", @@ -158,7 +158,7 @@ "immutable": "^3.7.6", "is-reachable": "^5.2.1", "isomorphic-fetch": "3.0.0", - "jotai": "2.11.1", + "jotai": "2.11.2", "json-schema": "^0.4.0", "json-schema-to-typescript": "^15.0.4", "jvent": "1.0.2", @@ -172,14 +172,14 @@ "markdown-it-container": "4.0.0", "mime-types": "^2.1.35", "moment": "^2.30.1", - "moment-timezone": "0.5.46", + "moment-timezone": "0.5.47", "monaco-editor": "0.52.2", "monaco-editor-webpack-plugin": "^7.1.0", "mongodb": "6.3.0", "mongoose": "8.1.2", "multer": "^1.4.5-lts.1", "node-uuid": "^1.4.7", - "nodemailer": "6.9.16", + "nodemailer": "6.10.0", "nprogress": "^0.2.0", "otplib": "^11.0.1", "passport": "^0.7.0", @@ -247,7 +247,7 @@ "yazl": "^3.3.1" }, "devDependencies": { - "@4tw/cypress-drag-drop": "^2.2.5", + "@4tw/cypress-drag-drop": "^2.3.0", "@babel/cli": "7.26.4", "@babel/core": "7.26.0", "@babel/eslint-parser": "7.26.5", @@ -282,7 +282,7 @@ "@storybook/test": "^8.1.11", "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "^16.2.0", - "@testing-library/user-event": "^14.6.0", + "@testing-library/user-event": "^14.6.1", "@types/body-parser": "^1.19.5", "@types/cheerio": "^0.22.30", "@types/child-process-promise": "^2.2.1", @@ -304,7 +304,7 @@ "@types/multer": "^1.4.7", "@types/node": "^16.18.3", "@types/node-uuid": "^0.0.28", - "@types/nodemailer": "^6.4.16", + "@types/nodemailer": "^6.4.17", "@types/prop-types": "^15.7.3", "@types/qs": "^6.9.18", "@types/react": "^18.3.1", @@ -336,9 +336,9 @@ "css-loader": "^7.1.2", "css-minimizer-webpack-plugin": "^7.0.0", "cypress": "13.17.0", - "cypress-axe": "^1.5.0", + "cypress-axe": "^1.6.0", "cypress-plugin-snapshots": "^1.4.4", - "cypress-real-events": "^1.13.0", + "cypress-real-events": "^1.14.0", "enzyme": "3.11.0", "enzyme-to-json": "^3.6.2", "eslint": "v8.57.0", diff --git a/yarn.lock b/yarn.lock index 18a8eb7333..b8931b3e6d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@4tw/cypress-drag-drop@^2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@4tw/cypress-drag-drop/-/cypress-drag-drop-2.2.5.tgz#a40f1431acac6d9ece7055c4779306f4eebad6bb" - integrity sha512-3ghTmzhOmUqeN6U3QmUnKRUxI7OMLbJA4hHUY/eS/FhWJgxbiGgcaELbolWnBAOpajPXcsNQGYEj9brd59WH6A== +"@4tw/cypress-drag-drop@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@4tw/cypress-drag-drop/-/cypress-drag-drop-2.3.0.tgz#e96947a62f2d7e10180d9442fc4da699e0b3bd7c" + integrity sha512-r6/Um+GLidi9mFTx8qiFf1ECMNmwLTLp+CgKVLpYZvJ2aV6mYoe1Uv8Iq1AwqRhhIAdf04aFJ0xzGEO1gnOm1g== "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" @@ -107,439 +107,439 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-sdk/client-s3@3.731.1": - version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.731.1.tgz#39e30fced96784e875b902cfb73ea42138e7601f" - integrity sha512-Ab2PA/8Th6JkurCkxnQJZHPE/JnnSsX/XHQzirkQb+JpKOyWMRC/YZUBfAaiwhxqX65RHgklrwil+UbFl4TtAQ== +"@aws-sdk/client-s3@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.738.0.tgz#0bb71fa46d234c0bd7f86f61c4075453bdf61a8e" + integrity sha512-1Im/p5yfoV15ydVY+QlffsWQkQm7iGVI+3V9tCHEUT6SdmukYEpN3G8Y+lWofRBidxzUE2Xd+MbChCXfzLAoAg== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.731.0" - "@aws-sdk/credential-provider-node" "3.731.1" - "@aws-sdk/middleware-bucket-endpoint" "3.731.0" - "@aws-sdk/middleware-expect-continue" "3.731.0" - "@aws-sdk/middleware-flexible-checksums" "3.731.0" - "@aws-sdk/middleware-host-header" "3.731.0" - "@aws-sdk/middleware-location-constraint" "3.731.0" - "@aws-sdk/middleware-logger" "3.731.0" - "@aws-sdk/middleware-recursion-detection" "3.731.0" - "@aws-sdk/middleware-sdk-s3" "3.731.0" - "@aws-sdk/middleware-ssec" "3.731.0" - "@aws-sdk/middleware-user-agent" "3.731.0" - "@aws-sdk/region-config-resolver" "3.731.0" - "@aws-sdk/signature-v4-multi-region" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@aws-sdk/util-endpoints" "3.731.0" - "@aws-sdk/util-user-agent-browser" "3.731.0" - "@aws-sdk/util-user-agent-node" "3.731.0" - "@aws-sdk/xml-builder" "3.723.0" - "@smithy/config-resolver" "^4.0.0" - "@smithy/core" "^3.0.0" - "@smithy/eventstream-serde-browser" "^4.0.0" - "@smithy/eventstream-serde-config-resolver" "^4.0.0" - "@smithy/eventstream-serde-node" "^4.0.0" - "@smithy/fetch-http-handler" "^5.0.0" - "@smithy/hash-blob-browser" "^4.0.0" - "@smithy/hash-node" "^4.0.0" - "@smithy/hash-stream-node" "^4.0.0" - "@smithy/invalid-dependency" "^4.0.0" - "@smithy/md5-js" "^4.0.0" - "@smithy/middleware-content-length" "^4.0.0" - "@smithy/middleware-endpoint" "^4.0.0" - "@smithy/middleware-retry" "^4.0.0" - "@smithy/middleware-serde" "^4.0.0" - "@smithy/middleware-stack" "^4.0.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/node-http-handler" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/smithy-client" "^4.0.0" - "@smithy/types" "^4.0.0" - "@smithy/url-parser" "^4.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-bucket-endpoint" "3.734.0" + "@aws-sdk/middleware-expect-continue" "3.734.0" + "@aws-sdk/middleware-flexible-checksums" "3.735.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-location-constraint" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-sdk-s3" "3.734.0" + "@aws-sdk/middleware-ssec" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/signature-v4-multi-region" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@aws-sdk/xml-builder" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/eventstream-serde-browser" "^4.0.1" + "@smithy/eventstream-serde-config-resolver" "^4.0.1" + "@smithy/eventstream-serde-node" "^4.0.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-blob-browser" "^4.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/hash-stream-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/md5-js" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.0" - "@smithy/util-defaults-mode-node" "^4.0.0" - "@smithy/util-endpoints" "^3.0.0" - "@smithy/util-middleware" "^4.0.0" - "@smithy/util-retry" "^4.0.0" - "@smithy/util-stream" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-stream" "^4.0.2" "@smithy/util-utf8" "^4.0.0" - "@smithy/util-waiter" "^4.0.0" + "@smithy/util-waiter" "^4.0.2" tslib "^2.6.2" -"@aws-sdk/client-sso@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.731.0.tgz#6e3c13f9865863ad1fdedf848710d5fe9aa0cad6" - integrity sha512-O4C/UYGgqMsBg21MMApFdgyh8BX568hQhbdoNFmRVTBoSnCZ3w+H4a1wBPX4Gyl0NX+ab6Xxo9rId8HiyPXJ0A== +"@aws-sdk/client-sso@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.734.0.tgz#789c98267f07aaa7155b404d0bfd4059c4b4deb9" + integrity sha512-oerepp0mut9VlgTwnG5Ds/lb0C0b2/rQ+hL/rF6q+HGKPfGsCuPvFx1GtwGKCXd49ase88/jVgrhcA9OQbz3kg== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.731.0" - "@aws-sdk/middleware-host-header" "3.731.0" - "@aws-sdk/middleware-logger" "3.731.0" - "@aws-sdk/middleware-recursion-detection" "3.731.0" - "@aws-sdk/middleware-user-agent" "3.731.0" - "@aws-sdk/region-config-resolver" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@aws-sdk/util-endpoints" "3.731.0" - "@aws-sdk/util-user-agent-browser" "3.731.0" - "@aws-sdk/util-user-agent-node" "3.731.0" - "@smithy/config-resolver" "^4.0.0" - "@smithy/core" "^3.0.0" - "@smithy/fetch-http-handler" "^5.0.0" - "@smithy/hash-node" "^4.0.0" - "@smithy/invalid-dependency" "^4.0.0" - "@smithy/middleware-content-length" "^4.0.0" - "@smithy/middleware-endpoint" "^4.0.0" - "@smithy/middleware-retry" "^4.0.0" - "@smithy/middleware-serde" "^4.0.0" - "@smithy/middleware-stack" "^4.0.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/node-http-handler" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/smithy-client" "^4.0.0" - "@smithy/types" "^4.0.0" - "@smithy/url-parser" "^4.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.0" - "@smithy/util-defaults-mode-node" "^4.0.0" - "@smithy/util-endpoints" "^3.0.0" - "@smithy/util-middleware" "^4.0.0" - "@smithy/util-retry" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/core@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.731.0.tgz#86b7cbdd63b20aa5e6339536d2c94a728dd4d83c" - integrity sha512-ithBN1VWASkvAIlozJmenqDvNnFddr/SZXAs58+jCnBHgy3tXLHABZGVNCjetZkHRqNdXEO1kirnoxaFeXMeDA== - dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/core" "^3.0.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/signature-v4" "^5.0.0" - "@smithy/smithy-client" "^4.0.0" - "@smithy/types" "^4.0.0" - "@smithy/util-middleware" "^4.0.0" +"@aws-sdk/core@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.734.0.tgz#fa2289750efd75f4fb8c45719a4a4ea7e7755160" + integrity sha512-SxnDqf3vobdm50OLyAKfqZetv6zzwnSqwIwd3jrbopxxHKqNIM/I0xcYjD6Tn+mPig+u7iRKb9q3QnEooFTlmg== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/core" "^3.1.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" fast-xml-parser "4.4.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.731.0.tgz#456bee6ac9911f48c17f64a2955aa187cc91ef21" - integrity sha512-h0WWZg4QMLgFVyIvQrC43zpVqsUWg1mPM1clpogP43B8+wEhDEQ4qWRzvFs3dQ4cqx/FLyDUZZF4cqgd94z7kw== +"@aws-sdk/credential-provider-env@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.734.0.tgz#6c0b1734764a7fb1616455836b1c3dacd99e50a3" + integrity sha512-gtRkzYTGafnm1FPpiNO8VBmJrYMoxhDlGPYDVcijzx3DlF8dhWnowuSBCxLSi+MJMx5hvwrX2A+e/q0QAeHqmw== dependencies: - "@aws-sdk/core" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.731.0.tgz#f3a2264744bd6af1c1de61b5ce2079c36f875fb3" - integrity sha512-iRtrjtcYaWgbvtu2cvDhIsPWXZGvhy1Hgks4682MEBNTc9AUwlfvDrYz2EEnTtJJyrbOdEHVrYrzqD8qPyVLCg== - dependencies: - "@aws-sdk/core" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@smithy/fetch-http-handler" "^5.0.0" - "@smithy/node-http-handler" "^4.0.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/smithy-client" "^4.0.0" - "@smithy/types" "^4.0.0" - "@smithy/util-stream" "^4.0.0" +"@aws-sdk/credential-provider-http@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.734.0.tgz#21c5fbb380d1dd503491897b346e1e0b1d06ae41" + integrity sha512-JFSL6xhONsq+hKM8xroIPhM5/FOhiQ1cov0lZxhzZWj6Ai3UAjucy3zyIFDr9MgP1KfCYNdvyaUq9/o+HWvEDg== + dependencies: + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/property-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/util-stream" "^4.0.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.731.1": - version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.731.1.tgz#eade17c4086ac67be0a75e8b5414ba9777d178d7" - integrity sha512-0M0ejuqW8iHNcTH2ZXSY9m+I7Y06qVkj6k3vfQU9XaB//mTUCxxfGfqWAtgfr7Yi73egABTcPc0jyPdcvSW4Kw== - dependencies: - "@aws-sdk/core" "3.731.0" - "@aws-sdk/credential-provider-env" "3.731.0" - "@aws-sdk/credential-provider-http" "3.731.0" - "@aws-sdk/credential-provider-process" "3.731.0" - "@aws-sdk/credential-provider-sso" "3.731.1" - "@aws-sdk/credential-provider-web-identity" "3.731.1" - "@aws-sdk/nested-clients" "3.731.1" - "@aws-sdk/types" "3.731.0" - "@smithy/credential-provider-imds" "^4.0.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/shared-ini-file-loader" "^4.0.0" - "@smithy/types" "^4.0.0" +"@aws-sdk/credential-provider-ini@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.734.0.tgz#5769ae28cd255d4fc946799c0273b4af6f2f12bb" + integrity sha512-HEyaM/hWI7dNmb4NhdlcDLcgJvrilk8G4DQX6qz0i4pBZGC2l4iffuqP8K6ZQjUfz5/6894PzeFuhTORAMd+cg== + dependencies: + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-env" "3.734.0" + "@aws-sdk/credential-provider-http" "3.734.0" + "@aws-sdk/credential-provider-process" "3.734.0" + "@aws-sdk/credential-provider-sso" "3.734.0" + "@aws-sdk/credential-provider-web-identity" "3.734.0" + "@aws-sdk/nested-clients" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.731.1": - version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.731.1.tgz#2399fdcfd93ecc7f8a2c83f0580d8f16c63b65f8" - integrity sha512-5c0ZiagMTPmWilXNffeXJCLoCEz97jilHr3QJWwf2GaTay4tzN+Ld71rpdfEenzUR7fuxEWFfVlwQbFOzFNYHg== - dependencies: - "@aws-sdk/credential-provider-env" "3.731.0" - "@aws-sdk/credential-provider-http" "3.731.0" - "@aws-sdk/credential-provider-ini" "3.731.1" - "@aws-sdk/credential-provider-process" "3.731.0" - "@aws-sdk/credential-provider-sso" "3.731.1" - "@aws-sdk/credential-provider-web-identity" "3.731.1" - "@aws-sdk/types" "3.731.0" - "@smithy/credential-provider-imds" "^4.0.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/shared-ini-file-loader" "^4.0.0" - "@smithy/types" "^4.0.0" +"@aws-sdk/credential-provider-node@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.738.0.tgz#0a470fc4d2e791c26da57261b8b14f07de43cd74" + integrity sha512-3MuREsazwBxghKb2sQQHvie+uuK4dX4/ckFYiSoffzJQd0YHxaGxf8cr4NOSCQCUesWu8D3Y0SzlnHGboVSkpA== + dependencies: + "@aws-sdk/credential-provider-env" "3.734.0" + "@aws-sdk/credential-provider-http" "3.734.0" + "@aws-sdk/credential-provider-ini" "3.734.0" + "@aws-sdk/credential-provider-process" "3.734.0" + "@aws-sdk/credential-provider-sso" "3.734.0" + "@aws-sdk/credential-provider-web-identity" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.731.0.tgz#50cc40fa1919d6fc8ac9b8dea26b3ce317f15ece" - integrity sha512-6yNMY6q3xHLbs2f2+C6GhvMrjTgtFBiPJJqKaPLsTIhlTRvh4sK8pGm3ITcma0jOxtPDIuoPfBAV8N8XVMBlZg== +"@aws-sdk/credential-provider-process@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.734.0.tgz#eb1de678a9c3d2d7b382e74a670fa283327f9c45" + integrity sha512-zvjsUo+bkYn2vjT+EtLWu3eD6me+uun+Hws1IyWej/fKFAqiBPwyeyCgU7qjkiPQSXqk1U9+/HG9IQ6Iiz+eBw== dependencies: - "@aws-sdk/core" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/shared-ini-file-loader" "^4.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.731.1": - version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.731.1.tgz#bb2228a5cfac6521741e69a74c2db57ab0ceb0e4" - integrity sha512-p1tp+rMUf5YNQLr8rVRmDgNtKGYLL0KCdq3K2hwwvFnx9MjReF1sA4lfm3xWsxBQM+j3QN9AvMQqBzDJ+NOSdw== - dependencies: - "@aws-sdk/client-sso" "3.731.0" - "@aws-sdk/core" "3.731.0" - "@aws-sdk/token-providers" "3.731.1" - "@aws-sdk/types" "3.731.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/shared-ini-file-loader" "^4.0.0" - "@smithy/types" "^4.0.0" +"@aws-sdk/credential-provider-sso@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.734.0.tgz#68a9d678319e9743d65cf59e2d29c0c440d8975c" + integrity sha512-cCwwcgUBJOsV/ddyh1OGb4gKYWEaTeTsqaAK19hiNINfYV/DO9r4RMlnWAo84sSBfJuj9shUNsxzyoe6K7R92Q== + dependencies: + "@aws-sdk/client-sso" "3.734.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/token-providers" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.731.1": - version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.731.1.tgz#1bb7b21ae579cbcc0b111e29319a2b5bdc187e85" - integrity sha512-+ynAvEGWDR5ZJFxgpwwzhvlQ3WQ7BleWXU6JwpIw3yFrD4eZEn85b8DZC1aEz7C9kb1HSV6B3gpqHqlyS6wj8g== +"@aws-sdk/credential-provider-web-identity@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.734.0.tgz#666b61cc9f498a3aaecd8e38c9ae34aef37e2e64" + integrity sha512-t4OSOerc+ppK541/Iyn1AS40+2vT/qE+MFMotFkhCgCJbApeRF2ozEdnDN6tGmnl4ybcUuxnp9JWLjwDVlR/4g== dependencies: - "@aws-sdk/core" "3.731.0" - "@aws-sdk/nested-clients" "3.731.1" - "@aws-sdk/types" "3.731.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/nested-clients" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-bucket-endpoint@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.731.0.tgz#e4a9c60dad7314682bdfdc30caa010ddda1739d3" - integrity sha512-G9vuGW5GWCbzGOwlGFJcOkfxhw1cB6vzcv75QTT0CmciLXK+Cio8O2pqMSTTF2kg9Y6iHVC2BlOtLRkJAVOxVQ== +"@aws-sdk/middleware-bucket-endpoint@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.734.0.tgz#af63fcaa865d3a47fd0ca3933eef04761f232677" + integrity sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ== dependencies: - "@aws-sdk/types" "3.731.0" + "@aws-sdk/types" "3.734.0" "@aws-sdk/util-arn-parser" "3.723.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/types" "^4.0.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" "@smithy/util-config-provider" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-expect-continue@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.731.0.tgz#1874d6210ddbbb5bb9faf47606a70b6cff52b7f9" - integrity sha512-oY4nsY/mb5O5eZCzIuWpyvzO45Bi6UBtE48IaJsoyVctagA1l8hB66aczH9M1NHNjvbS4Beu1agwh3Nyb1eJug== +"@aws-sdk/middleware-expect-continue@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.734.0.tgz#8159d81c3a8d9a9d60183fdeb7e8d6674f01c1cd" + integrity sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.731.0.tgz#ca3fa5354d92a56633e3762118299da1f34afebd" - integrity sha512-LMs/rndovYjYSntSYyPE/PIl4iHNiquaU0lpDqpQc9iTgQcNbjdriSUWpibgu1jXlGBpBYCqttNkxmEThbbWxA== +"@aws-sdk/middleware-flexible-checksums@3.735.0": + version "3.735.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.735.0.tgz#e83850711d6750df764d7cf3a1a8434fe91f1fb9" + integrity sha512-Tx7lYTPwQFRe/wQEHMR6Drh/S+X0ToAEq1Ava9QyxV1riwtepzRLojpNDELFb3YQVVYbX7FEiBMCJLMkmIIY+A== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" "@aws-crypto/util" "5.2.0" - "@aws-sdk/core" "3.731.0" - "@aws-sdk/types" "3.731.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" "@smithy/is-array-buffer" "^4.0.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/types" "^4.0.0" - "@smithy/util-middleware" "^4.0.0" - "@smithy/util-stream" "^4.0.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.0.2" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.731.0.tgz#7f62d4d1d6243bdba4c8737fc34668c95c6d0e1b" - integrity sha512-ndAJsm5uWPPJRZowLKpB1zuL17qWlWVtCJP4I/ynBkq1PU1DijDXBul2UZaG6Mpvsgms1NXo/h9noHuK7T3v8w== +"@aws-sdk/middleware-host-header@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz#a9a02c055352f5c435cc925a4e1e79b7ba41b1b5" + integrity sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-location-constraint@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.731.0.tgz#cedeeed9d12f6474e09823d5a1d26b2fe892a0f7" - integrity sha512-1I2EjAFxrQksrzqdN7YYuY/q2YsjqeX4l7f9VOkdBjiZeDvVIEdM99IT5sISJB/r6CjNrYX5MhqGhE8i1VFchA== +"@aws-sdk/middleware-location-constraint@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.734.0.tgz#fd1dc0e080ed85dd1feb7db3736c80689db4be07" + integrity sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.731.0.tgz#8ab06f4c6c27be8893e3eb256d686e2bee5c4bf6" - integrity sha512-IIZrOdjbY2vKzPJPrwE7FoFQCIPEL6UqURi8LEaiVyCag4p2fvaTN5pgKuQtGC2+iYd/HHcGT4qn2bAqF5Jmmw== +"@aws-sdk/middleware-logger@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz#d31e141ae7a78667e372953a3b86905bc6124664" + integrity sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.731.0.tgz#c16057884029d9b10a822a47bfd51f59f3f8bf3a" - integrity sha512-y6FLASB1iKWuR5tUipMyo77bt0lEl3OnCrrd2xw/H24avq1HhJjjPR0HHhJE6QKJzF/FYXeV88tcyPSMe32VDw== +"@aws-sdk/middleware-recursion-detection@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz#4fa1deb9887455afbb39130f7d9bc89ccee17168" + integrity sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.731.0.tgz#b8830d6362602f0225cf8759359beabfa8d8e89c" - integrity sha512-J9aKyQaVoec5eWTSDfO4h2sKHNP0wTzN15LFcHnkD+e/d0rdmOi7BTkkbJrIaynma9WShIasmrtM3HNi9GiiTA== +"@aws-sdk/middleware-sdk-s3@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.734.0.tgz#eaeec56fef54713a2a8baa1fbc8be74e8f49fb09" + integrity sha512-zeZPenDhkP/RXYMFG3exhNOe2Qukg2l2KpIjxq9o66meELiTULoIXjCmgPoWcM8zzrue06SBdTsaJDHfDl2vdA== dependencies: - "@aws-sdk/core" "3.731.0" - "@aws-sdk/types" "3.731.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" "@aws-sdk/util-arn-parser" "3.723.0" - "@smithy/core" "^3.0.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/signature-v4" "^5.0.0" - "@smithy/smithy-client" "^4.0.0" - "@smithy/types" "^4.0.0" + "@smithy/core" "^3.1.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" "@smithy/util-config-provider" "^4.0.0" - "@smithy/util-middleware" "^4.0.0" - "@smithy/util-stream" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.0.2" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-ssec@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.731.0.tgz#1f0fe23bfb30b0de203e07d2b5f30233b1f55997" - integrity sha512-1HP4lxGcQx4awXgxfL8t9faBK7TqEL7zkAZrm/YBbLrT9oQomxZOHKIOHvo5VVh4qmsNBdqnH2XUlSMY71gsww== +"@aws-sdk/middleware-ssec@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.734.0.tgz#a5863b9c5a5006dbf2f856f14030d30063a28dfa" + integrity sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.731.0.tgz#5a0c2b118c1a63a37cc4d4db1eb585115ffe4285" - integrity sha512-Ngr2Gz0aec/uduoKaO3srN52SYkEHndYtFzkK/gDUyQwQzi4ha2eIisxPiuHEX6RvXT31V9ouqn/YtVkt0R76A== - dependencies: - "@aws-sdk/core" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@aws-sdk/util-endpoints" "3.731.0" - "@smithy/core" "^3.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/types" "^4.0.0" +"@aws-sdk/middleware-user-agent@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.734.0.tgz#12d400ccb98593f2b02e4fb08239cb9835d41d3a" + integrity sha512-MFVzLWRkfFz02GqGPjqSOteLe5kPfElUrXZft1eElnqulqs6RJfVSpOV7mO90gu293tNAeggMWAVSGRPKIYVMg== + dependencies: + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@smithy/core" "^3.1.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/nested-clients@3.731.1": - version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.731.1.tgz#b60839691f0bbdcb1a1efe8668b1b814704811e6" - integrity sha512-/L8iVrulnXZl+kgmTn+oxRxNnhcSIbf+r12C06vGUq60w0YMidLvxJZN7vt8H9SnCAGCHqud2MS7ExCEvhc0gA== +"@aws-sdk/nested-clients@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.734.0.tgz#10a116d141522341c446b11783551ef863aabd27" + integrity sha512-iph2XUy8UzIfdJFWo1r0Zng9uWj3253yvW9gljhtu+y/LNmNvSnJxQk1f3D2BC5WmcoPZqTS3UsycT3mLPSzWA== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.731.0" - "@aws-sdk/middleware-host-header" "3.731.0" - "@aws-sdk/middleware-logger" "3.731.0" - "@aws-sdk/middleware-recursion-detection" "3.731.0" - "@aws-sdk/middleware-user-agent" "3.731.0" - "@aws-sdk/region-config-resolver" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@aws-sdk/util-endpoints" "3.731.0" - "@aws-sdk/util-user-agent-browser" "3.731.0" - "@aws-sdk/util-user-agent-node" "3.731.0" - "@smithy/config-resolver" "^4.0.0" - "@smithy/core" "^3.0.0" - "@smithy/fetch-http-handler" "^5.0.0" - "@smithy/hash-node" "^4.0.0" - "@smithy/invalid-dependency" "^4.0.0" - "@smithy/middleware-content-length" "^4.0.0" - "@smithy/middleware-endpoint" "^4.0.0" - "@smithy/middleware-retry" "^4.0.0" - "@smithy/middleware-serde" "^4.0.0" - "@smithy/middleware-stack" "^4.0.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/node-http-handler" "^4.0.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/smithy-client" "^4.0.0" - "@smithy/types" "^4.0.0" - "@smithy/url-parser" "^4.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.0" - "@smithy/util-defaults-mode-node" "^4.0.0" - "@smithy/util-endpoints" "^3.0.0" - "@smithy/util-middleware" "^4.0.0" - "@smithy/util-retry" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.731.0.tgz#d7508a1489b43a0767553c82f58c83788bbe3673" - integrity sha512-XlDpRNkDVHF59f07JmkuAidEv//m3hT6/JL85h0l3+zrpaRWhf8n8lVUyAPNq35ZujK8AcorYM+93u7hdWsliQ== +"@aws-sdk/region-config-resolver@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz#45ffbc56a3e94cc5c9e0cd596b0fda60f100f70b" + integrity sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" "@smithy/util-config-provider" "^4.0.0" - "@smithy/util-middleware" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.731.0.tgz#a6b347ce682cf0812caa2fd50cf58b2f3c02c286" - integrity sha512-1r/b4Os15dR+BCVRRLVQJMF7Krq6xX6IKHxN43kuvODYWz8Nv3XDlaSpeRpAzyJuzW/fTp4JgE+z0+gmJfdEeA== +"@aws-sdk/signature-v4-multi-region@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.734.0.tgz#218d254d85b5e97409266725fdd6e9c28c3fbcab" + integrity sha512-GSRP8UH30RIYkcpPILV4pWrKFjRmmNjtUd41HTKWde5GbjJvNYpxqFXw2aIJHjKTw/js3XEtGSNeTaQMVVt3CQ== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@smithy/protocol-http" "^5.0.0" - "@smithy/signature-v4" "^5.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/middleware-sdk-s3" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.731.1": - version "3.731.1" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.731.1.tgz#02cd2ed586635f1ccdc91a1763994dbb545f9983" - integrity sha512-t34GOPwBZsX7zGHjiTXmMHGY3kHM7fLiQ60Jqk0On9P0ASHTDE5U75RgCXboE3u+qEv9wyKyaqMNyMWj9qQlFg== +"@aws-sdk/token-providers@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.734.0.tgz#8880e94f21457fe5dd7074ecc52fdd43180cbb2c" + integrity sha512-2U6yWKrjWjZO8Y5SHQxkFvMVWHQWbS0ufqfAIBROqmIZNubOL7jXCiVdEFekz6MZ9LF2tvYGnOW4jX8OKDGfIw== dependencies: - "@aws-sdk/nested-clients" "3.731.1" - "@aws-sdk/types" "3.731.0" - "@smithy/property-provider" "^4.0.0" - "@smithy/shared-ini-file-loader" "^4.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/nested-clients" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/types@3.731.0", "@aws-sdk/types@^3.222.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.731.0.tgz#c35cc2a8c4c9eca768563037ffbdc0cb599f4cd4" - integrity sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q== +"@aws-sdk/types@3.734.0", "@aws-sdk/types@^3.222.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.734.0.tgz#af5e620b0e761918282aa1c8e53cac6091d169a2" + integrity sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg== dependencies: - "@smithy/types" "^4.0.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@aws-sdk/util-arn-parser@3.723.0": @@ -549,14 +549,14 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.731.0.tgz#21822554efd1f9a22742a4163a312a5dc9372a46" - integrity sha512-riztxTAfncFS9yQWcBJffGgOgLoKSa63ph+rxWJxKl6BHAmWEvHICj1qDcVmnWfIcvJ5cClclY75l9qKaUH7rQ== +"@aws-sdk/util-endpoints@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.734.0.tgz#43bac42a21a45477a386ccf398028e7f793bc217" + integrity sha512-w2+/E88NUbqql6uCVAsmMxDQKu7vsKV0KqhlQb0lL+RCq4zy07yXYptVNs13qrnuTfyX7uPXkXrlugvK9R1Ucg== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/types" "^4.0.0" - "@smithy/util-endpoints" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" + "@smithy/util-endpoints" "^3.0.1" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": @@ -566,33 +566,33 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-user-agent-browser@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.731.0.tgz#09139c7a5d04b0d07571f57b405ca71f761e4d3a" - integrity sha512-EnYXxTkCNCjTTBjW/pelRPv4Thsi9jepoB6qQjPMA9/ixrZ71BhhQecz9kgqzZLR9BPCwb6hgJ/Yd702jqJ4aQ== +"@aws-sdk/util-user-agent-browser@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz#bbf3348b14bd7783f60346e1ce86978999450fe7" + integrity sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng== dependencies: - "@aws-sdk/types" "3.731.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.731.0": - version "3.731.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.731.0.tgz#97751200f073326b170263aabc43d1c01b6520bf" - integrity sha512-Rze78Ym5Bx7aWMvmZE2iL3JPo2INNCC5N9rLVx98Gg1G0ZaxclVRUvJrh1AojNlOFxU+otkxAe7FA3Foy2iLLQ== +"@aws-sdk/util-user-agent-node@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.734.0.tgz#d5c6ee192cea9d53a871178a2669b8b4dea39a68" + integrity sha512-c6Iinh+RVQKs6jYUFQ64htOU2HUXFQ3TVx+8Tu3EDF19+9vzWi9UukhIMH9rqyyEXIAkk9XL7avt8y2Uyw2dGA== dependencies: - "@aws-sdk/middleware-user-agent" "3.731.0" - "@aws-sdk/types" "3.731.0" - "@smithy/node-config-provider" "^4.0.0" - "@smithy/types" "^4.0.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/xml-builder@3.723.0": - version "3.723.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.723.0.tgz#989580d65086985b82f05eaea0ee46d78a510398" - integrity sha512-5xK2SqGU1mzzsOeemy7cy3fGKxR1sEpUs4pEiIjaT0OIvU+fZaDVUEYWOqsgns6wI90XZEQJlXtI8uAHX/do5Q== +"@aws-sdk/xml-builder@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.734.0.tgz#174d3269d303919e3ebfbfa3dd9b6d5a6a7a9543" + integrity sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ== dependencies: - "@smithy/types" "^4.0.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@babel/cli@7.26.4": @@ -2997,10 +2997,10 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.20.0.tgz#03554155b45d8b529adf635b2f6ad1165d70d8b4" integrity sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg== -"@remix-run/router@1.21.1": - version "1.21.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.21.1.tgz#bf15274d3856c395402719fa6b1dc8cc5245aaf7" - integrity sha512-KeBYSwohb8g4/wCcnksvKTYlg69O62sQeLynn2YE+5z7JWEj95if27kclW9QqbrlsQ2DINI8fjbV3zyuKfwjKg== +"@remix-run/router@1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.22.0.tgz#dd8096cb055c475a4de6b35322b8d3b118c17b43" + integrity sha512-MBOl8MeOzpK0HQQQshKB7pABXbmyHizdTpqnrIseTbsv0nAepwC2ENZa1aaBExNQcpLoXmWthhak8SABLzvGPw== "@rtsao/scc@^1.1.0": version "1.1.0" @@ -3209,7 +3209,7 @@ dependencies: tslib "^2.6.2" -"@smithy/config-resolver@^4.0.0", "@smithy/config-resolver@^4.0.1": +"@smithy/config-resolver@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.0.1.tgz#3d6c78bbc51adf99c9819bb3f0ea197fe03ad363" integrity sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ== @@ -3220,21 +3220,21 @@ "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@smithy/core@^3.0.0", "@smithy/core@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.1.0.tgz#7af3f2f06ffd84e98e402da21dd9a40c2abb58ff" - integrity sha512-swFv0wQiK7TGHeuAp6lfF5Kw1dHWsTrCuc+yh4Kh05gEShjsE2RUxHucEerR9ih9JITNtaHcSpUThn5Y/vDw0A== +"@smithy/core@^3.1.1", "@smithy/core@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.1.2.tgz#f5b4c89bf054b717781d71c66b4fb594e06cbb62" + integrity sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q== dependencies: - "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-serde" "^4.0.2" "@smithy/protocol-http" "^5.0.1" "@smithy/types" "^4.1.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-middleware" "^4.0.1" - "@smithy/util-stream" "^4.0.1" + "@smithy/util-stream" "^4.0.2" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/credential-provider-imds@^4.0.0", "@smithy/credential-provider-imds@^4.0.1": +"@smithy/credential-provider-imds@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz#807110739982acd1588a4847b61e6edf196d004e" integrity sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg== @@ -3255,7 +3255,7 @@ "@smithy/util-hex-encoding" "^4.0.0" tslib "^2.6.2" -"@smithy/eventstream-serde-browser@^4.0.0": +"@smithy/eventstream-serde-browser@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz#cdbbb18b9371da363eff312d78a10f6bad82df28" integrity sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA== @@ -3264,7 +3264,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-config-resolver@^4.0.0": +"@smithy/eventstream-serde-config-resolver@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz#3662587f507ad7fac5bd4505c4ed6ed0ac49a010" integrity sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA== @@ -3272,7 +3272,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^4.0.0": +"@smithy/eventstream-serde-node@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz#3799c33e0148d2b923a66577d1dbc590865742ce" integrity sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q== @@ -3290,7 +3290,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/fetch-http-handler@^5.0.0", "@smithy/fetch-http-handler@^5.0.1": +"@smithy/fetch-http-handler@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz#8463393442ca6a1644204849e42c386066f0df79" integrity sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA== @@ -3301,7 +3301,7 @@ "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" -"@smithy/hash-blob-browser@^4.0.0": +"@smithy/hash-blob-browser@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.1.tgz#cda18d5828e8724d97441ea9cc4fd16d0db9da39" integrity sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw== @@ -3311,7 +3311,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/hash-node@^4.0.0": +"@smithy/hash-node@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.1.tgz#ce78fc11b848a4f47c2e1e7a07fb6b982d2f130c" integrity sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w== @@ -3321,7 +3321,7 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/hash-stream-node@^4.0.0": +"@smithy/hash-stream-node@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.0.1.tgz#06126859a3cb1a11e50b61c5a097a4d9a5af2ac1" integrity sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw== @@ -3330,7 +3330,7 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/invalid-dependency@^4.0.0": +"@smithy/invalid-dependency@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz#704d1acb6fac105558c17d53f6d55da6b0d6b6fc" integrity sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ== @@ -3352,7 +3352,7 @@ dependencies: tslib "^2.6.2" -"@smithy/md5-js@^4.0.0": +"@smithy/md5-js@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.0.1.tgz#d7622e94dc38ecf290876fcef04369217ada8f07" integrity sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A== @@ -3361,7 +3361,7 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/middleware-content-length@^4.0.0": +"@smithy/middleware-content-length@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz#378bc94ae623f45e412fb4f164b5bb90b9de2ba3" integrity sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ== @@ -3370,13 +3370,13 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^4.0.0", "@smithy/middleware-endpoint@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.1.tgz#a80ee5b7d2ba3f735e7cc77864f8211db1c63ccb" - integrity sha512-hCCOPu9+sRI7Wj0rZKKnGylKXBEd9cQJetzjQqe8cT4PWvtQAbvNVa6cgAONiZg9m8LaXtP9/waxm3C3eO4hiw== +"@smithy/middleware-endpoint@^4.0.2", "@smithy/middleware-endpoint@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.3.tgz#74b64fb2473ae35649a8d22d41708bc5d8d99df2" + integrity sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q== dependencies: - "@smithy/core" "^3.1.0" - "@smithy/middleware-serde" "^4.0.1" + "@smithy/core" "^3.1.2" + "@smithy/middleware-serde" "^4.0.2" "@smithy/node-config-provider" "^4.0.1" "@smithy/shared-ini-file-loader" "^4.0.1" "@smithy/types" "^4.1.0" @@ -3384,30 +3384,30 @@ "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@smithy/middleware-retry@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.0.1.tgz#1f7fb3086f80d49a5990ffeafade0a264d230146" - integrity sha512-n3g2zZFgOWaz2ZYCy8+4wxSmq+HSTD8QKkRhFDv+nkxY1o7gzyp4PDz/+tOdcNPMPZ/A6Mt4aVECYNjQNiaHJw== +"@smithy/middleware-retry@^4.0.3": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.0.4.tgz#95e55a1b163ff06264f20b4dbbcbd915c8028f60" + integrity sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ== dependencies: "@smithy/node-config-provider" "^4.0.1" "@smithy/protocol-http" "^5.0.1" "@smithy/service-error-classification" "^4.0.1" - "@smithy/smithy-client" "^4.1.0" + "@smithy/smithy-client" "^4.1.3" "@smithy/types" "^4.1.0" "@smithy/util-middleware" "^4.0.1" "@smithy/util-retry" "^4.0.1" tslib "^2.6.2" uuid "^9.0.1" -"@smithy/middleware-serde@^4.0.0", "@smithy/middleware-serde@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.1.tgz#4c9218cecd5316ab696e73fdc1c80b38bcaffa99" - integrity sha512-Fh0E2SOF+S+P1+CsgKyiBInAt3o2b6Qk7YOp2W0Qx2XnfTdfMuSDKUEcnrtpxCzgKJnqXeLUZYqtThaP0VGqtA== +"@smithy/middleware-serde@^4.0.1", "@smithy/middleware-serde@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz#f792d72f6ad8fa6b172e3f19c6fe1932a856a56d" + integrity sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ== dependencies: "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/middleware-stack@^4.0.0", "@smithy/middleware-stack@^4.0.1": +"@smithy/middleware-stack@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz#c157653f9df07f7c26e32f49994d368e4e071d22" integrity sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA== @@ -3415,7 +3415,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/node-config-provider@^4.0.0", "@smithy/node-config-provider@^4.0.1": +"@smithy/node-config-provider@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz#4e84fe665c0774d5f4ebb75144994fc6ebedf86e" integrity sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ== @@ -3436,10 +3436,10 @@ "@smithy/types" "^3.7.2" tslib "^2.6.2" -"@smithy/node-http-handler@^4.0.0", "@smithy/node-http-handler@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.0.1.tgz#3673102f9d719ccbbe18183f59cee368b3881b2c" - integrity sha512-ddQc7tvXiVLC5c3QKraGWde761KSk+mboCheZoWtuqnXh5l0WKyFy3NfDIM/dsKrI9HlLVH/21pi9wWK2gUFFA== +"@smithy/node-http-handler@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz#48d47a046cf900ab86bfbe7f5fd078b52c82fab6" + integrity sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw== dependencies: "@smithy/abort-controller" "^4.0.1" "@smithy/protocol-http" "^5.0.1" @@ -3447,7 +3447,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/property-provider@^4.0.0", "@smithy/property-provider@^4.0.1": +"@smithy/property-provider@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.1.tgz#8d35d5997af2a17cf15c5e921201ef6c5e3fc870" integrity sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ== @@ -3463,7 +3463,7 @@ "@smithy/types" "^3.7.2" tslib "^2.6.2" -"@smithy/protocol-http@^5.0.0", "@smithy/protocol-http@^5.0.1": +"@smithy/protocol-http@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.0.1.tgz#37c248117b29c057a9adfad4eb1d822a67079ff1" integrity sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ== @@ -3504,7 +3504,7 @@ dependencies: "@smithy/types" "^4.1.0" -"@smithy/shared-ini-file-loader@^4.0.0", "@smithy/shared-ini-file-loader@^4.0.1": +"@smithy/shared-ini-file-loader@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz#d35c21c29454ca4e58914a4afdde68d3b2def1ee" integrity sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw== @@ -3512,7 +3512,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/signature-v4@^5.0.0": +"@smithy/signature-v4@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.0.1.tgz#f93401b176150286ba246681031b0503ec359270" integrity sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA== @@ -3526,17 +3526,17 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^4.0.0", "@smithy/smithy-client@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.1.0.tgz#066ddfb5214a75e619e43c657dcfe531fd757d43" - integrity sha512-NiboZnrsrZY+Cy5hQNbYi+nVNssXVi2I+yL4CIKNIanOhH8kpC5PKQ2jx/MQpwVr21a3XcVoQBArlpRF36OeEQ== +"@smithy/smithy-client@^4.1.2", "@smithy/smithy-client@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.1.3.tgz#2c8f9aff3377e7655cebe84239da6be277ba8554" + integrity sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A== dependencies: - "@smithy/core" "^3.1.0" - "@smithy/middleware-endpoint" "^4.0.1" + "@smithy/core" "^3.1.2" + "@smithy/middleware-endpoint" "^4.0.3" "@smithy/middleware-stack" "^4.0.1" "@smithy/protocol-http" "^5.0.1" "@smithy/types" "^4.1.0" - "@smithy/util-stream" "^4.0.1" + "@smithy/util-stream" "^4.0.2" tslib "^2.6.2" "@smithy/types@^3.7.2": @@ -3546,14 +3546,14 @@ dependencies: tslib "^2.6.2" -"@smithy/types@^4.0.0", "@smithy/types@^4.1.0": +"@smithy/types@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.1.0.tgz#19de0b6087bccdd4182a334eb5d3d2629699370f" integrity sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^4.0.0", "@smithy/url-parser@^4.0.1": +"@smithy/url-parser@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.1.tgz#b47743f785f5b8d81324878cbb1b5f834bf8d85a" integrity sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g== @@ -3608,31 +3608,31 @@ dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.1.tgz#ace4442dbc73a144e686097a2855c3dfa9d8fb2f" - integrity sha512-nkQifWzWUHw/D0aLPgyKut+QnJ5X+5E8wBvGfvrYLLZ86xPfVO6MoqfQo/9s4bF3Xscefua1M6KLZtobHMWrBg== +"@smithy/util-defaults-mode-browser@^4.0.3": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.4.tgz#6fa7ba64a80a77f27b9b5c6972918904578b8d5b" + integrity sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw== dependencies: "@smithy/property-provider" "^4.0.1" - "@smithy/smithy-client" "^4.1.0" + "@smithy/smithy-client" "^4.1.3" "@smithy/types" "^4.1.0" bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.1.tgz#c18f0014852b947aa54013e437da13a10a04c8e6" - integrity sha512-LeAx2faB83litC9vaOdwFaldtto2gczUHxfFf8yoRwDU3cwL4/pDm7i0hxsuBCRk5mzHsrVGw+3EVCj32UZMdw== +"@smithy/util-defaults-mode-node@^4.0.3": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.4.tgz#5470fdc96672cee5199620b576d7025de3b17333" + integrity sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw== dependencies: "@smithy/config-resolver" "^4.0.1" "@smithy/credential-provider-imds" "^4.0.1" "@smithy/node-config-provider" "^4.0.1" "@smithy/property-provider" "^4.0.1" - "@smithy/smithy-client" "^4.1.0" + "@smithy/smithy-client" "^4.1.3" "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-endpoints@^3.0.0": +"@smithy/util-endpoints@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz#44ccbf1721447966f69496c9003b87daa8f61975" integrity sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA== @@ -3648,7 +3648,7 @@ dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^4.0.0", "@smithy/util-middleware@^4.0.1": +"@smithy/util-middleware@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.1.tgz#58d363dcd661219298c89fa176a28e98ccc4bf43" integrity sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA== @@ -3656,7 +3656,7 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-retry@^4.0.0", "@smithy/util-retry@^4.0.1": +"@smithy/util-retry@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.1.tgz#fb5f26492383dcb9a09cc4aee23a10f839cd0769" integrity sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw== @@ -3665,13 +3665,13 @@ "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-stream@^4.0.0", "@smithy/util-stream@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.0.1.tgz#cbbaf4a73ca5a6292074cd83682c0c401321e863" - integrity sha512-Js16gOgU6Qht6qTPfuJgb+1YD4AEO+5Y1UPGWKSp3BNo8ONl/qhXSYDhFKJtwybRJynlCqvP5IeiaBsUmkSPTQ== +"@smithy/util-stream@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.0.2.tgz#63495d3f7fba9d78748d540921136dc4a8d4c067" + integrity sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA== dependencies: "@smithy/fetch-http-handler" "^5.0.1" - "@smithy/node-http-handler" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" "@smithy/types" "^4.1.0" "@smithy/util-base64" "^4.0.0" "@smithy/util-buffer-from" "^4.0.0" @@ -3709,7 +3709,7 @@ "@smithy/util-buffer-from" "^4.0.0" tslib "^2.6.2" -"@smithy/util-waiter@^4.0.0": +"@smithy/util-waiter@^4.0.2": version "4.0.2" resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.2.tgz#0a73a0fcd30ea7bbc3009cf98ad199f51b8eac51" integrity sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ== @@ -4126,10 +4126,10 @@ resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== -"@testing-library/user-event@^14.6.0": - version "14.6.0" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.0.tgz#6748ec1ac6df9291e92b6abc0f3530b3842bf34d" - integrity sha512-+jsfK7kVJbqnCYtLTln8Ja/NmVrZRwBJHmHR9IxIVccMWSOZ6Oy0FkDJNeyVu4QSpMNmRfy10Xb76ObRDlWWBQ== +"@testing-library/user-event@^14.6.1": + version "14.6.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.1.tgz#13e09a32d7a8b7060fe38304788ebf4197cd2149" + integrity sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== "@tootallnate/once@2": version "2.0.0" @@ -4650,10 +4650,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.58.tgz#bf66f63983104ed57c754f4e84ccaf16f8235adb" integrity sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA== -"@types/nodemailer@^6.4.16": - version "6.4.16" - resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.16.tgz#db006abcb1e1c8e6ea2fb53b27fefec3c03eaa6c" - integrity sha512-uz6hN6Pp0upXMcilM61CoKyjT7sskBoOWpptkjjJp8jIMlTdc3xG01U7proKkXzruMS4hS0zqtHNkNPFB20rKQ== +"@types/nodemailer@^6.4.17": + version "6.4.17" + resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.17.tgz#5c82a42aee16a3dd6ea31446a1bd6a447f1ac1a4" + integrity sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww== dependencies: "@types/node" "*" @@ -7238,10 +7238,10 @@ cwd@^0.10.0: find-pkg "^0.1.2" fs-exists-sync "^0.1.0" -cypress-axe@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-1.5.0.tgz#95082734583da77b51ce9b7784e14a442016c7a1" - integrity sha512-Hy/owCjfj+25KMsecvDgo4fC/781ccL+e8p+UUYoadGVM2ogZF9XIKbiM6KI8Y3cEaSreymdD6ZzccbI2bY0lQ== +cypress-axe@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-1.6.0.tgz#2d70475e15356dd243ebcbfefd5719526f7ca9bc" + integrity sha512-C/ij50G8eebBrl/WsGT7E+T/SFyIsRZ3Epx9cRTLrPL9Y1GcxlQGFoAVdtSFWRrHSCWXq9HC6iJQMaI89O9yvQ== cypress-plugin-snapshots@^1.4.4: version "1.4.4" @@ -7264,10 +7264,10 @@ cypress-plugin-snapshots@^1.4.4: source-map-support "^0.5.10" unidiff "1.0.2" -cypress-real-events@^1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.13.0.tgz#6b7cd32dcac172db1493608f97a2576c7d0bd5af" - integrity sha512-LoejtK+dyZ1jaT8wGT5oASTPfsNV8/ClRp99ruN60oPj8cBJYod80iJDyNwfPAu4GCxTXOhhAv9FO65Hpwt6Hg== +cypress-real-events@^1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.14.0.tgz#c5495db50a2bd247f4accde983af7153566945d3" + integrity sha512-XmI8y3OZLh6cjRroPalzzS++iv+pGCaD9G9kfIbtspgv7GVsDt30dkZvSXfgZb4rAN+3pOkMVB7e0j4oXydW7Q== cypress@13.17.0: version "13.17.0" @@ -11538,10 +11538,10 @@ joi@^17.6.0: "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" -jotai@2.11.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.11.1.tgz#9fd12aaba8458783482c77c8d7038d6e974fc679" - integrity sha512-41Su098mpHIX29hF/XOpDb0SqF6EES7+HXfrhuBqVSzRkxX48hD5i8nGsEewWZNAsBWJCTTmuz8M946Ih2PfcQ== +jotai@2.11.2: + version "2.11.2" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.11.2.tgz#30c8f04add5820f7fbf0b9ef2c51ae2dd41522a1" + integrity sha512-H3xOvsdqjBJnXTvpgAWfff2y1B3wabi1iSA6FFd0FrLaM4ENsRJd+RJQtkNhY4PZgvAODa4PQhau9dheK+pUkw== jpeg-js@^0.3.4: version "0.3.7" @@ -12455,10 +12455,10 @@ mkdirp@^3.0.1: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== -moment-timezone@0.5.46: - version "0.5.46" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.46.tgz#a21aa6392b3c6b3ed916cd5e95858a28d893704a" - integrity sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw== +moment-timezone@0.5.47: + version "0.5.47" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.47.tgz#d4d1a21b78372d914d6d69ae285454732a429749" + integrity sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA== dependencies: moment "^2.29.4" @@ -12717,10 +12717,10 @@ node-version@^1.0.0: version "1.2.0" resolved "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz" -nodemailer@6.9.16: - version "6.9.16" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.16.tgz#3ebdf6c6f477c571c0facb0727b33892635e0b8b" - integrity sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ== +nodemailer@6.10.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.10.0.tgz#1f24c9de94ad79c6206f66d132776b6503003912" + integrity sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA== nodemon@^3.1.9: version "3.1.9" From 090b198f4617811614accfe0a9b6d9fa2f461cd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 14:32:04 -0500 Subject: [PATCH 69/69] Bump the storybook group with 8 updates (#7631) Bumps the storybook group with 8 updates: | Package | From | To | | --- | --- | --- | | [@storybook/addon-actions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/actions) | `8.5.0` | `8.5.2` | | [@storybook/addon-essentials](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/essentials) | `8.5.0` | `8.5.2` | | [@storybook/addon-interactions](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/interactions) | `8.5.0` | `8.5.2` | | [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links) | `8.5.0` | `8.5.2` | | [@storybook/addon-viewport](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/viewport) | `8.5.0` | `8.5.2` | | [@storybook/react](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/react) | `8.5.0` | `8.5.2` | | [@storybook/react-webpack5](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-webpack5) | `8.5.0` | `8.5.2` | | [@storybook/test](https://github.com/storybookjs/storybook/tree/HEAD/code/lib/test) | `8.5.0` | `8.5.2` | Updates `@storybook/addon-actions` from 8.5.0 to 8.5.2 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/actions) Updates `@storybook/addon-essentials` from 8.5.0 to 8.5.2 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/essentials) Updates `@storybook/addon-interactions` from 8.5.0 to 8.5.2 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/interactions) Updates `@storybook/addon-links` from 8.5.0 to 8.5.2 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/links) Updates `@storybook/addon-viewport` from 8.5.0 to 8.5.2 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/addons/viewport) Updates `@storybook/react` from 8.5.0 to 8.5.2 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/renderers/react) Updates `@storybook/react-webpack5` from 8.5.0 to 8.5.2 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/frameworks/react-webpack5) Updates `@storybook/test` from 8.5.0 to 8.5.2 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v8.5.2/code/lib/test) --- updated-dependencies: - dependency-name: "@storybook/addon-actions" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: "@storybook/addon-essentials" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: "@storybook/addon-interactions" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: "@storybook/addon-links" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: "@storybook/addon-viewport" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: "@storybook/react" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: "@storybook/react-webpack5" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook - dependency-name: "@storybook/test" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: storybook ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mercy --- package.json | 12 +-- yarn.lock | 262 +++++++++++++++++++++++++-------------------------- 2 files changed, 137 insertions(+), 137 deletions(-) diff --git a/package.json b/package.json index 7f495985c8..8cf1116a7b 100644 --- a/package.json +++ b/package.json @@ -271,14 +271,14 @@ "@cfaester/enzyme-adapter-react-18": "^0.8.0", "@chromatic-com/storybook": "^3.2.4", "@cypress/react18": "^2.0.1", - "@storybook/addon-actions": "^8.5.0", - "@storybook/addon-essentials": "^8.5.0", - "@storybook/addon-interactions": "^8.5.0", - "@storybook/addon-links": "^8.5.0", + "@storybook/addon-actions": "^8.5.2", + "@storybook/addon-essentials": "^8.5.2", + "@storybook/addon-interactions": "^8.5.2", + "@storybook/addon-links": "^8.5.2", "@storybook/addon-viewport": "^8.1.11", "@storybook/addon-webpack5-compiler-babel": "^3.0.5", - "@storybook/react": "^8.5.0", - "@storybook/react-webpack5": "^8.5.0", + "@storybook/react": "^8.5.2", + "@storybook/react-webpack5": "^8.5.2", "@storybook/test": "^8.1.11", "@testing-library/jest-dom": "6.6.3", "@testing-library/react": "^16.2.0", diff --git a/yarn.lock b/yarn.lock index b8931b3e6d..940bbcc54b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3742,10 +3742,10 @@ notepack.io "~3.0.1" socket.io-parser "~4.2.1" -"@storybook/addon-actions@8.5.0", "@storybook/addon-actions@^8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-8.5.0.tgz#b2dfb6430637762de302174e650c8cec4109a232" - integrity sha512-6CW9+17rk5eNx6I8EKqCxRKtsJFTR/lHL+xiJ6/iBWApIm8sg63vhXvUTJ58UixmIkT5oLh0+ESNPh+x10D8fw== +"@storybook/addon-actions@8.5.2", "@storybook/addon-actions@^8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-8.5.2.tgz#ce2cc4cf5b29d27a320fee00b4501f56322976be" + integrity sha512-g0gLesVSFgstUq5QphsLeC1vEdwNHgqo2TE0m+STM47832xbxBwmK6uvBeqi416xZvnt1TTKaaBr4uCRRQ64Ww== dependencies: "@storybook/global" "^5.0.0" "@types/uuid" "^9.0.1" @@ -3753,105 +3753,105 @@ polished "^4.2.2" uuid "^9.0.0" -"@storybook/addon-backgrounds@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-8.5.0.tgz#eb554e59e8bb53cf386bcbe77f03b5547a096bf4" - integrity sha512-lzyFLs7niNsqlhH5kdUrp7htLiMIcjY50VLWe0PaeJ6T6GZ7X9qhQzROAUV6cGqzyd8A6y/LzIUntDPMVEm/6g== +"@storybook/addon-backgrounds@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-backgrounds/-/addon-backgrounds-8.5.2.tgz#073f68d0326e58d07313e92a624ad29c3dd7246f" + integrity sha512-l9WkI4QHfINeFQkW9K0joaM7WweKktwIIyUPEvyoupHT4n9ccJHAlWjH4SBmzwI1j1Zt0G3t+bq8mVk/YK6Fsg== dependencies: "@storybook/global" "^5.0.0" memoizerific "^1.11.3" ts-dedent "^2.0.0" -"@storybook/addon-controls@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-8.5.0.tgz#7fd9379b88305194014771fdbe1010af5206e4f1" - integrity sha512-1fivx77A/ahObrPl0L66o9i9MUNfqXxsrpekne5gjMNXw9XJFIRNUe/ddL4CMmwu7SgVbj2QV+q5E5mlnZNTJw== +"@storybook/addon-controls@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-controls/-/addon-controls-8.5.2.tgz#ebf3a305ca86df2fd362c87cca1df7c556401aa6" + integrity sha512-wkzw2vRff4zkzdvC/GOlB2PlV0i973u8igSLeg34TWNEAa4bipwVHnFfIojRuP9eN1bZL/0tjuU5pKnbTqH7aQ== dependencies: "@storybook/global" "^5.0.0" dequal "^2.0.2" ts-dedent "^2.0.0" -"@storybook/addon-docs@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-8.5.0.tgz#0636e460fb948e1fa8377d2f09a85335d55b01ba" - integrity sha512-REwLSr1VgOVNJZwP3y3mldhOjBHlM5fqTvq/tC8NaYpAzx9O4rZdoUSZxW3tYtoNoYrHpB8kzRTeZl8WSdKllw== +"@storybook/addon-docs@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-docs/-/addon-docs-8.5.2.tgz#6dd2e1aa2b5e4772c9059ee2405f8f181694a452" + integrity sha512-pRLJ/Qb/3XHpjS7ZAMaOZYtqxOuI8wPxVKYQ6n5rfMSj2jFwt5tdDsEJdhj2t5lsY8HrzEZi8ExuW5I5RoUoIQ== dependencies: "@mdx-js/react" "^3.0.0" - "@storybook/blocks" "8.5.0" - "@storybook/csf-plugin" "8.5.0" - "@storybook/react-dom-shim" "8.5.0" + "@storybook/blocks" "8.5.2" + "@storybook/csf-plugin" "8.5.2" + "@storybook/react-dom-shim" "8.5.2" react "^16.8.0 || ^17.0.0 || ^18.0.0" react-dom "^16.8.0 || ^17.0.0 || ^18.0.0" ts-dedent "^2.0.0" -"@storybook/addon-essentials@^8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-8.5.0.tgz#dc83caa6cc3aad312c2afb88345915fd59129fc6" - integrity sha512-RrHRdaw2j3ugZiYQ6OHt3Ff08ID4hwAvipqULEsbEnEw3VlXOaW/MT5e2M7kW3MHskQ3iJ6XAD1Y1rNm432Pzw== - dependencies: - "@storybook/addon-actions" "8.5.0" - "@storybook/addon-backgrounds" "8.5.0" - "@storybook/addon-controls" "8.5.0" - "@storybook/addon-docs" "8.5.0" - "@storybook/addon-highlight" "8.5.0" - "@storybook/addon-measure" "8.5.0" - "@storybook/addon-outline" "8.5.0" - "@storybook/addon-toolbars" "8.5.0" - "@storybook/addon-viewport" "8.5.0" +"@storybook/addon-essentials@^8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-essentials/-/addon-essentials-8.5.2.tgz#f92dcc55b00a5a7c90da4b362c109b4b24596995" + integrity sha512-MfojJKxDg0bnjOE0MfLSaPweAud1Esjaf1D9M8EYnpeFnKGZApcGJNRpHCDiHrS5BMr8hHa58RDVc7ObFTI4Dw== + dependencies: + "@storybook/addon-actions" "8.5.2" + "@storybook/addon-backgrounds" "8.5.2" + "@storybook/addon-controls" "8.5.2" + "@storybook/addon-docs" "8.5.2" + "@storybook/addon-highlight" "8.5.2" + "@storybook/addon-measure" "8.5.2" + "@storybook/addon-outline" "8.5.2" + "@storybook/addon-toolbars" "8.5.2" + "@storybook/addon-viewport" "8.5.2" ts-dedent "^2.0.0" -"@storybook/addon-highlight@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-8.5.0.tgz#a6fe48434826c1e869135e47dcfe34d68bcf287c" - integrity sha512-/JxYzMK5aJSYs0K/0eAEFyER2dMoxqwM891MdnkNwLFdyrM58lzHee00F9oEX6zeQoRUNQPRepq0ui2PvbTMGw== +"@storybook/addon-highlight@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-highlight/-/addon-highlight-8.5.2.tgz#7c0b2db6aabdf5fcb00dc75317d7c1c441d88893" + integrity sha512-QjJfY+8e1bi6FeGfVlgxzv/I8DUyC83lZq8zfTY7nDUCVdmKi8VzmW0KgDo5PaEOFKs8x6LKJa+s5O0gFQaJMw== dependencies: "@storybook/global" "^5.0.0" -"@storybook/addon-interactions@^8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-interactions/-/addon-interactions-8.5.0.tgz#467ab13beedb2bc3113a76b33c2105ce757a7ae8" - integrity sha512-vX1a8qS7o/W3kEzfL/CqOj/Rr6UlGLT/n0KXMpfIhx63tzxe1a1qGpFLL0h0zqAVPHZIOu9humWMKri5Iny6oA== +"@storybook/addon-interactions@^8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-interactions/-/addon-interactions-8.5.2.tgz#ef5bba0bf350cee122cb26dc6fd98a4a5b8edd06" + integrity sha512-Gn9Egk2OS0BkkHd671Y0pIqBr4noAOLUfnpxhHE8r0Tt7FmJFeVSN+dqK7hQeUmKL5jdSY25FTYROg65JmtGOA== dependencies: "@storybook/global" "^5.0.0" - "@storybook/instrumenter" "8.5.0" - "@storybook/test" "8.5.0" + "@storybook/instrumenter" "8.5.2" + "@storybook/test" "8.5.2" polished "^4.2.2" ts-dedent "^2.2.0" -"@storybook/addon-links@^8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-8.5.0.tgz#3c49062954467ae36b9e0f446368074a8722257d" - integrity sha512-Y11GIByAYqn0TibI/xsy0vCe+ZxJS9PVAAoHngLxkf9J4WodAXcJABr8ZPlWDNdaEhSS/FF7UQUmNag0UC2/pw== +"@storybook/addon-links@^8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-8.5.2.tgz#a983ee209a34c1f40cde859c44e765dc0cec3475" + integrity sha512-eDKOQoAKKUQo0JqeLNzMLu6fm1s3oxwZ6O+rAWS6n5bsrjZS2Ul8esKkRriFVwHtDtqx99wneqOscS8IzE/ENw== dependencies: "@storybook/csf" "0.1.12" "@storybook/global" "^5.0.0" ts-dedent "^2.0.0" -"@storybook/addon-measure@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-8.5.0.tgz#3459a8e2877c0c36082e3d5fd62cbc6e198cb879" - integrity sha512-e8pJy2sICyj0Ff0W1PFc6HPE6PqcjnnHtfuDaO3M9uSKJLYkpTWJ8i1VSP178f8seq44r5/PdQCHqs5q5l3zgw== +"@storybook/addon-measure@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-measure/-/addon-measure-8.5.2.tgz#6536f8a4115d3c2b44d3dc69eabe9280b146cb39" + integrity sha512-g7Kvrx8dqzeYWetpWYVVu4HaRzLAZVlOAlZYNfCH/aJHcFKp/p5zhPXnZh8aorxeCLHW1QSKcliaA4BNPEvTeg== dependencies: "@storybook/global" "^5.0.0" tiny-invariant "^1.3.1" -"@storybook/addon-outline@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-8.5.0.tgz#9fdb88edbd756da04ff28de665cf06cacd383595" - integrity sha512-r12sk1b38Ph6NroWAOTfjbJ/V+gDobm7tKQQlbSDf6fgX7cqyPHmKjfNDCOCQpXouZm/Jm+41zd758PW+Yt4ng== +"@storybook/addon-outline@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-outline/-/addon-outline-8.5.2.tgz#64d3f6a486608d9fd6eb95aec4edf0c45c6dfb44" + integrity sha512-laMVLT1xluSqMa2mMzmS1kdKcjX0HI9Fw+7pM3r4drtGWtxpyBT32YFqKfWFIBhcd364ti2tDUz9FlygGQ1rKw== dependencies: "@storybook/global" "^5.0.0" ts-dedent "^2.0.0" -"@storybook/addon-toolbars@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-8.5.0.tgz#6a17113d74b92d86433b8789d847d5eeadf316c8" - integrity sha512-q3yYYO2WX8K2DYNM++FzixGDjzYaeREincgsl2WXYXrcuGb5hkOoOgRiAQL8Nz9NQ1Eo+B/yZxrhG/5VoVhUUQ== +"@storybook/addon-toolbars@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-toolbars/-/addon-toolbars-8.5.2.tgz#e32c86c971ba4b3421f6197007e7f990f2e314d6" + integrity sha512-gHQtVCiq7HRqdYQLOmX8nhtV1Lqz4tOCj4BVodwwf8fUcHyNor+2FvGlQjngV2pIeCtxiM/qmG63UpTBp57ZMA== -"@storybook/addon-viewport@8.5.0", "@storybook/addon-viewport@^8.1.11": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-8.5.0.tgz#4e8011c9c5cbd2273a4122b209d7d4f4977d2a2f" - integrity sha512-MlhVELImk9YzjEgGR2ciLC8d5tUSGcO7my4kWIClN0VyTRcvG4ZfwrsEC+jN3/l52nrgjLmKrDX5UAGZm6w5mQ== +"@storybook/addon-viewport@8.5.2", "@storybook/addon-viewport@^8.1.11": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/addon-viewport/-/addon-viewport-8.5.2.tgz#c1b628ae15bb0b57d5a54cfb032e14afd5dc0016" + integrity sha512-W+7nrMQmxHcUNGsXjmb/fak1mD0a5vf4y1hBhSM7/131t8KBsvEu4ral8LTUhc4ZzuU1eIUM0Qth7SjqHqm5bA== dependencies: memoizerific "^1.11.3" @@ -3863,21 +3863,21 @@ "@babel/core" "^7.26.0" babel-loader "^9.2.1" -"@storybook/blocks@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-8.5.0.tgz#6994c44bab2df46cbe925f18a064a6433bd66eff" - integrity sha512-2sTOgjH/JFOgWnpqkKjpKVvKAgUaC9ZBjH1gnCoA5dne/SDafYaCAYfv6yZn7g2Xm1sTxWCAmMIUkYSALeWr+w== +"@storybook/blocks@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/blocks/-/blocks-8.5.2.tgz#44819311a32f898814f7f3e295b0e820d00f3ea1" + integrity sha512-C6Bz/YTG5ZuyAzglqgqozYUWaS39j1PnkVuMNots6S3Fp8ZJ6iZOlQ+rpumiuvnbfD5rkEZG+614RWNyNlFy7g== dependencies: "@storybook/csf" "0.1.12" "@storybook/icons" "^1.2.12" ts-dedent "^2.0.0" -"@storybook/builder-webpack5@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.5.0.tgz#e44f0a197b40e8d3caae21e9459cb9cd4accf57c" - integrity sha512-MyCj11cktyN2HeK8NsLv+L0Km36qAz2UGqu6j1VKJUgPelgpCCi4StCW/KaSBeOFAwGD52xjAdNu+c1h/vfiMg== +"@storybook/builder-webpack5@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.5.2.tgz#619d2cde35781583122234e5132661c15f21b776" + integrity sha512-P4zpavhy9cL1GtITlFp1amTgNSfaQyi60jJwi7joUj0z4RRyBr8YpGi5il9PlaxiY2HROsCdKJftTNzWn058yA== dependencies: - "@storybook/core-webpack" "8.5.0" + "@storybook/core-webpack" "8.5.2" "@types/semver" "^7.3.4" browser-assert "^1.2.1" case-sensitive-paths-webpack-plugin "^2.4.0" @@ -3902,15 +3902,15 @@ webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.6.0" -"@storybook/components@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.5.0.tgz#fab176ee7b863e4abc3c8581f6cb7b3d46bf80b0" - integrity sha512-DhaHtwfEcfWYj3ih/5RBSDHe3Idxyf+oHw2/DmaLKJX6MluhdK3ZqigjRcTmA9Gj/SbR4CkHEEtDzAvBlW0BYw== +"@storybook/components@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.5.2.tgz#987eb741c39c1edeef87347ebd00555f13ebc859" + integrity sha512-o5vNN30sGLTJBeGk5SKyekR4RfTpBTGs2LDjXGAmpl2MRhzd62ix8g+KIXSR0rQ55TCvKUl5VR2i99ttlRcEKw== -"@storybook/core-webpack@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.5.0.tgz#4d4b355d3eeb8b8b1056dd98540d47b3db07bc61" - integrity sha512-bJAcF9TwNO2qNa7Jef4h5U9ka4399HDiHiQec1AxdqUIy/2zfbetgV6+2Fr5mtejPqJgbs7kXNGErI+fFByLGg== +"@storybook/core-webpack@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.5.2.tgz#bf4ed1b68927434f1515eb7a90dfee6c4fae026c" + integrity sha512-r+s3zNojxl370CCCmvj0A+N27fW6zjRODQ7jsHWGSQzTDIz5Vj68rJBIOffr/27nN9r/JtbXbwxuO2UfqMqcqA== dependencies: ts-dedent "^2.0.0" @@ -3933,10 +3933,10 @@ util "^0.12.5" ws "^8.2.3" -"@storybook/csf-plugin@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-8.5.0.tgz#f071c2fb9de5941654b00c95354ee7337d61fc7e" - integrity sha512-cs6ogviNyLG1h9J8Sb47U3DqIrQmn2EHm4ta3fpCeV3ABbrMgbzYyxtmybz4g/AwlDgjAZAt6PPcXkfCJ6p2CQ== +"@storybook/csf-plugin@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-8.5.2.tgz#07d4a3263875469421ae205566179640a22aa1a7" + integrity sha512-EEQ3Vc9qIUbLH8tunzN/GSoyP3zPpNPKegZooYQbgVqA582Pel4Jnpn4uxGaOWtFCLhXMETV05X/7chGZtEujA== dependencies: unplugin "^1.3.1" @@ -3957,26 +3957,26 @@ resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-1.2.12.tgz#3e4c939113b67df7ab17b78f805dbb57f4acf0db" integrity sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q== -"@storybook/instrumenter@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-8.5.0.tgz#e8c38ab912f2b7119cd92efe3977bc33246fa808" - integrity sha512-eZ/UY6w4U2vay+wX7QVwKiRoyMzZscuv6v4k4r8BlmHPFWbhiZDO9S2GsG16UkyKnrQrYk432he70n7hn1Xvmg== +"@storybook/instrumenter@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-8.5.2.tgz#40ce218565d5143ce84cbb2debd038d05ee7aff7" + integrity sha512-BbaUw9GXVzRg3Km95t2mRu4W6C1n1erjzll5maBaVe2+lV9MbCvBcdYwGUgjFNlQ/ETgq6vLfLOEtziycq/B6g== dependencies: "@storybook/global" "^5.0.0" "@vitest/utils" "^2.1.1" -"@storybook/manager-api@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.5.0.tgz#4024ff316677ca9f4175eb4d1818488dd6f18095" - integrity sha512-Ildriueo3eif4M+gMlMxu/mrBIbAnz8+oesmQJKdzZfe/U9eQTI9OUqJsxx/IVBmdzQ3ySsgNmzj5VweRkse4A== +"@storybook/manager-api@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.5.2.tgz#cf20d814c4eecd0b02487c1a863d614574d8aaf1" + integrity sha512-Cn+oINA6BOO2GmGHinGsOWnEpoBnurlZ9ekMq7H/c1SYMvQWNg5RlELyrhsnyhNd83fqFZy9Asb0RXI8oqz7DQ== -"@storybook/preset-react-webpack@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.5.0.tgz#59da1eb0dc8a5981c8f793900a299b8bd2437ba6" - integrity sha512-KJwVcQVYQWuMT5QUF06be60UuBfazBIO+90erfoYoIx0UwOxKMVnQz0HfG2JMc4EIoNLIl0/cm5mb2k4BWyhbA== +"@storybook/preset-react-webpack@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.5.2.tgz#102748bc9c3c7d3edceb36d1cd33b0fa97eb0fa2" + integrity sha512-CpRunaOl4tB7Z+1dQEG/LSAdwnCZCaKdfn+Q71k6Pk1vpR6aFlhVbbVP5kgt47vimHDKYKYBQKudP+5IjJNvFA== dependencies: - "@storybook/core-webpack" "8.5.0" - "@storybook/react" "8.5.0" + "@storybook/core-webpack" "8.5.2" + "@storybook/react" "8.5.2" "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0" "@types/semver" "^7.3.4" find-up "^5.0.0" @@ -3987,10 +3987,10 @@ tsconfig-paths "^4.2.0" webpack "5" -"@storybook/preview-api@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.5.0.tgz#32dbff12d5299897df2ccf68ad5007e814b8b067" - integrity sha512-g0XbD54zMUkl6bpuA7qEBCE9rW1QV6KKmwkO4bkxMOJcMke3x9l00JTaYn7Un8wItjXiS3BIG15B6mnfBG7fng== +"@storybook/preview-api@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.5.2.tgz#6438817402890acc3ef792ac5747cdb9c893fe03" + integrity sha512-AOOaBjwnkFU40Fi68fvAnK0gMWPz6o/AmH44yDGsHgbI07UgqxLBKCTpjCGPlyQd5ezEjmGwwFTmcmq5dG8DKA== "@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0": version "1.0.6--canary.9.0c3f3b7.0" @@ -4005,50 +4005,50 @@ react-docgen-typescript "^2.2.2" tslib "^2.0.0" -"@storybook/react-dom-shim@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.5.0.tgz#ada85ed027113b0e05debfd5c5e6ffa44843b069" - integrity sha512-7P8xg4FiuFpM6kQOzZynno+0zyLVs8NgsmRK58t3JRZXbda1tzlxTXzvqx4hUevvbPJGjmrB0F3xTFH+8Otnvw== +"@storybook/react-dom-shim@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.5.2.tgz#4abf4d40c714ade13fb5e3ef3790693c04f0dcb5" + integrity sha512-lt7XoaeWI8iPlWnWzIm/Wam9TpRFhlqP0KZJoKwDyHiCByqkeMrw5MJREyWq626nf34bOW8D6vkuyTzCHGTxKg== -"@storybook/react-webpack5@^8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.5.0.tgz#327f4b1b30f9f6ed54b955de49444bcc306e6be6" - integrity sha512-L2KIR458Q2+5VOOh0wf84vla3gSsuq9C/266GmHZovlDClVlnaQTg8lc8ug52K2+rOChdz8MQqZjGO+Bg0OvLw== +"@storybook/react-webpack5@^8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.5.2.tgz#bb4871dc84ba1b45adad1418ce481b9a5731a801" + integrity sha512-OrHaOSaabqOJ3433B0Ea5gVhsR1WaZRs49Y+S/z33VX9iILlougXVx9zNPoeZzgDSG4xEEn2uimFpjjcLLkWzA== dependencies: - "@storybook/builder-webpack5" "8.5.0" - "@storybook/preset-react-webpack" "8.5.0" - "@storybook/react" "8.5.0" + "@storybook/builder-webpack5" "8.5.2" + "@storybook/preset-react-webpack" "8.5.2" + "@storybook/react" "8.5.2" -"@storybook/react@8.5.0", "@storybook/react@^8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.5.0.tgz#da6667d8a6f49d5ea4ec95c75f1ab853edada2a4" - integrity sha512-/jbkmGGc95N7KduIennL/k8grNTP5ye/YBnkcS4TbF7uDWBtKy3/Wqvx5BIlFXq3qeUnZJ8YtZc0lPIYeCY8XQ== +"@storybook/react@8.5.2", "@storybook/react@^8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.5.2.tgz#4e341c8d5215dd0ee6a38de3498d58fc4f01c35a" + integrity sha512-hWzw9ZllfzsaBJdAoEqPQ2GdVNV4c7PkvIWM6z67epaOHqsdsKScbTMe+YAvFMPtLtOO8KblIrtU5PeD4KyMgw== dependencies: - "@storybook/components" "8.5.0" + "@storybook/components" "8.5.2" "@storybook/global" "^5.0.0" - "@storybook/manager-api" "8.5.0" - "@storybook/preview-api" "8.5.0" - "@storybook/react-dom-shim" "8.5.0" - "@storybook/theming" "8.5.0" + "@storybook/manager-api" "8.5.2" + "@storybook/preview-api" "8.5.2" + "@storybook/react-dom-shim" "8.5.2" + "@storybook/theming" "8.5.2" -"@storybook/test@8.5.0", "@storybook/test@^8.1.11": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/test/-/test-8.5.0.tgz#d7157a87436000142cf6dedee37a74b86ad776f2" - integrity sha512-M/DdPlI6gwL7NGkK5o7GYjdEBp95AsFEUtW29zQfnVIAngYugzi3nIuM/XkQHunidVdAZCYjw2s2Yhhsx/m9sw== +"@storybook/test@8.5.2", "@storybook/test@^8.1.11": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/test/-/test-8.5.2.tgz#0bf5e6cdab94986e2fc0eeb8ba4c689f67b6ca32" + integrity sha512-F5WfD75m25ZRS19cSxCzHWJ/rH8jWwIjhBlhU+UW+5xjnTS1cJuC1yPT/5Jw0/0Aj9zG1atyfBUYnNHYtsBDYQ== dependencies: "@storybook/csf" "0.1.12" "@storybook/global" "^5.0.0" - "@storybook/instrumenter" "8.5.0" + "@storybook/instrumenter" "8.5.2" "@testing-library/dom" "10.4.0" "@testing-library/jest-dom" "6.5.0" "@testing-library/user-event" "14.5.2" "@vitest/expect" "2.0.5" "@vitest/spy" "2.0.5" -"@storybook/theming@8.5.0": - version "8.5.0" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.5.0.tgz#c51c938ae6d695ecb73604e46d19d9db33859408" - integrity sha512-591LbOj/HMmHYUfLgrMerxhF1A9mY61HWKxcRpB6xxalc1Xw1kRtQ49DcwuTXnUu9ktBB3nuOzPNPQPFSh/7PQ== +"@storybook/theming@8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.5.2.tgz#c1371e3e1e9775f7642af391728ebd1ba4a5c5eb" + integrity sha512-vro8vJx16rIE0UehawEZbxFFA4/VGYS20PMKP6Y6Fpsce0t2/cF/U9qg3jOzVb/XDwfx+ne3/V+8rjfWx8wwJw== "@supercharge/promise-pool@^3.2.0": version "3.2.0"