From e2c974f53b9cb55176db4e13dd45b67a00ef5df9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 10:23:48 +0000 Subject: [PATCH 01/36] Update peter-evans/create-pull-request digest to 6d6857d --- .github/workflows/update-jitsi.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-jitsi.yml b/.github/workflows/update-jitsi.yml index 3a1ea33cbf..10a082cf24 100644 --- a/.github/workflows/update-jitsi.yml +++ b/.github/workflows/update-jitsi.yml @@ -21,7 +21,7 @@ jobs: run: "yarn update:jitsi" - name: Create Pull Request - uses: peter-evans/create-pull-request@c55203cfde3e5c11a452d352b4393e68b85b4533 # v6 + uses: peter-evans/create-pull-request@6d6857d36972b65feb161a90e484f2984215f83e # v6 with: token: ${{ secrets.ELEMENT_BOT_TOKEN }} branch: actions/jitsi-update From 35f2f5055a0e2126efc22aa7b5dffdcbffbf0c6f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 10:24:22 +0000 Subject: [PATCH 02/36] Update definitelyTyped --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index f6b8fd6425..5237058584 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3182,9 +3182,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/jsrsasign@^10.5.4": - version "10.5.13" - resolved "https://registry.yarnpkg.com/@types/jsrsasign/-/jsrsasign-10.5.13.tgz#10f10d298d35f960b1d98a7de0664b6ed13e0da1" - integrity sha512-vvVHLrXxoUZgBWTcJnTMSC4FAQcG2loK7N1Uy20I3nr/aUhetbGdfuwSzXkrMoll2RoYKW0IcMIN0I0bwMwVMQ== + version "10.5.14" + resolved "https://registry.yarnpkg.com/@types/jsrsasign/-/jsrsasign-10.5.14.tgz#61d1dbd791ecd11db556c1ca5d82453fc7207338" + integrity sha512-lppSlfK6etu+cuKs40K4rg8As79PH6hzIB+v55zSqImbSH3SE6Fm8MBHCiI91cWlAP3Z4igtJK1VL3fSN09blQ== "@types/katex@^0.16.7": version "0.16.7" @@ -3192,9 +3192,9 @@ integrity sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ== "@types/lodash@^4.14.197": - version "4.17.0" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.0.tgz#d774355e41f372d5350a4d0714abb48194a489c3" - integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== + version "4.17.1" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.1.tgz#0fabfcf2f2127ef73b119d98452bd317c4a17eb8" + integrity sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q== "@types/mapbox__point-geometry@*", "@types/mapbox__point-geometry@^0.1.2": version "0.1.4" @@ -3248,9 +3248,9 @@ undici-types "~5.26.4" "@types/node@^16": - version "16.18.96" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.96.tgz#eb0012d23ff53d14d64ec8a352bf89792de6aade" - integrity sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ== + version "16.18.97" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.97.tgz#d7926a8030f0d714d555b4550c0cc7731495cfe5" + integrity sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg== "@types/normalize-package-data@^2.4.0": version "2.4.4" From 36391187da98719959e85295fc761a2fad4802c8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 10:24:47 +0000 Subject: [PATCH 03/36] Update all non-major dependencies --- yarn.lock | 62 +++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/yarn.lock b/yarn.lock index f6b8fd6425..c7d4c519ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4817,9 +4817,9 @@ create-require@^1.1.0: integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cronstrue@^2.41.0: - version "2.49.0" - resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-2.49.0.tgz#d59f6d19e33030d45d9ecd3b845d4ccd79c6bfbd" - integrity sha512-FWZBqdStQaPR8ZTBQGALh1EK9Hl1HcG70dyGvD1rKLPafFO3H73o38dz/e8YkIlbLn3JxmBI/f6Doe3Nh+DcEQ== + version "2.50.0" + resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-2.50.0.tgz#eabba0f915f186765258b707b7a3950c663b5573" + integrity sha512-ULYhWIonJzlScCCQrPUG5uMXzXxSixty4djud9SS37DoNxDdkeRocxzHuAo4ImRBUK+mAuU5X9TSwEDccnnuPg== cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" @@ -6557,15 +6557,15 @@ glob-to-regexp@^0.4.0, glob-to-regexp@^0.4.1: integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^10.3.7: - version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" - integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== + version "10.3.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.15.tgz#e72bc61bc3038c90605f5dd48543dc67aaf3b50d" + integrity sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw== dependencies: foreground-child "^3.1.0" jackspeak "^2.3.6" minimatch "^9.0.1" minipass "^7.0.4" - path-scurry "^1.10.2" + path-scurry "^1.11.0" glob@^7.1.3, glob@^7.1.4: version "7.2.3" @@ -8224,9 +8224,9 @@ lower-case@^2.0.2: tslib "^2.0.3" lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== lru-cache@^5.1.1: version "5.1.1" @@ -8235,13 +8235,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" @@ -8601,9 +8594,9 @@ minipass@^4.2.4: integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + version "7.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" + integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== mkdirp@0.5.6: version "0.5.6" @@ -9091,7 +9084,15 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.2, path-scurry@^1.6.1: +path-scurry@^1.11.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-scurry@^1.6.1: version "1.10.2" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== @@ -10424,9 +10425,9 @@ rimraf@^3.0.2: glob "^7.1.3" rimraf@^5.0.0, rimraf@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" - integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + version "5.0.7" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" + integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== dependencies: glob "^10.3.7" @@ -10565,11 +10566,9 @@ semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== send@0.18.0: version "0.18.0" @@ -12174,11 +12173,6 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" From 571028f1244219203f5e0a89ea96879418e500f6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 10:25:38 +0000 Subject: [PATCH 04/36] Update stylelint --- yarn.lock | 56 +++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/yarn.lock b/yarn.lock index f6b8fd6425..7bd2c76582 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1414,9 +1414,9 @@ integrity sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ== "@csstools/css-parser-algorithms@^2.6.1": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz#c45440d1efa2954006748a01697072dae5881bcd" - integrity sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA== + version "2.6.3" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz#b5e7eb2bd2a42e968ef61484f1490a8a4148a8eb" + integrity sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA== "@csstools/css-tokenizer@^2.2.3": version "2.2.3" @@ -1424,9 +1424,9 @@ integrity sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg== "@csstools/css-tokenizer@^2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz#a4b8718ed7fcd2dcd555de16b31ca59ad4b96a06" - integrity sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz#3d47e101ad48d815a4bdce8159fb5764f087f17a" + integrity sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g== "@csstools/media-query-list-parser@^2.1.8": version "2.1.8" @@ -1434,9 +1434,9 @@ integrity sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g== "@csstools/media-query-list-parser@^2.1.9": - version "2.1.9" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz#feb4b7268f998956eb3ded69507869e73d005dda" - integrity sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA== + version "2.1.11" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz#465aa42f268599729350e305e1ae14a30c1daf51" + integrity sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA== "@csstools/postcss-cascade-layers@^4.0.3": version "4.0.3" @@ -1679,11 +1679,16 @@ resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.1.tgz#598a25630fd9ab0edf066d235916f7441404942a" integrity sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg== -"@csstools/selector-specificity@^3.0.2", "@csstools/selector-specificity@^3.0.3": +"@csstools/selector-specificity@^3.0.2": version "3.0.3" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz#208a3929ee614967a1fc8cd6cb758d9fcbf0caae" integrity sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q== +"@csstools/selector-specificity@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz#63085d2995ca0f0e55aa8b8a07d69bfd48b844fe" + integrity sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA== + "@csstools/utilities@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@csstools/utilities/-/utilities-1.0.0.tgz#42f3c213f2fb929324d465684ab9f46a0febd4bb" @@ -1695,9 +1700,9 @@ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@dual-bundle/import-meta-resolve@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz#df79b7ea62c55094dc129880387864cdf41eca7c" - integrity sha512-ZKXyJeFAzcpKM2kk8ipoGIPUqx9BX52omTGnfwjJvxOCaZTM2wtDK7zN0aIgPRbT9XYAlha0HtmZ+XKteuh0Gw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#519c1549b0e147759e7825701ecffd25e5819f7b" + integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -8046,11 +8051,6 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -known-css-properties@^0.29.0: - version "0.29.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.29.0.tgz#e8ba024fb03886f23cb882e806929f32d814158f" - integrity sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ== - known-css-properties@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.30.0.tgz#34dd1f39c805c65a6dfa6ea76206b20dc523dd96" @@ -9128,9 +9128,9 @@ pbf@^3.2.1: resolve-protobuf-schema "^2.1.0" picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -11062,20 +11062,20 @@ stylelint-config-standard@^36.0.0: stylelint-config-recommended "^14.0.0" stylelint-scss@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.2.1.tgz#7675f3f5034a3b1d7d064d480e0d834ef9353244" - integrity sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw== + version "6.3.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.3.0.tgz#2020d0f0d21b8b4151f523e303ae8966728a6e54" + integrity sha512-8OSpiuf1xC7f8kllJsBOFAOYp/mR/C1FXMVeOFjtJPw+AFvEmC93FaklHt7MlOqU4poxuQ1TkYMyfI0V+1SxjA== dependencies: - known-css-properties "^0.29.0" + known-css-properties "^0.30.0" postcss-media-query-parser "^0.2.3" postcss-resolve-nested-selector "^0.1.1" postcss-selector-parser "^6.0.15" postcss-value-parser "^4.2.0" stylelint@^16.1.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.4.0.tgz#8811005be82ca06224bc9bc3b4cf2fce30b347ae" - integrity sha512-uSx7VMuXwLuYcNSIg+0/fFNv0WinsfLAqsVVy7h7p80clKOHiGE8pfY6UjqwylTHiJrRIahTl6a8FPxGezhWoA== + version "16.5.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.5.0.tgz#4e3aff7cc2294fa54da729b972a6c38bf2a584a0" + integrity sha512-IlCBtVrG+qTy3v+tZTk50W8BIomjY/RUuzdrDqdnlCYwVuzXtPbiGfxYqtyYAyOMcb+195zRsuHn6tgfPmFfbw== dependencies: "@csstools/css-parser-algorithms" "^2.6.1" "@csstools/css-tokenizer" "^2.2.4" From ab690372d278dba5b908cda768fe9435887e2cea Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 10:25:54 +0000 Subject: [PATCH 05/36] Update dependency css-minimizer-webpack-plugin to v7 --- package.json | 2 +- yarn.lock | 387 +++++++++++++++++++++++++-------------------------- 2 files changed, 191 insertions(+), 198 deletions(-) diff --git a/package.json b/package.json index f2ad032451..ef731276d6 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "copy-webpack-plugin": "^12.0.0", "cronstrue": "^2.41.0", "css-loader": "^7.0.0", - "css-minimizer-webpack-plugin": "^6.0.0", + "css-minimizer-webpack-plugin": "^7.0.0", "dotenv": "^16.0.2", "eslint": "8.57.0", "eslint-config-google": "^0.14.0", diff --git a/yarn.lock b/yarn.lock index f6b8fd6425..c517fcadc2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2125,14 +2125,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jridgewell/trace-mapping@^0.3.21": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" - integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" @@ -4581,7 +4573,7 @@ color-name@^1.1.4, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colord@^2.9.1, colord@^2.9.3: +colord@^2.9.3: version "2.9.3" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== @@ -4844,10 +4836,10 @@ css-box-model@^1.2.0: dependencies: tiny-invariant "^1.0.6" -css-declaration-sorter@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.1.1.tgz#9796bcc257b4647c39993bda8d431ce32b666f80" - integrity sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ== +css-declaration-sorter@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" + integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== css-functions-list@^3.2.2: version "3.2.2" @@ -4877,15 +4869,15 @@ css-loader@^7.0.0: postcss-value-parser "^4.2.0" semver "^7.5.4" -css-minimizer-webpack-plugin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-6.0.0.tgz#eb79947af785467739375faf7fcb8c2dbf4f06dc" - integrity sha512-BLpR9CCDkKvhO3i0oZQgad6v9pCxUuhSc5RT6iUEy9M8hBXi4TJb5vqF2GQ2deqYHmRi3O6IR9hgAZQWg0EBwA== +css-minimizer-webpack-plugin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.0.tgz#b77a3d2f7c0fd02d3ac250dcc2f79065363f3cd3" + integrity sha512-niy66jxsQHqO+EYbhPuIhqRQ1mNcNVUHrMnkzzir9kFOERJUaQDDRhh7dKDz33kBpkWMF9M8Vx0QlDbc5AHOsw== dependencies: - "@jridgewell/trace-mapping" "^0.3.21" - cssnano "^6.0.3" + "@jridgewell/trace-mapping" "^0.3.25" + cssnano "^7.0.1" jest-worker "^29.7.0" - postcss "^8.4.33" + postcss "^8.4.38" schema-utils "^4.2.0" serialize-javascript "^6.0.2" @@ -4965,53 +4957,54 @@ cssfontparser@^1.2.1: resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3" integrity sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg== -cssnano-preset-default@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.3.tgz#b4ce755974f4dc8d3d09ac13bb6281cce3ced45e" - integrity sha512-4y3H370aZCkT9Ev8P4SO4bZbt+AExeKhh8wTbms/X7OLDo5E7AYUUy6YPxa/uF5Grf+AJwNcCnxKhZynJ6luBA== - dependencies: - css-declaration-sorter "^7.1.1" - cssnano-utils "^4.0.1" - postcss-calc "^9.0.1" - postcss-colormin "^6.0.2" - postcss-convert-values "^6.0.2" - postcss-discard-comments "^6.0.1" - postcss-discard-duplicates "^6.0.1" - postcss-discard-empty "^6.0.1" - postcss-discard-overridden "^6.0.1" - postcss-merge-longhand "^6.0.2" - postcss-merge-rules "^6.0.3" - postcss-minify-font-values "^6.0.1" - postcss-minify-gradients "^6.0.1" - postcss-minify-params "^6.0.2" - postcss-minify-selectors "^6.0.2" - postcss-normalize-charset "^6.0.1" - postcss-normalize-display-values "^6.0.1" - postcss-normalize-positions "^6.0.1" - postcss-normalize-repeat-style "^6.0.1" - postcss-normalize-string "^6.0.1" - postcss-normalize-timing-functions "^6.0.1" - postcss-normalize-unicode "^6.0.2" - postcss-normalize-url "^6.0.1" - postcss-normalize-whitespace "^6.0.1" - postcss-ordered-values "^6.0.1" - postcss-reduce-initial "^6.0.2" - postcss-reduce-transforms "^6.0.1" - postcss-svgo "^6.0.2" - postcss-unique-selectors "^6.0.2" - -cssnano-utils@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.1.tgz#fd18b42f95938bf55ab47967705355d6047bf1da" - integrity sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ== +cssnano-preset-default@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.1.tgz#b05c93a29868dd7bd810fa8bbf89f482804da922" + integrity sha512-Fumyr+uZMcjYQeuHssAZxn0cKj3cdQc5GcxkBcmEzISGB+UW9CLNlU4tBOJbJGcPukFDlicG32eFbrc8K9V5pw== + dependencies: + browserslist "^4.23.0" + css-declaration-sorter "^7.2.0" + cssnano-utils "^5.0.0" + postcss-calc "^10.0.0" + postcss-colormin "^7.0.0" + postcss-convert-values "^7.0.0" + postcss-discard-comments "^7.0.0" + postcss-discard-duplicates "^7.0.0" + postcss-discard-empty "^7.0.0" + postcss-discard-overridden "^7.0.0" + postcss-merge-longhand "^7.0.0" + postcss-merge-rules "^7.0.0" + postcss-minify-font-values "^7.0.0" + postcss-minify-gradients "^7.0.0" + postcss-minify-params "^7.0.0" + postcss-minify-selectors "^7.0.0" + postcss-normalize-charset "^7.0.0" + postcss-normalize-display-values "^7.0.0" + postcss-normalize-positions "^7.0.0" + postcss-normalize-repeat-style "^7.0.0" + postcss-normalize-string "^7.0.0" + postcss-normalize-timing-functions "^7.0.0" + postcss-normalize-unicode "^7.0.0" + postcss-normalize-url "^7.0.0" + postcss-normalize-whitespace "^7.0.0" + postcss-ordered-values "^7.0.0" + postcss-reduce-initial "^7.0.0" + postcss-reduce-transforms "^7.0.0" + postcss-svgo "^7.0.0" + postcss-unique-selectors "^7.0.0" + +cssnano-utils@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687" + integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ== -cssnano@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.3.tgz#46db972da71aa159437287fb4c6bc9c5d3cc5d93" - integrity sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw== +cssnano@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.1.tgz#a62675fc17f9a26d8560d3e61d79228b628dbb63" + integrity sha512-917Mej/4SdI7b55atsli3sU4MOJ9XDoKgnlCtQtXYj8XUFcM3riTuYHyqBBnnskawW+zWwp0KxJzpEUodlpqUg== dependencies: - cssnano-preset-default "^6.0.3" - lilconfig "^3.0.0" + cssnano-preset-default "^7.0.1" + lilconfig "^3.1.1" csso@^4.2.0: version "4.2.0" @@ -8084,7 +8077,7 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" -lilconfig@^3.0.0: +lilconfig@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== @@ -9207,12 +9200,12 @@ postcss-attribute-case-insensitive@^6.0.3: dependencies: postcss-selector-parser "^6.0.13" -postcss-calc@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" - integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== +postcss-calc@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.0.0.tgz#aca29a1c66dd481ca30d08f6932b1274a1003716" + integrity sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g== dependencies: - postcss-selector-parser "^6.0.11" + postcss-selector-parser "^6.0.16" postcss-value-parser "^4.2.0" postcss-clamp@^4.1.0: @@ -9249,22 +9242,22 @@ postcss-color-rebeccapurple@^9.0.3: "@csstools/utilities" "^1.0.0" postcss-value-parser "^4.2.0" -postcss-colormin@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.2.tgz#2af9ce753937b08e058dbc6879e4aedfab42806b" - integrity sha512-TXKOxs9LWcdYo5cgmcSHPkyrLAh86hX1ijmyy6J8SbOhyv6ua053M3ZAM/0j44UsnQNIWdl8gb5L7xX2htKeLw== +postcss-colormin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.0.tgz#76b9e40eff69a363c1fc5ce2f0ece1d4a01d1de8" + integrity sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg== dependencies: - browserslist "^4.22.2" + browserslist "^4.23.0" caniuse-api "^3.0.0" - colord "^2.9.1" + colord "^2.9.3" postcss-value-parser "^4.2.0" -postcss-convert-values@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.2.tgz#c4a7509aeb1cc7ac3f6948fcbffc2bf8cac7c56a" - integrity sha512-aeBmaTnGQ+NUSVQT8aY0sKyAD/BaLJenEKZ03YK0JnDE1w1Rr8XShoxdal2V2H26xTJKr3v5haByOhJuyT4UYw== +postcss-convert-values@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.0.tgz#4a53e79c4bd81cfed8a7ed3fffb7b255a2f5f300" + integrity sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w== dependencies: - browserslist "^4.22.2" + browserslist "^4.23.0" postcss-value-parser "^4.2.0" postcss-custom-media@^10.0.3: @@ -9305,25 +9298,25 @@ postcss-dir-pseudo-class@^8.0.1: dependencies: postcss-selector-parser "^6.0.13" -postcss-discard-comments@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.1.tgz#46176212bd9c3e5f48aa4b8b4868786726c41d36" - integrity sha512-f1KYNPtqYLUeZGCHQPKzzFtsHaRuECe6jLakf/RjSRqvF5XHLZnM2+fXLhb8Qh/HBFHs3M4cSLb1k3B899RYIg== +postcss-discard-comments@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.0.tgz#3919e4237630f74927f3976ac5789cfc26731494" + integrity sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA== -postcss-discard-duplicates@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.1.tgz#112b1a95948e69b3484fdd43584dda6930977939" - integrity sha512-1hvUs76HLYR8zkScbwyJ8oJEugfPV+WchpnA+26fpJ7Smzs51CzGBHC32RS03psuX/2l0l0UKh2StzNxOrKCYg== +postcss-discard-duplicates@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.0.tgz#47ae1154cc89ad0a50099fbac1f74c942214c961" + integrity sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw== -postcss-discard-empty@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-6.0.1.tgz#b34cb45ec891246da4506b53e352390fdef126c4" - integrity sha512-yitcmKwmVWtNsrrRqGJ7/C0YRy53i0mjexBDQ9zYxDwTWVBgbU4+C9jIZLmQlTDT9zhml+u0OMFJh8+31krmOg== +postcss-discard-empty@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz#218829d1ef0a5d5142dd62f0aa60e00e599d2033" + integrity sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA== -postcss-discard-overridden@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.1.tgz#c63c559237758d74bc505452393a64dda9b19ef4" - integrity sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA== +postcss-discard-overridden@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz#b123ea51e3d4e1d0a254cf71eaff1201926d319c" + integrity sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w== postcss-double-position-gradients@^5.0.4: version "5.0.4" @@ -9428,55 +9421,55 @@ postcss-media-query-parser@^0.2.3: resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== -postcss-merge-longhand@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.2.tgz#cd4e83014851da59545e9a906b245615550f4064" - integrity sha512-+yfVB7gEM8SrCo9w2lCApKIEzrTKl5yS1F4yGhV3kSim6JzbfLGJyhR1B6X+6vOT0U33Mgx7iv4X9MVWuaSAfw== +postcss-merge-longhand@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.0.tgz#aabfae74428a5506c4d50842445845c1cc10c9c6" + integrity sha512-0X8I4/9+G03X5/5NnrfopG/YEln2XU8heDh7YqBaiq2SeaKIG3n66ShZPjIolmVuLBQ0BEm3yS8o1mlCLHdW7A== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^6.0.2" + stylehacks "^7.0.0" -postcss-merge-rules@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.3.tgz#08fcf714faaad75b1980ecd961b080ae2f8ddeb3" - integrity sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA== +postcss-merge-rules@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.0.tgz#069a427807fdb1e2dcca3bf218d0a9f70103526a" + integrity sha512-Zty3VlOsD6VSjBMu6PiHCVpLegtBT/qtZRVBcSeyEZ6q1iU5qTYT0WtEoLRV+YubZZguS5/ycfP+NRiKfjv6aw== dependencies: - browserslist "^4.22.2" + browserslist "^4.23.0" caniuse-api "^3.0.0" - cssnano-utils "^4.0.1" - postcss-selector-parser "^6.0.15" + cssnano-utils "^5.0.0" + postcss-selector-parser "^6.0.16" -postcss-minify-font-values@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-6.0.1.tgz#788eb930168be90225f3937f0b70aa19d8b532b2" - integrity sha512-tIwmF1zUPoN6xOtA/2FgVk1ZKrLcCvE0dpZLtzyyte0j9zUeB8RTbCqrHZGjJlxOvNWKMYtunLrrl7HPOiR46w== +postcss-minify-font-values@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz#d16a75a2548e000779566b3568fc874ee5d0aa17" + integrity sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog== dependencies: postcss-value-parser "^4.2.0" -postcss-minify-gradients@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-6.0.1.tgz#4faf1880b483dc37016658aa186b42194ff9b5bc" - integrity sha512-M1RJWVjd6IOLPl1hYiOd5HQHgpp6cvJVLrieQYS9y07Yo8itAr6jaekzJphaJFR0tcg4kRewCk3kna9uHBxn/w== +postcss-minify-gradients@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz#f6d84456e6d49164a55d0e45bb1b1809c6cf0959" + integrity sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg== dependencies: - colord "^2.9.1" - cssnano-utils "^4.0.1" + colord "^2.9.3" + cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.2.tgz#bd64af642fa5610281b8a9461598bbb91f92ae05" - integrity sha512-zwQtbrPEBDj+ApELZ6QylLf2/c5zmASoOuA4DzolyVGdV38iR2I5QRMsZcHkcdkZzxpN8RS4cN7LPskOkTwTZw== +postcss-minify-params@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.0.tgz#dfa8263d38570b1116da2c72f69190ea665b17aa" + integrity sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ== dependencies: - browserslist "^4.22.2" - cssnano-utils "^4.0.1" + browserslist "^4.23.0" + cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.2.tgz#62065b38d3453ddc6627ba50e4f4a2154b031aa0" - integrity sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg== +postcss-minify-selectors@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.0.tgz#5dedb26806f58d683a3bb362e095ad5aa24f1bf6" + integrity sha512-f00CExZhD6lNw2vTZbcnmfxVgaVKzUw6IRsIFX3JTT8GdsoABc1WnhhGwL1i8YPJ3sSWw39fv7XPtvLb+3Uitw== dependencies: - postcss-selector-parser "^6.0.15" + postcss-selector-parser "^6.0.16" postcss-mixins@^10.0.0: version "10.0.0" @@ -9531,65 +9524,65 @@ postcss-nesting@^12.0.3: "@csstools/selector-specificity" "^3.0.2" postcss-selector-parser "^6.0.13" -postcss-normalize-charset@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.1.tgz#5f70e1eb8bbdbcfcbed060ef70f179e8fef57d0c" - integrity sha512-aW5LbMNRZ+oDV57PF9K+WI1Z8MPnF+A8qbajg/T8PP126YrGX1f9IQx21GI2OlGz7XFJi/fNi0GTbY948XJtXg== +postcss-normalize-charset@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz#92244ae73c31bf8f8885d5f16ff69e857ac6c001" + integrity sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ== -postcss-normalize-display-values@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.1.tgz#ff9aa30bbf1283294bfd9cc8b6fb81ff060a7f2d" - integrity sha512-mc3vxp2bEuCb4LgCcmG1y6lKJu1Co8T+rKHrcbShJwUmKJiEl761qb/QQCfFwlrvSeET3jksolCR/RZuMURudw== +postcss-normalize-display-values@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz#01fb50e5e97ef8935363629bea5a6d3b3aac1342" + integrity sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-6.0.1.tgz#41ffdc72994f024c6cd6e91dbfb40ab9abe6fe90" - integrity sha512-HRsq8u/0unKNvm0cvwxcOUEcakFXqZ41fv3FOdPn916XFUrympjr+03oaLkuZENz3HE9RrQE9yU0Xv43ThWjQg== +postcss-normalize-positions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz#4eebd7c9d3dde40c97b8047cad38124fc844c463" + integrity sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.1.tgz#55dc54b6f80305b280a379899a6626e0a07b04a8" - integrity sha512-Gbb2nmCy6tTiA7Sh2MBs3fj9W8swonk6lw+dFFeQT68B0Pzwp1kvisJQkdV6rbbMSd9brMlS8I8ts52tAGWmGQ== +postcss-normalize-repeat-style@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz#0cb784655d5714d29bd3bda6dee2fb628aa7227b" + integrity sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-string@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-6.0.1.tgz#7605e0fb4ec7bf2709709991d13a949e4419db1d" - integrity sha512-5Fhx/+xzALJD9EI26Aq23hXwmv97Zfy2VFrt5PLT8lAhnBIZvmaT5pQk+NuJ/GWj/QWaKSKbnoKDGLbV6qnhXg== +postcss-normalize-string@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz#a119d3e63a9614570d8413d572fb9fc8c6a64e8c" + integrity sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.1.tgz#ef937b7ca2fd62ed0b46645ea5728b842a3600db" - integrity sha512-4zcczzHqmCU7L5dqTB9rzeqPWRMc0K2HoR+Bfl+FSMbqGBUcP5LRfgcH4BdRtLuzVQK1/FHdFoGT3F7rkEnY+g== +postcss-normalize-timing-functions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz#99d0ee8c4b23b7f4355fafb91385833b9b07108b" + integrity sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.2.tgz#361026744ff11baebaec771b60c2a5f36f274fd0" - integrity sha512-Ff2VdAYCTGyMUwpevTZPZ4w0+mPjbZzLLyoLh/RMpqUqeQKZ+xMm31hkxBavDcGKcxm6ACzGk0nBfZ8LZkStKA== +postcss-normalize-unicode@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.0.tgz#bd66bfc238bf4d1eaea356639260c04fce408476" + integrity sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w== dependencies: - browserslist "^4.22.2" + browserslist "^4.23.0" postcss-value-parser "^4.2.0" -postcss-normalize-url@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-6.0.1.tgz#eae58cb4f5f9a4fa5bbbf6d4222dff534ad46186" - integrity sha512-jEXL15tXSvbjm0yzUV7FBiEXwhIa9H88JOXDGQzmcWoB4mSjZIsmtto066s2iW9FYuIrIF4k04HA2BKAOpbsaQ== +postcss-normalize-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz#c88cb7cf8952d3ff631e4eba924e7b060ca802f6" + integrity sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.1.tgz#b5933750b938814c028d3d2b2e5c0199e0037b53" - integrity sha512-76i3NpWf6bB8UHlVuLRxG4zW2YykF9CTEcq/9LGAiz2qBuX5cBStadkk0jSkg9a9TCIXbMQz7yzrygKoCW9JuA== +postcss-normalize-whitespace@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz#46b025f0bea72139ddee63015619b0c21cebd845" + integrity sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ== dependencies: postcss-value-parser "^4.2.0" @@ -9598,12 +9591,12 @@ postcss-opacity-percentage@^2.0.0: resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz#c0a56060cd4586e3f954dbde1efffc2deed53002" integrity sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ== -postcss-ordered-values@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.1.tgz#553e735d009065b362da93340e57f43d5f2d0fbc" - integrity sha512-XXbb1O/MW9HdEhnBxitZpPFbIvDgbo9NK4c/5bOfiKpnIGZDoL2xd7/e6jW5DYLsWxBbs+1nZEnVgnjnlFViaA== +postcss-ordered-values@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.0.tgz#cea4e2a140ed1c7b055e0ab967b82a36b584debf" + integrity sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w== dependencies: - cssnano-utils "^4.0.1" + cssnano-utils "^5.0.0" postcss-value-parser "^4.2.0" postcss-overflow-shorthand@^5.0.1: @@ -9698,18 +9691,18 @@ postcss-pseudo-class-any-link@^9.0.1: dependencies: postcss-selector-parser "^6.0.13" -postcss-reduce-initial@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.2.tgz#763d25902406c872264041df69f182eb15a5d9be" - integrity sha512-YGKalhNlCLcjcLvjU5nF8FyeCTkCO5UtvJEt0hrPZVCTtRLSOH4z00T1UntQPj4dUmIYZgMj8qK77JbSX95hSw== +postcss-reduce-initial@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.0.tgz#a9e64778dd44604c2bda109e2fd14b99ab0d1416" + integrity sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ== dependencies: - browserslist "^4.22.2" + browserslist "^4.23.0" caniuse-api "^3.0.0" -postcss-reduce-transforms@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.1.tgz#7bf59d7c6e7066e3b18ef17237d2344bd3da6d75" - integrity sha512-fUbV81OkUe75JM+VYO1gr/IoA2b/dRiH6HvMwhrIBSUrxq3jNZQZitSnugcTLDi1KkQh1eR/zi+iyxviUNBkcQ== +postcss-reduce-transforms@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz#0386080a14e5faad9f8eda33375b79fe7c4f9677" + integrity sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew== dependencies: postcss-value-parser "^4.2.0" @@ -9769,20 +9762,20 @@ postcss-simple-vars@^7.0.1: resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz#836b3097a54dcd13dbd3c36a5dbdd512fad2954c" integrity sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A== -postcss-svgo@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.2.tgz#dbc9d03e7f346bc0d82443078602a951e0214836" - integrity sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ== +postcss-svgo@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.0.0.tgz#2f11b45c6fa42da155fd7c16c44e69bf086c5992" + integrity sha512-Xj5DRdvA97yRy3wjbCH2NKXtDUwEnph6EHr5ZXszsBVKCNrKXYBjzAXqav7/Afz5WwJ/1peZoTguCEJIg7ytmA== dependencies: postcss-value-parser "^4.2.0" svgo "^3.2.0" -postcss-unique-selectors@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.2.tgz#09a34a5a31a649d3e9bca5962af0616f39d071d2" - integrity sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ== +postcss-unique-selectors@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.0.tgz#8cc2f919bce33c429cce93624f2b8f9bbd4bd882" + integrity sha512-NYFqcft7vVQMZlQPsMdMPy+qU/zDpy95Malpw4GeA9ZZjM6dVXDshXtDmLc0m4WCD6XeZCJqjTfPT1USsdt+rA== dependencies: - postcss-selector-parser "^6.0.15" + postcss-selector-parser "^6.0.16" postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" @@ -11041,13 +11034,13 @@ style-loader@4: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-4.0.0.tgz#0ea96e468f43c69600011e0589cb05c44f3b17a5" integrity sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA== -stylehacks@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.2.tgz#5bf2654561752547d4548765f35c9a49659b3742" - integrity sha512-00zvJGnCu64EpMjX8b5iCZ3us2Ptyw8+toEkb92VdmkEaRaSGBNKAoK6aWZckhXxmQP8zWiTaFaiMGIU8Ve8sg== +stylehacks@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.0.tgz#68e8ee54724671c0c698be82e1299c6548c31921" + integrity sha512-47Nw4pQ6QJb4CA6dzF2m9810sjQik4dfk4UwAm5wlwhrW3syzZKF8AR4/cfO3Cr6lsFgAoznQq0Wg57qhjTA2A== dependencies: - browserslist "^4.22.2" - postcss-selector-parser "^6.0.15" + browserslist "^4.23.0" + postcss-selector-parser "^6.0.16" stylelint-config-recommended@^14.0.0: version "14.0.0" From 59592f84fb4903de60d4c84d45d8a4dbfc6c9748 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 10:26:28 +0000 Subject: [PATCH 06/36] Update dependency eslint-plugin-unicorn to v53 --- package.json | 2 +- yarn.lock | 67 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index f2ad032451..775ac98ce0 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,7 @@ "eslint-plugin-matrix-org": "^1.0.0", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-unicorn": "^52.0.0", + "eslint-plugin-unicorn": "^53.0.0", "fake-indexeddb": "^5.0.0", "fetch-mock": "9.11.0", "fetch-mock-jest": "^1.5.1", diff --git a/yarn.lock b/yarn.lock index f6b8fd6425..54ee11341b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1731,6 +1731,21 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.0.2.tgz#36180f8e85bf34d2fe3ccc2261e8e204a411ab4e" + integrity sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" @@ -3775,7 +3790,7 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: +acorn@^8.0.4, acorn@^8.11.3, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -4734,12 +4749,12 @@ core-js-compat@^3.31.0, core-js-compat@^3.36.1: dependencies: browserslist "^4.23.0" -core-js-compat@^3.34.0: - version "3.36.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.36.0.tgz#087679119bc2fdbdefad0d45d8e5d307d45ba190" - integrity sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw== +core-js-compat@^3.37.0: + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== dependencies: - browserslist "^4.22.3" + browserslist "^4.23.0" core-js@^3.0.0: version "3.33.0" @@ -5922,17 +5937,17 @@ eslint-plugin-react@^7.28.0: semver "^6.3.1" string.prototype.matchall "^4.0.10" -eslint-plugin-unicorn@^52.0.0: - version "52.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-52.0.0.tgz#c7a559edd52e3932cf2b3a05c3b0efc604c1eeb8" - integrity sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng== +eslint-plugin-unicorn@^53.0.0: + version "53.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz#df3a5c9ecabeb759e6fd867b2d84198466ac8c4d" + integrity sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw== dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.24.5" "@eslint-community/eslint-utils" "^4.4.0" - "@eslint/eslintrc" "^2.1.4" + "@eslint/eslintrc" "^3.0.2" ci-info "^4.0.0" clean-regexp "^1.0.0" - core-js-compat "^3.34.0" + core-js-compat "^3.37.0" esquery "^1.5.0" indent-string "^4.0.0" is-builtin-module "^3.2.1" @@ -5941,7 +5956,7 @@ eslint-plugin-unicorn@^52.0.0: read-pkg-up "^7.0.1" regexp-tree "^0.1.27" regjsparser "^0.10.0" - semver "^7.5.4" + semver "^7.6.1" strip-indent "^3.0.0" eslint-rule-composer@^0.3.0: @@ -5975,6 +5990,11 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz#e3adc021aa038a2a8e0b2f8b0ce8f66b9483b1fb" + integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw== + eslint@8.57.0: version "8.57.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" @@ -6019,6 +6039,15 @@ eslint@8.57.0: strip-ansi "^6.0.1" text-table "^0.2.0" +espree@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.0.1.tgz#600e60404157412751ba4a6f3a2ee1a42433139f" + integrity sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww== + dependencies: + acorn "^8.11.3" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.0.0" + espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" @@ -6617,6 +6646,11 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -10571,6 +10605,11 @@ semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: dependencies: lru-cache "^6.0.0" +semver@^7.6.1: + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" From 575a7263619a00af14b8742f5ca8e0c4596ef525 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 15 May 2024 15:51:11 +0100 Subject: [PATCH 07/36] Add missing @types/semver dev dep Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index f2ad032451..07a1d8dfb0 100644 --- a/package.json +++ b/package.json @@ -133,6 +133,7 @@ "@types/react-transition-group": "^4.4.9", "@types/sanitize-html": "^2.9.5", "@types/sdp-transform": "^2.4.9", + "@types/semver": "^7.5.8", "@types/tar-js": "^0.3.5", "@types/ua-parser-js": "^0.7.36", "@types/uuid": "^9.0.7", From 18bfe3cb431e3e810f0a1362e2b39e8bb4812590 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 22 May 2024 12:21:41 +0000 Subject: [PATCH 08/36] Reset matrix-react-sdk back to develop branch --- package.json | 2 +- yarn.lock | 134 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 96 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index 849fb2f44d..960da2aa25 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "32.4.0", - "matrix-react-sdk": "3.100.0-rc.0", + "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 26177b81f6..a27d233322 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2195,10 +2195,10 @@ resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== -"@matrix-org/analytics-events@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.20.0.tgz#062a532ddcf0e2e5eb64c5576cd212cb32a11ccf" - integrity sha512-YCRbZrpZU9q+nrB6RsfPZ4NlKs31ySjP2F7GFUZNPKv96GcbihrnMK086td480SJOYpjPv2vttDJC+S67SFe2w== +"@matrix-org/analytics-events@^0.21.0": + version "0.21.0" + resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.21.0.tgz#1de19a6a765f179c01199e72c9c461dc7120fe1a" + integrity sha512-K0E9eje03o3pYc8C93XFTu6DTgNdsVNvdkH7rsFGiHkc15WQybKFyHR7quuuV42jrzGINWpFou0faCWcDBdNbQ== "@matrix-org/emojibase-bindings@^1.1.2": version "1.1.3" @@ -3556,10 +3556,10 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^4.2.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.3.0.tgz#7725dec55f738aa0ccaf3c790b57b36955b90d6a" - integrity sha512-AH8TdmkteR5VL4HgHq+p3H1NngOUJhkhiHr+hb9H0dB35vWNPhs5R3edyzFZhWMWWsJ2E8jhiXf/NqdGh/k4jg== +"@vector-im/compound-web@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.3.1.tgz#4570adeccdfcac6919256c5e399d592510bdb15d" + integrity sha512-/Sw27GI0jCg6A7E+93SWFyF3pEwLyLzExB3lIVPTY0mMTx50+rZloRuhuqftUlIscWSlmAUex8Lo4WK8WKPFPA== dependencies: "@floating-ui/react" "^0.26.9" "@floating-ui/react-dom" "^2.0.8" @@ -4201,6 +4201,11 @@ base-x@^4.0.0: resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -4226,6 +4231,21 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bloom-filters@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/bloom-filters/-/bloom-filters-3.0.1.tgz#13e28ed22febe2489cd00ba5bd98fdc90e820180" + integrity sha512-rU9IU6bgZ1jmqcLWhlKSidrFjbIGjB89CJBsQqUj1+3/11tAJDwn+f7iRu4bbQ2srTjGgNeoWNwcnelumqdi0g== + dependencies: + base64-arraybuffer "^1.0.2" + is-buffer "^2.0.5" + lodash "^4.17.15" + lodash.eq "^4.0.0" + lodash.indexof "^4.0.5" + long "^5.2.0" + reflect-metadata "^0.1.13" + seedrandom "^3.0.5" + xxhashjs "^0.2.2" + blurhash@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-2.0.5.tgz#efde729fc14a2f03571a6aa91b49cba80d1abe4b" @@ -5062,6 +5082,11 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== + data-urls@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" @@ -6323,10 +6348,10 @@ file@^0.2.2: resolved "https://registry.yarnpkg.com/file/-/file-0.2.2.tgz#c3dfd8f8cf3535ae455c2b423c2e52635d76b4d3" integrity sha512-gwabMtChzdnpDJdPEpz8Vr/PX0pU85KailuPV71Zw/un5yJVKvzukhB3qf6O3lnTwIe5CxlMYLh3jOK3w5xrLA== -filesize@10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.1.tgz#eb98ce885aa73741199748e70e5b7339cc22c5ff" - integrity sha512-L0cdwZrKlwZQkMSFnCflJ6J2Y+5egO/p3vgRSDQGxQt++QbUZe5gMbRO6kg6gzwQDPvq2Fk9AmoxUNfZ5gdqaQ== +filesize@10.1.2: + version "10.1.2" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.2.tgz#33bb71c5c134102499f1bc36e6f2863137f6cb0c" + integrity sha512-Dx770ai81ohflojxhU+oG+Z2QGvKdYxgEr9OSA8UVrqhwNHjfH9A8f5NKfg83fEH8ZFA5N5llJo5T3PIoZ4CRA== fill-range@^7.0.1: version "7.0.1" @@ -7124,6 +7149,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-builtin-module@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" @@ -8196,6 +8226,16 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.eq@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/lodash.eq/-/lodash.eq-4.0.0.tgz#a39f06779e72f9c0d1f310c90cd292c1661d5035" + integrity sha512-vbrJpXL6kQNG6TkInxX12DZRfuYVllSxhwYqjYB78g2zF3UI15nFO/0AgmZnZRnaQ38sZtjCiVjGr2rnKt4v0g== + +lodash.indexof@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/lodash.indexof/-/lodash.indexof-4.0.5.tgz#53714adc2cddd6ed87638f893aa9b6c24e31ef3c" + integrity sha512-t9wLWMQsawdVmf6/IcAgVGqAJkNzYVcn4BHYZKTPW//l7N5Oq7Bq138BaVk19agcsPZePcidSgTTw4NqS1nUAw== + lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -8226,7 +8266,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8236,6 +8276,11 @@ loglevel@^1.7.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.1.tgz#d63976ac9bcd03c7c873116d41c2a85bafff1be7" integrity sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg== +long@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8357,10 +8402,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@32.3.0-rc.0: - version "32.3.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.3.0-rc.0.tgz#31f8281420db91a4a60b5bd4a1336771e466e560" - integrity sha512-WssOMKp7yDjpIBEW/nCVYgzLl5ndpti3ZxvLgg1yetjsFN89HMp7Kbd+3sWYMfkqUvIyTM6i4dDtHsnvYLDZ7Q== +matrix-js-sdk@32.4.0: + version "32.4.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.4.0.tgz#2a308e158a8dc2ccdfc14ae6c655c4059ea27bbd" + integrity sha512-mzWfF4rJaTFLDfkedqP2jh/i1v5pv6xRHPkAQLn1ytXi72TFKLlKQmjaNUXfQYkmriIYnGYYQwBXQeJgwaT8SQ== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" @@ -8377,10 +8422,9 @@ matrix-js-sdk@32.3.0-rc.0: unhomoglyph "^1.0.6" uuid "9" -matrix-js-sdk@32.4.0: +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "32.4.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.4.0.tgz#2a308e158a8dc2ccdfc14ae6c655c4059ea27bbd" - integrity sha512-mzWfF4rJaTFLDfkedqP2jh/i1v5pv6xRHPkAQLn1ytXi72TFKLlKQmjaNUXfQYkmriIYnGYYQwBXQeJgwaT8SQ== + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/a49bc3ddf4a8ba8566172da11602d4cbba7d5230" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" @@ -8404,13 +8448,12 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.100.0-rc.0: - version "3.100.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.100.0-rc.0.tgz#d787fa529e959b030409e37ee2be47906639534f" - integrity sha512-I2BLZTYAep39wtkuY5VV7dvfiD/RWYQM2RMrcv9sPVIbeEaZDcVbzX74qvUw7WmEOziAgeBd9nDCz57dTfP/vA== +"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop": + version "3.99.0" + resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/a29cabe45a531448ae6dc1cca6803097de70d680" dependencies: "@babel/runtime" "^7.12.5" - "@matrix-org/analytics-events" "^0.20.0" + "@matrix-org/analytics-events" "^0.21.0" "@matrix-org/emojibase-bindings" "^1.1.2" "@matrix-org/matrix-wysiwyg" "2.17.0" "@matrix-org/olm" "3.2.15" @@ -8419,11 +8462,12 @@ matrix-react-sdk@3.100.0-rc.0: "@sentry/browser" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" "@vector-im/compound-design-tokens" "^1.2.0" - "@vector-im/compound-web" "^4.2.0" + "@vector-im/compound-web" "^4.3.1" "@zxcvbn-ts/core" "^3.0.4" "@zxcvbn-ts/language-common" "^3.0.4" "@zxcvbn-ts/language-en" "^3.0.2" await-lock "^2.1.0" + bloom-filters "^3.0.1" blurhash "^2.0.3" classnames "^2.2.6" commonmark "^0.31.0" @@ -8433,7 +8477,7 @@ matrix-react-sdk@3.100.0-rc.0: emojibase-regex "15.3.0" escape-html "^1.0.3" file-saver "^2.0.5" - filesize "10.1.1" + filesize "10.1.2" gfm.css "^1.1.2" glob-to-regexp "^0.4.1" graphemer "^1.4.0" @@ -8451,7 +8495,7 @@ matrix-react-sdk@3.100.0-rc.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "32.3.0-rc.0" + matrix-js-sdk "github:matrix-org/matrix-js-sdk#develop" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" @@ -8459,7 +8503,7 @@ matrix-react-sdk@3.100.0-rc.0: opus-recorder "^8.0.3" pako "^2.0.3" png-chunks-extract "^1.0.0" - posthog-js "1.130.1" + posthog-js "1.131.4" proposal-temporal "^0.9.0" qrcode "1.5.3" re-resizable "^6.9.0" @@ -9866,10 +9910,10 @@ postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" -posthog-js@1.130.1: - version "1.130.1" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.130.1.tgz#e8d037043f801d438f785f441843cce7d8af7ec3" - integrity sha512-BC283kxeJnVIeAxn7ZPHf5sCTA6oXs4uvo9fdGAsbKwwfmF9g09rnJOOaoF95J/auf8HT4YB6Vt2KytqtJD44w== +posthog-js@1.131.4: + version "1.131.4" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.131.4.tgz#b29de94a26132e7cb5abcc16c7b57fd6d918e277" + integrity sha512-pKa1p6Q9jRU6s+xSluqGifODMncWTXRaeQw7yVet5U+0U56P0srdMO8NpzllIgDjYL9WLgUjDInucOBw5Cl/tA== dependencies: fflate "^0.4.8" preact "^10.19.3" @@ -10285,6 +10329,11 @@ redux@^4.0.0, redux@^4.0.4: dependencies: "@babel/runtime" "^7.9.2" +reflect-metadata@^0.1.13: + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== + reflect.getprototypeof@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" @@ -10591,6 +10640,11 @@ sdp-transform@^2.14.1: resolved "https://registry.yarnpkg.com/sdp-transform/-/sdp-transform-2.14.2.tgz#d2cee6a1f7abe44e6332ac6cbb94e8600f32d813" integrity sha512-icY6jVao7MfKCieyo1AyxFYm1baiM+fA00qW/KrNNVlkxHAd34riEKuEkUe4bBb3gJwLJZM+xT60Yj1QL8rHiA== +seedrandom@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -10614,12 +10668,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -semver@^7.6.1: +semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.1: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== @@ -12212,6 +12261,13 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xxhashjs@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" + integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== + dependencies: + cuint "^0.2.2" + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" From 153d0c36b88df41b0063284181853ccb92a5a310 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 22 May 2024 12:21:51 +0000 Subject: [PATCH 09/36] Reset matrix-js-sdk back to develop branch --- package.json | 2 +- yarn.lock | 20 -------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/package.json b/package.json index 960da2aa25..44e082b1e2 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "32.4.0", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index a27d233322..ae16d1b322 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8402,26 +8402,6 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@32.4.0: - version "32.4.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-32.4.0.tgz#2a308e158a8dc2ccdfc14ae6c655c4059ea27bbd" - integrity sha512-mzWfF4rJaTFLDfkedqP2jh/i1v5pv6xRHPkAQLn1ytXi72TFKLlKQmjaNUXfQYkmriIYnGYYQwBXQeJgwaT8SQ== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "32.4.0" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/a49bc3ddf4a8ba8566172da11602d4cbba7d5230" From 67e78a56a6945025470b998169ea3329402cdcb3 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 29 May 2024 12:56:23 +0000 Subject: [PATCH 10/36] Upgrade dependency to matrix-js-sdk@33.0.0-rc.0 --- package.json | 2 +- yarn.lock | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 44e082b1e2..ff5e83f7cd 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "33.0.0-rc.0", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index ae16d1b322..ceb9cf2217 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2213,6 +2213,11 @@ resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-4.9.0.tgz#9dfed83e33f760650596c4e5c520e5e4c53355d2" integrity sha512-/bgA4QfE7qkK6GFr9hnhjAvRSebGrmEJxukU0ukbudZcYvbzymoBBM8j3HeULXZT8kbw8WH6z63txYTMCBSDOA== +"@matrix-org/matrix-sdk-crypto-wasm@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-5.0.0.tgz#f45a7bccaad218c05bcf9e7c8ca783c9d9a07af4" + integrity sha512-37ASjCKSTU5ycGfkP+LUXG4Ok6OAf6vE+1qU6uwWhe6FwadCS3vVWzJYd/3d9BQFwsx4GhFTIAXrW4iLG85rmQ== + "@matrix-org/matrix-wysiwyg@2.17.0": version "2.17.0" resolved "https://registry.yarnpkg.com/@matrix-org/matrix-wysiwyg/-/matrix-wysiwyg-2.17.0.tgz#68c83da17826fb43828f0c1ddd8d6e0b9d155ae5" @@ -8402,6 +8407,26 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== +matrix-js-sdk@33.0.0-rc.0: + version "33.0.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.0.0-rc.0.tgz#f4d5d2148669edeadc870245850c17a88c826251" + integrity sha512-QpciVF6ZOYgTjnR+Og0LvVivGfSube4vmF9qGcdRvqmwc3xK0w5pFW2D8y/pZdzQ8gYfD/LGIG9GkbtW3TrYKA== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "32.4.0" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/a49bc3ddf4a8ba8566172da11602d4cbba7d5230" From e6c0b8d8e55cdf71107393b70eb4061bb7688511 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 29 May 2024 13:09:48 +0000 Subject: [PATCH 11/36] Upgrade dependency to matrix-react-sdk@3.100.0-rc.1 --- package.json | 2 +- yarn.lock | 33 +++++---------------------------- 2 files changed, 6 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index ff5e83f7cd..7cbfdf3375 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "33.0.0-rc.0", - "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", + "matrix-react-sdk": "3.100.0-rc.1", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index ceb9cf2217..d419a20789 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2208,11 +2208,6 @@ emojibase "^15.0.0" emojibase-data "^15.0.0" -"@matrix-org/matrix-sdk-crypto-wasm@^4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-4.9.0.tgz#9dfed83e33f760650596c4e5c520e5e4c53355d2" - integrity sha512-/bgA4QfE7qkK6GFr9hnhjAvRSebGrmEJxukU0ukbudZcYvbzymoBBM8j3HeULXZT8kbw8WH6z63txYTMCBSDOA== - "@matrix-org/matrix-sdk-crypto-wasm@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-5.0.0.tgz#f45a7bccaad218c05bcf9e7c8ca783c9d9a07af4" @@ -8427,25 +8422,6 @@ matrix-js-sdk@33.0.0-rc.0: unhomoglyph "^1.0.6" uuid "9" -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "32.4.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/a49bc3ddf4a8ba8566172da11602d4cbba7d5230" - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^4.9.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8453,9 +8429,10 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop": - version "3.99.0" - resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/a29cabe45a531448ae6dc1cca6803097de70d680" +matrix-react-sdk@3.100.0-rc.1: + version "3.100.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.100.0-rc.1.tgz#fac7ec2583ef1e6f84387c2507827d54cc7b028e" + integrity sha512-muJ0Ztb0Rig9dzCx2In/Kr4aVGeNdd6qK2izOqcXw5s5O7dNkY3S8zAqkAd/SPOKR/pyAYkb+GnXcilSPyqqYQ== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.21.0" @@ -8500,7 +8477,7 @@ matrix-mock-request@^2.5.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "github:matrix-org/matrix-js-sdk#develop" + matrix-js-sdk "33.0.0-rc.0" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" From fd62e04bc0f021ba3cd76c24681190889392446c Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 29 May 2024 13:21:52 +0000 Subject: [PATCH 12/36] v1.11.68-rc.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7cbfdf3375..d36b7591ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.67", + "version": "1.11.68-rc.0", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From a0ae97c2e3482a8348d4e42d24d0d1e0cd25b3e5 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 4 Jun 2024 13:20:13 +0000 Subject: [PATCH 13/36] Upgrade dependency to matrix-js-sdk@33.0.0 --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d36b7591ca..12b5a0e091 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "33.0.0-rc.0", + "matrix-js-sdk": "33.0.0", "matrix-react-sdk": "3.100.0-rc.1", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index d419a20789..869c10fbe7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8402,6 +8402,26 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== +matrix-js-sdk@33.0.0: + version "33.0.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.0.0.tgz#556c20b4ee0b1b7f59a98d126fdce3818c6ecfc4" + integrity sha512-uv2Mx4j9hw1E+98wi7KUKn04+3jCaMM1BnLp7k8hkL1dQyibHTzB8evlR6idzatPChxgdTSeD+zTUesYy3i9gw== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + matrix-js-sdk@33.0.0-rc.0: version "33.0.0-rc.0" resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.0.0-rc.0.tgz#f4d5d2148669edeadc870245850c17a88c826251" From cb9eccebed6c5db1c258afd04d8da6b5825cd26c Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 4 Jun 2024 13:30:29 +0000 Subject: [PATCH 14/36] Upgrade dependency to matrix-react-sdk@3.100.0 --- package.json | 2 +- yarn.lock | 30 +++++------------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 12b5a0e091..2736d4f93f 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "33.0.0", - "matrix-react-sdk": "3.100.0-rc.1", + "matrix-react-sdk": "3.100.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 869c10fbe7..a166936326 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8422,26 +8422,6 @@ matrix-js-sdk@33.0.0: unhomoglyph "^1.0.6" uuid "9" -matrix-js-sdk@33.0.0-rc.0: - version "33.0.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.0.0-rc.0.tgz#f4d5d2148669edeadc870245850c17a88c826251" - integrity sha512-QpciVF6ZOYgTjnR+Og0LvVivGfSube4vmF9qGcdRvqmwc3xK0w5pFW2D8y/pZdzQ8gYfD/LGIG9GkbtW3TrYKA== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8449,10 +8429,10 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.100.0-rc.1: - version "3.100.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.100.0-rc.1.tgz#fac7ec2583ef1e6f84387c2507827d54cc7b028e" - integrity sha512-muJ0Ztb0Rig9dzCx2In/Kr4aVGeNdd6qK2izOqcXw5s5O7dNkY3S8zAqkAd/SPOKR/pyAYkb+GnXcilSPyqqYQ== +matrix-react-sdk@3.100.0: + version "3.100.0" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.100.0.tgz#1432003db2191120afff793455a26e78befd0ce6" + integrity sha512-qkBrcprusnQvSxVR2izru3NRmGVZ5CDKR9AFlby8HFOqKJQevFVYjcSIwTDRlr9utdkCbvp3sBWy+XfDDAgcxw== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.21.0" @@ -8497,7 +8477,7 @@ matrix-react-sdk@3.100.0-rc.1: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "33.0.0-rc.0" + matrix-js-sdk "33.0.0" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" From 30f964447fe6c27954f68c0f934ab30023f04675 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 4 Jun 2024 13:35:16 +0000 Subject: [PATCH 15/36] v1.11.68 --- CHANGELOG.md | 21 +++++++++++++++++++++ package.json | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 321acf18ed..585211fdd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +Changes in [1.11.68](https://github.com/element-hq/element-web/releases/tag/v1.11.68) (2024-06-04) +================================================================================================== +## ✨ Features + +* Tooltip: Improve accessibility for context menus ([#12462](https://github.com/matrix-org/matrix-react-sdk/pull/12462)). Contributed by @florianduros. +* Tooltip: Improve accessibility of space panel ([#12525](https://github.com/matrix-org/matrix-react-sdk/pull/12525)). Contributed by @florianduros. + +## 🐛 Bug Fixes + +* Close the release announcement when a dialog is opened ([#12559](https://github.com/matrix-org/matrix-react-sdk/pull/12559)). Contributed by @florianduros. +* Tooltip: close field tooltip when ESC is pressed ([#12553](https://github.com/matrix-org/matrix-react-sdk/pull/12553)). Contributed by @florianduros. +* Fix tabbedview breakpoint width ([#12556](https://github.com/matrix-org/matrix-react-sdk/pull/12556)). Contributed by @dbkr. +* Fix E2E icon display in room header ([#12545](https://github.com/matrix-org/matrix-react-sdk/pull/12545)). Contributed by @florianduros. +* Tooltip: Improve placement for space settings ([#12541](https://github.com/matrix-org/matrix-react-sdk/pull/12541)). Contributed by @florianduros. +* Fix deformed avatar in a call in a narrow timeline ([#12538](https://github.com/matrix-org/matrix-react-sdk/pull/12538)). Contributed by @florianduros. +* Shown own sent state indicator even when showReadReceipts is disabled ([#12540](https://github.com/matrix-org/matrix-react-sdk/pull/12540)). Contributed by @t3chguy. +* Ensure we do not fire the verification mismatch modal multiple times ([#12526](https://github.com/matrix-org/matrix-react-sdk/pull/12526)). Contributed by @t3chguy. +* Fix avatar in chat export ([#12537](https://github.com/matrix-org/matrix-react-sdk/pull/12537)). Contributed by @florianduros. +* Use `*` for italics as it doesn't break when used mid-word ([#12523](https://github.com/matrix-org/matrix-react-sdk/pull/12523)). Contributed by @t3chguy. + + Changes in [1.11.67](https://github.com/element-hq/element-web/releases/tag/v1.11.67) (2024-05-22) ================================================================================================== ## ✨ Features diff --git a/package.json b/package.json index 2736d4f93f..0eb5e4c470 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.68-rc.0", + "version": "1.11.68", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From e193f57ac77f8507d6b2f67f1d1b640afc20d1dd Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 4 Jun 2024 13:38:20 +0000 Subject: [PATCH 16/36] Reset matrix-react-sdk back to develop branch --- package.json | 2 +- yarn.lock | 36 +++++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 0eb5e4c470..c2637d0cef 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "33.0.0", - "matrix-react-sdk": "3.100.0", + "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index a166936326..c57c7e8eb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8422,6 +8422,25 @@ matrix-js-sdk@33.0.0: unhomoglyph "^1.0.6" uuid "9" +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": + version "33.0.0" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/89875b8e314288856f9736ae84ee889991c64b34" + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8429,10 +8448,9 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.100.0: +"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop": version "3.100.0" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.100.0.tgz#1432003db2191120afff793455a26e78befd0ce6" - integrity sha512-qkBrcprusnQvSxVR2izru3NRmGVZ5CDKR9AFlby8HFOqKJQevFVYjcSIwTDRlr9utdkCbvp3sBWy+XfDDAgcxw== + resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/48a291d5b0e4418d4bd4f99bd86d20a75ec36c7e" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.21.0" @@ -8477,7 +8495,7 @@ matrix-react-sdk@3.100.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "33.0.0" + matrix-js-sdk "github:matrix-org/matrix-js-sdk#develop" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" @@ -8485,7 +8503,7 @@ matrix-react-sdk@3.100.0: opus-recorder "^8.0.3" pako "^2.0.3" png-chunks-extract "^1.0.0" - posthog-js "1.131.4" + posthog-js "1.135.2" proposal-temporal "^0.9.0" qrcode "1.5.3" re-resizable "^6.9.0" @@ -9892,10 +9910,10 @@ postcss@^8.4.38: picocolors "^1.0.0" source-map-js "^1.2.0" -posthog-js@1.131.4: - version "1.131.4" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.131.4.tgz#b29de94a26132e7cb5abcc16c7b57fd6d918e277" - integrity sha512-pKa1p6Q9jRU6s+xSluqGifODMncWTXRaeQw7yVet5U+0U56P0srdMO8NpzllIgDjYL9WLgUjDInucOBw5Cl/tA== +posthog-js@1.135.2: + version "1.135.2" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.135.2.tgz#1da1508760521e6f0fe1ab908bc4ffbe04c2952c" + integrity sha512-kqix067CyrlcNKUhVxrys8Qp0O/8FUtlkp7lfM+tkJFJAMZsKjIDVslz2AjI9y79CvyyZX+pddfA7F3YFYlS0Q== dependencies: fflate "^0.4.8" preact "^10.19.3" From 5a7956fd90bde51dc73f6740d1bf9464d0fa785c Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 4 Jun 2024 13:38:30 +0000 Subject: [PATCH 17/36] Reset matrix-js-sdk back to develop branch --- package.json | 2 +- yarn.lock | 20 -------------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/package.json b/package.json index c2637d0cef..1e68df2a10 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "33.0.0", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index c57c7e8eb1..a7938c1656 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8402,26 +8402,6 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@33.0.0: - version "33.0.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.0.0.tgz#556c20b4ee0b1b7f59a98d126fdce3818c6ecfc4" - integrity sha512-uv2Mx4j9hw1E+98wi7KUKn04+3jCaMM1BnLp7k8hkL1dQyibHTzB8evlR6idzatPChxgdTSeD+zTUesYy3i9gw== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "33.0.0" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/89875b8e314288856f9736ae84ee889991c64b34" From 60d3b590761c25a37f6712d2f9b1465153be20cd Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 6 Jun 2024 09:53:29 +0100 Subject: [PATCH 18/36] Roll out Rust crypto to 60% of existing users on app.element.io --- element.io/app/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/element.io/app/config.json b/element.io/app/config.json index 2214dbc7ea..27ab4abd6f 100644 --- a/element.io/app/config.json +++ b/element.io/app/config.json @@ -45,6 +45,6 @@ "privacy_policy_url": "https://element.io/cookie-policy", "map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx", "setting_defaults": { - "RustCrypto.staged_rollout_percent": 30 + "RustCrypto.staged_rollout_percent": 60 } } From 7e21f126788799b4a284ed481499c83208b863c0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Jun 2024 10:16:13 +0000 Subject: [PATCH 19/36] Update docker/login-action digest to 0d4c9c5 --- .github/workflows/dockerhub.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dockerhub.yaml b/.github/workflows/dockerhub.yaml index 3c64e4efbc..3e9473bc17 100644 --- a/.github/workflows/dockerhub.yaml +++ b/.github/workflows/dockerhub.yaml @@ -45,7 +45,7 @@ jobs: install: true - name: Login to Docker Hub - uses: docker/login-action@e92390c5fb421da1463c202d546fed0ec5c39f20 # v3 + uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} From c38505598ffa85b608221ba0794bc423e96adaf4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 6 Jun 2024 12:22:36 +0100 Subject: [PATCH 20/36] Update build_develop.yml --- .github/workflows/build_develop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_develop.yml b/.github/workflows/build_develop.yml index 7097099250..96b96c8398 100644 --- a/.github/workflows/build_develop.yml +++ b/.github/workflows/build_develop.yml @@ -98,7 +98,7 @@ jobs: running-workflow-name: "Build & Deploy develop.element.io" repo-token: ${{ secrets.GITHUB_TOKEN }} wait-interval: 10 - check-regexp: ^((?!SonarCloud|SonarQube|issue|board|label|Release|prepare).)*$ + check-regexp: ^((?!SonarCloud|SonarQube|issue|board|label|Release|prepare|GitHub Pages).)*$ # We keep the latest develop.tar.gz on R2 instead of relying on the github artifact uploaded earlier # as the expires after 24h and requires auth to download. From 2db2cf2b1b9165b95973127210e92b2bdf91b144 Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Thu, 6 Jun 2024 15:37:04 +0200 Subject: [PATCH 21/36] Downgrade `mdbook-combiner` --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 2aefb39a32..e495e87eaa 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -60,7 +60,7 @@ jobs: mdbook-version: "0.4.10" - name: Install mdbook extensions - run: cargo install mdbook-combiner mdbook-mermaid + run: cargo install mdbook-combiner@0.1.15 mdbook-mermaid - name: Prepare docs run: | From 3ce0d78961430dc0cbcbdf5ce243b468e5f81720 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 11:28:04 +0000 Subject: [PATCH 22/36] Update babel monorepo to v7.24.6 --- yarn.lock | 1336 +++++++++++++++++++++++++++++------------------------ 1 file changed, 720 insertions(+), 616 deletions(-) diff --git a/yarn.lock b/yarn.lock index a7938c1656..aab7128e1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27,7 +27,7 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5": version "7.24.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== @@ -51,15 +51,23 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + "@babel/compat-data@^7.20.5": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== "@babel/compat-data@^7.22.9": version "7.23.5" @@ -67,20 +75,20 @@ integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.21.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -88,18 +96,18 @@ semver "^6.3.1" "@babel/eslint-parser@^7.12.10": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" - integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz#27ebab1a1ec21f48ae191a8aaac5b82baf80d9c7" + integrity sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" "@babel/eslint-plugin@^7.12.10": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.24.5.tgz#6581b9005ab76308e4aef6b50aa1788099393211" - integrity sha512-5n3K9Zv13VOa9SG2ZiX0WV7A0ddApRn6vsV8zBojCsxnCbYKLjCDvzDfVxS7C4STmjQDOXU1uk/ppxxDTC860w== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/eslint-plugin/-/eslint-plugin-7.24.7.tgz#ebdab31638cdcc720f0c788813066e9b5c0b3e29" + integrity sha512-lODNPJnM+OfcxxBvdmI2YmUeC0fBK3k9yET5O+1Eukr8d5VpO19c6ARtNheE2t2i/8XNYTzp3HeGEAAGZH3nnQ== dependencies: eslint-rule-composer "^0.3.0" @@ -113,12 +121,12 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== +"@babel/generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.24.7" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" @@ -133,19 +141,20 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +"@babel/helper-annotate-as-pure@^7.22.5", "@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" "@babel/helper-compilation-targets@^7.20.7": version "7.22.15" @@ -158,13 +167,13 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" @@ -184,27 +193,27 @@ "@babel/helper-split-export-declaration" "^7.22.6" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" - integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.24.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/helper-create-class-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" + integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" + integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" semver "^6.3.1" @@ -224,6 +233,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" @@ -232,6 +248,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.23.0" +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -239,6 +263,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-member-expression-to-functions@^7.22.15": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" @@ -246,30 +277,32 @@ dependencies: "@babel/types" "^7.23.0" -"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" - integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== +"@babel/helper-member-expression-to-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" + integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== dependencies: - "@babel/types" "^7.24.5" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== dependencies: - "@babel/types" "^7.24.0" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -278,24 +311,31 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== "@babel/helper-plugin-utils@^7.20.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== +"@babel/helper-remap-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" + integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-wrap-function" "^7.24.7" "@babel/helper-replace-supers@^7.22.9": version "7.22.20" @@ -306,21 +346,22 @@ "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-replace-supers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" - integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== +"@babel/helper-replace-supers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" + integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" -"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== dependencies: - "@babel/types" "^7.24.5" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" @@ -329,50 +370,80 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.22.6", "@babel/helper-split-export-declaration@^7.24.5": +"@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.22.6": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== dependencies: "@babel/types" "^7.24.5" +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-string-parser@^7.22.5": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== -"@babel/helper-string-parser@^7.23.4", "@babel/helper-string-parser@^7.24.1": +"@babel/helper-string-parser@^7.23.4": version "7.24.1" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== -"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": +"@babel/helper-string-parser@^7.24.1", "@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.22.20": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== -"@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": +"@babel/helper-validator-identifier@^7.24.5", "@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.22.15": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helper-wrap-function@^7.22.20": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" - integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helper-wrap-function@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" + integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== dependencies: - "@babel/helper-function-name" "^7.23.0" - "@babel/template" "^7.24.0" - "@babel/types" "^7.24.5" + "@babel/helper-function-name" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" "@babel/highlight@^7.22.13": version "7.23.4" @@ -403,6 +474,16 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" @@ -418,42 +499,47 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== -"@babel/parser@^7.24.0", "@babel/parser@^7.24.5": +"@babel/parser@^7.24.0": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" - integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== +"@babel/parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" + integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" - integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" + integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" - integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" - integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" + integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-proposal-class-properties@^7.12.1": version "7.18.6" @@ -464,12 +550,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-export-default-from@^7.12.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" - integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz#0b539c46b8ac804f694e338f803c8354c0f788b6" + integrity sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-export-default-from" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-export-default-from" "^7.24.7" "@babel/plugin-proposal-logical-assignment-operators@^7.20.7": version "7.20.7" @@ -555,12 +641,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" - integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== +"@babel/plugin-syntax-export-default-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz#85dae9098933573aae137fb52141dd3ca52ae7ac" + integrity sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -569,19 +655,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" - integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" - integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -597,12 +683,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.23.3", "@babel/plugin-syntax-jsx@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== +"@babel/plugin-syntax-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-jsx@^7.7.2": version "7.22.5" @@ -667,12 +753,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== +"@babel/plugin-syntax-typescript@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-typescript@^7.7.2": version "7.22.5" @@ -689,277 +775,277 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" - integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" - integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== +"@babel/plugin-transform-async-generator-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd" + integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" - integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: - "@babel/helper-module-imports" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" -"@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" - integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" - integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== +"@babel/plugin-transform-block-scoping@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" + integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" - integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== +"@babel/plugin-transform-class-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" + integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" - integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/plugin-transform-classes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" + integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" - integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/template" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" - integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== +"@babel/plugin-transform-destructuring@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" + integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" - integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" - integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" - integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" - integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-export-namespace-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" - integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" - integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-function-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" - integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== +"@babel/plugin-transform-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" + integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" - integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" - integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== +"@babel/plugin-transform-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" + integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" - integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" - integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" - integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" - integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== +"@babel/plugin-transform-modules-commonjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" + integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" - integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== +"@babel/plugin-transform-modules-systemjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" + integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" - integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" - integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" - integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" - integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" - integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.7" -"@babel/plugin-transform-object-super@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" - integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" - integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" - integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== +"@babel/plugin-transform-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" + integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-transform-parameters@^7.20.7": @@ -969,37 +1055,37 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-parameters@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" - integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-methods@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" - integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" + integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-property-in-object@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" - integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.5" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" - integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-constant-elements@^7.21.3": version "7.23.3" @@ -1008,164 +1094,164 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" - integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== +"@babel/plugin-transform-react-display-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== +"@babel/plugin-transform-react-jsx-development@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.24.7" -"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== +"@babel/plugin-transform-react-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4" + integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/plugin-transform-react-pure-annotations@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" - integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== +"@babel/plugin-transform-react-pure-annotations@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" - integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" - integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-runtime@^7.12.10": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" - integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" + integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== dependencies: - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.1" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" - integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" - integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" - integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-template-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" - integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" - integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== +"@babel/plugin-transform-typeof-symbol@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" + integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typescript@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz#5c05e28bb76c7dfe7d6c5bed9951324fd2d3ab07" - integrity sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w== +"@babel/plugin-transform-typescript@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz#b006b3e0094bf0813d505e0c5485679eeaf4a881" + integrity sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-typescript" "^7.24.1" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-typescript" "^7.24.7" -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" - integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" - integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" - integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" - integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== +"@babel/plugin-transform-unicode-sets-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" + integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/preset-env@^7.12.11", "@babel/preset-env@^7.20.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" - integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== - dependencies: - "@babel/compat-data" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" + integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== + dependencies: + "@babel/compat-data" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1177,54 +1263,54 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.5" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.5" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.5" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.5" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.5" - "@babel/plugin-transform-parameters" "^7.24.5" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.5" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.5" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.24.7" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.24.7" + "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.24.7" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.24.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-modules-systemjs" "^7.24.7" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.4" @@ -1242,32 +1328,32 @@ esutils "^2.0.2" "@babel/preset-react@^7.12.10", "@babel/preset-react@^7.18.6": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" - integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-react-display-name" "^7.24.1" - "@babel/plugin-transform-react-jsx" "^7.23.4" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-react-display-name" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx-development" "^7.24.7" + "@babel/plugin-transform-react-pure-annotations" "^7.24.7" "@babel/preset-typescript@^7.12.7", "@babel/preset-typescript@^7.21.0": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz#89bdf13a3149a17b3b2a2c9c62547f06db8845ec" - integrity sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" + integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-syntax-jsx" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-typescript" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-typescript" "^7.24.7" "@babel/register@^7.12.10": - version "7.23.7" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.23.7.tgz#485a5e7951939d21304cae4af1719fdb887bc038" - integrity sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ== + version "7.24.6" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.24.6.tgz#59e21dcc79e1d04eed5377633b0f88029a6bef9e" + integrity sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -1281,13 +1367,13 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.9", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" - integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.24.0": +"@babel/template@^7.22.15": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== @@ -1296,6 +1382,15 @@ "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/template@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -1321,19 +1416,19 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/traverse@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" +"@babel/traverse@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" debug "^4.3.1" globals "^11.1.0" @@ -1346,7 +1441,7 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.21.3", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9": +"@babel/types@^7.21.3", "@babel/types@^7.23.6", "@babel/types@^7.23.9": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== @@ -1355,7 +1450,7 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.4.4": +"@babel/types@^7.22.15", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== @@ -1364,6 +1459,15 @@ "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" +"@babel/types@^7.22.5", "@babel/types@^7.24.7", "@babel/types@^7.4.4": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== + dependencies: + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -4453,9 +4557,9 @@ caniuse-lite@^1.0.30001578: integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== caniuse-lite@^1.0.30001587: - version "1.0.30001614" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz#f894b4209376a0bf923d67d9c361d96b1dfebe39" - integrity sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog== + version "1.0.30001629" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001629.tgz#907a36f4669031bd8a1a8dbc2fa08b29e0db297e" + integrity sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw== chalk@5.2.0: version "5.2.0" @@ -4759,14 +4863,7 @@ copy-webpack-plugin@^12.0.0: schema-utils "^4.2.0" serialize-javascript "^6.0.2" -core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" - integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== - dependencies: - browserslist "^4.23.0" - -core-js-compat@^3.37.0: +core-js-compat@^3.31.0, core-js-compat@^3.36.1, core-js-compat@^3.37.0: version "3.37.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== @@ -5147,7 +5244,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -5161,6 +5258,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -5472,9 +5576,9 @@ electron-to-chromium@^1.4.601: integrity sha512-2yszojF7vIZ68adIOvzV4bku8OZad9w5H9xF3ZAMZjPuOjBarlflUkjN6DggdV+L71WZuKUfKUhov/34+G5QHg== electron-to-chromium@^1.4.668: - version "1.4.751" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.751.tgz#b5b19742a435c589de02f60c16618150498bbd59" - integrity sha512-2DEPi++qa89SMGRhufWTiLmzqyuGmNF3SK4+PQetW1JKiZdEpF4XQonJXJCzyuYSA6mauiMhbyVhqYAP45Hvfw== + version "1.4.794" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.794.tgz#cca7762998f6c42517770666e272f52a53c08605" + integrity sha512-6FApLtsYhDCY0Vglq3AptsdxQ+PJLc6AxlAM0HjEihUAiOPPbkASEsq9gtxUeZY9o0sJIEa3WnF0vVH4VT4iug== emittery@^0.13.1: version "0.13.1" @@ -5836,7 +5940,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1: +escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== @@ -9201,7 +9305,7 @@ pbf@^3.2.1: ieee754 "^1.1.12" resolve-protobuf-schema "^2.1.0" -picocolors@^1.0.0: +picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== @@ -11703,12 +11807,12 @@ unplugin@1.0.1: webpack-virtual-modules "^0.5.0" update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" From fa5bd19368faa524ebbf087f52eb16d74998c222 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:50:03 +0000 Subject: [PATCH 23/36] Update definitelyTyped --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index aab7128e1d..ec9b900f00 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3308,9 +3308,9 @@ integrity sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ== "@types/lodash@^4.14.197": - version "4.17.1" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.1.tgz#0fabfcf2f2127ef73b119d98452bd317c4a17eb8" - integrity sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q== + version "4.17.4" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.4.tgz#0303b64958ee070059e3a7184048a55159fe20b7" + integrity sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ== "@types/mapbox__point-geometry@*", "@types/mapbox__point-geometry@^0.1.2": version "0.1.4" @@ -3364,9 +3364,9 @@ undici-types "~5.26.4" "@types/node@^16": - version "16.18.97" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.97.tgz#d7926a8030f0d714d555b4550c0cc7731495cfe5" - integrity sha512-4muilE1Lbfn57unR+/nT9AFjWk0MtWi5muwCEJqnOvfRQDbSfLCUdN7vCIg8TYuaANfhLOV85ve+FNpiUsbSRg== + version "16.18.98" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.98.tgz#3554bb7911ea2bbc3a528be0776d6ab16b7674d2" + integrity sha512-fpiC20NvLpTLAzo3oVBKIqBGR6Fx/8oAK/SSf7G+fydnXMY1x4x9RZ6sBXhqKlCU21g2QapUsbLlhv3+a7wS+Q== "@types/normalize-package-data@^2.4.0": version "2.4.4" From 82073aea3e3f79a9b0cb5345f3e042667294e06b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:28:51 +0000 Subject: [PATCH 24/36] Update typescript-eslint monorepo to v7.12.0 --- yarn.lock | 142 +++++++++++++++++++++++++++++------------------------- 1 file changed, 76 insertions(+), 66 deletions(-) diff --git a/yarn.lock b/yarn.lock index ec9b900f00..c8fa6310b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1816,9 +1816,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" + integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== "@eslint-community/regexpp@^4.6.1": version "4.9.1" @@ -3287,7 +3287,7 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -3563,63 +3563,61 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^7.0.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz#c78e309fe967cb4de05b85cdc876fb95f8e01b6f" - integrity sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg== + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.12.0.tgz#f87a32e8972b8a60024f2f8f12205e7c8108bc41" + integrity sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.8.0" - "@typescript-eslint/type-utils" "7.8.0" - "@typescript-eslint/utils" "7.8.0" - "@typescript-eslint/visitor-keys" "7.8.0" - debug "^4.3.4" + "@typescript-eslint/scope-manager" "7.12.0" + "@typescript-eslint/type-utils" "7.12.0" + "@typescript-eslint/utils" "7.12.0" + "@typescript-eslint/visitor-keys" "7.12.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.6.0" ts-api-utils "^1.3.0" "@typescript-eslint/parser@^7.0.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.8.0.tgz#1e1db30c8ab832caffee5f37e677dbcb9357ddc8" - integrity sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ== - dependencies: - "@typescript-eslint/scope-manager" "7.8.0" - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/typescript-estree" "7.8.0" - "@typescript-eslint/visitor-keys" "7.8.0" + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.12.0.tgz#8761df3345528b35049353db80010b385719b1c3" + integrity sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ== + dependencies: + "@typescript-eslint/scope-manager" "7.12.0" + "@typescript-eslint/types" "7.12.0" + "@typescript-eslint/typescript-estree" "7.12.0" + "@typescript-eslint/visitor-keys" "7.12.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047" - integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g== +"@typescript-eslint/scope-manager@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz#259c014362de72dd34f995efe6bd8dda486adf58" + integrity sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg== dependencies: - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/visitor-keys" "7.8.0" + "@typescript-eslint/types" "7.12.0" + "@typescript-eslint/visitor-keys" "7.12.0" -"@typescript-eslint/type-utils@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz#9de166f182a6e4d1c5da76e94880e91831e3e26f" - integrity sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A== +"@typescript-eslint/type-utils@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.12.0.tgz#9dfaaa1972952f395ec5be4f5bbfc4d3cdc63908" + integrity sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA== dependencies: - "@typescript-eslint/typescript-estree" "7.8.0" - "@typescript-eslint/utils" "7.8.0" + "@typescript-eslint/typescript-estree" "7.12.0" + "@typescript-eslint/utils" "7.12.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d" - integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw== +"@typescript-eslint/types@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.12.0.tgz#bf208f971a8da1e7524a5d9ae2b5f15192a37981" + integrity sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg== -"@typescript-eslint/typescript-estree@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c" - integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg== +"@typescript-eslint/typescript-estree@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz#e6c1074f248b3db6573ab6a7c47a39c4cd498ff9" + integrity sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ== dependencies: - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/visitor-keys" "7.8.0" + "@typescript-eslint/types" "7.12.0" + "@typescript-eslint/visitor-keys" "7.12.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -3627,25 +3625,22 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd" - integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ== +"@typescript-eslint/utils@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.12.0.tgz#c6e58fd7f724cdccc848f71e388ad80cbdb95dd0" + integrity sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.15" - "@types/semver" "^7.5.8" - "@typescript-eslint/scope-manager" "7.8.0" - "@typescript-eslint/types" "7.8.0" - "@typescript-eslint/typescript-estree" "7.8.0" - semver "^7.6.0" + "@typescript-eslint/scope-manager" "7.12.0" + "@typescript-eslint/types" "7.12.0" + "@typescript-eslint/typescript-estree" "7.12.0" -"@typescript-eslint/visitor-keys@7.8.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91" - integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA== +"@typescript-eslint/visitor-keys@7.12.0": + version "7.12.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz#c053b55a996679528beeedd8e565710ce1ae1ad3" + integrity sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ== dependencies: - "@typescript-eslint/types" "7.8.0" + "@typescript-eslint/types" "7.12.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": @@ -4401,7 +4396,14 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2, braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -5244,7 +5246,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -5258,7 +5260,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== @@ -6457,10 +6459,10 @@ filesize@10.1.2: resolved "https://registry.yarnpkg.com/filesize/-/filesize-10.1.2.tgz#33bb71c5c134102499f1bc36e6f2863137f6cb0c" integrity sha512-Dx770ai81ohflojxhU+oG+Z2QGvKdYxgEr9OSA8UVrqhwNHjfH9A8f5NKfg83fEH8ZFA5N5llJo5T3PIoZ4CRA== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.0.1, fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -8691,7 +8693,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.2, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -8699,6 +8701,14 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: braces "^3.0.2" picomatch "^2.3.1" +micromatch@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" From 050dae7a9f82707fba54492704aa1107098a83d5 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 11 Jun 2024 12:08:25 +0000 Subject: [PATCH 25/36] Upgrade dependency to matrix-js-sdk@33.1.0-rc.0 --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e68df2a10..a75115bc2b 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "33.1.0-rc.0", "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index c8fa6310b0..04a2acc330 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8508,6 +8508,26 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== +matrix-js-sdk@33.1.0-rc.0: + version "33.1.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.1.0-rc.0.tgz#8f335d1623f463428d978582780d19b881b5c4f7" + integrity sha512-QjFryN0d3RJd9s6RVBNlaAZheX+s3YaBiaaXK5BY6m934xKudEUUozfZnb7169lHZ8Z+/zQluOquD5t6RNi9XA== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "33.0.0" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/89875b8e314288856f9736ae84ee889991c64b34" From 369ae1208e3a52a2136310cccd7361a337ab48c0 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 11 Jun 2024 12:15:49 +0000 Subject: [PATCH 26/36] Upgrade dependency to matrix-react-sdk@3.101.0-rc.0 --- package.json | 2 +- yarn.lock | 229 ++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 199 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index a75115bc2b..d4d050ff1f 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "33.1.0-rc.0", - "matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", + "matrix-react-sdk": "3.101.0-rc.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 04a2acc330..33836dea8c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1808,6 +1808,11 @@ resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#519c1549b0e147759e7825701ecffd25e5819f7b" integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg== +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -2878,6 +2883,98 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@storybook/channels@8.1.6": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-8.1.6.tgz#2fb2b51fe0ae5966e75d25cf995392048f8b62a4" + integrity sha512-CzDnP6qfI8OC8pGUk+wPUzLPYcKhX8XbriF2gBtwl6qVM8YfkHP2mLTiDYDwBIi0rLuUbSm/SpILXQ/ouOHOGw== + dependencies: + "@storybook/client-logger" "8.1.6" + "@storybook/core-events" "8.1.6" + "@storybook/global" "^5.0.0" + telejson "^7.2.0" + tiny-invariant "^1.3.1" + +"@storybook/client-logger@8.1.6": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-8.1.6.tgz#79fcd54e58d5ec72fa2ea53bdb16a98d10ee712f" + integrity sha512-QfSoUxS1rmrBzO7o99og9g+Gkm7sTmU5ZOpTkjszjlRqfV6/77eUnUOzUikej4LqPLmlJV5fqGuvoP0aNVksDw== + dependencies: + "@storybook/global" "^5.0.0" + +"@storybook/core-events@8.1.6": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-8.1.6.tgz#b4819279b1277196e62b1b3f1b113a304c9f675b" + integrity sha512-DaIVe4TUp/7uQdSJYGmJv9S/S364tSgZ3S3dZ1vsf1rgoUbCp5kTBtcd/fcqgukMPREgCgO9oDhmemI3SLAqzw== + dependencies: + "@storybook/csf" "^0.1.7" + ts-dedent "^2.0.0" + +"@storybook/csf@^0.1.7": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.8.tgz#63a83dc493c462d84e0f333e3f3264d319bec716" + integrity sha512-Ntab9o7LjBCbFIao5l42itFiaSh/Qu+l16l/r/9qmV9LnYZkO+JQ7tzhdlwpgJfhs+B5xeejpdAtftDRyXNajw== + dependencies: + type-fest "^2.19.0" + +"@storybook/global@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" + integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== + +"@storybook/icons@^1.2.5": + version "1.2.9" + resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-1.2.9.tgz#bb4a51a79e186b62e2dd0e04928b8617ac573838" + integrity sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg== + +"@storybook/manager-api@^8.1.1": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.1.6.tgz#101ad9be3d6ed95847fcfe9f92a4320d33b67b9d" + integrity sha512-L/s1FdFh/P+eFmQwLtFtJHwFJrGD9H7nauaQlKJOrU3GeXfjBjtlAZQF0Q6B4ZTGxwZjQrzShpt/0yKc6gymtw== + dependencies: + "@storybook/channels" "8.1.6" + "@storybook/client-logger" "8.1.6" + "@storybook/core-events" "8.1.6" + "@storybook/csf" "^0.1.7" + "@storybook/global" "^5.0.0" + "@storybook/icons" "^1.2.5" + "@storybook/router" "8.1.6" + "@storybook/theming" "8.1.6" + "@storybook/types" "8.1.6" + dequal "^2.0.2" + lodash "^4.17.21" + memoizerific "^1.11.3" + store2 "^2.14.2" + telejson "^7.2.0" + ts-dedent "^2.0.0" + +"@storybook/router@8.1.6": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@storybook/router/-/router-8.1.6.tgz#778649dd13b2f75fa657f67c2b01a2c31d43f8e9" + integrity sha512-tvuhB2uXHEKK640Epm1SqVzPhQ9lXYfF7FX6FleJgVYEvZpJpNTD4RojedQoLI6SUUSXNy1Vs2QV26VM0XIPHQ== + dependencies: + "@storybook/client-logger" "8.1.6" + memoizerific "^1.11.3" + qs "^6.10.0" + +"@storybook/theming@8.1.6": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.1.6.tgz#0d08e8eefbd1a9446095976f1b8810c501215bef" + integrity sha512-0Cl/7/0z2WSfXhZ9XSw6rgEjb0fXac7jfktieX0vYo1YckrNpWFRQP9NCpVPAcYZaFLlRSOqYark6CLoutEsIg== + dependencies: + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@storybook/client-logger" "8.1.6" + "@storybook/global" "^5.0.0" + memoizerific "^1.11.3" + +"@storybook/types@8.1.6": + version "8.1.6" + resolved "https://registry.yarnpkg.com/@storybook/types/-/types-8.1.6.tgz#08f3191408bf4c7375c4321f7402353390ddc438" + integrity sha512-cWpS9+x1pxCO39spR8QmumMK2ub2p5cvMtrRvWaIjBFPbCwm2CvjBXFWIra2veBCZTxUKJ9VWxvi7pzRHjN/nw== + dependencies: + "@storybook/channels" "8.1.6" + "@types/express" "^4.7.0" + file-system-cache "2.3.0" + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" @@ -3184,7 +3281,7 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.21": +"@types/express@*", "@types/express@^4.17.21", "@types/express@^4.7.0": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -3655,10 +3752,10 @@ dependencies: svg2vectordrawable "^2.9.1" -"@vector-im/compound-web@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.3.1.tgz#4570adeccdfcac6919256c5e399d592510bdb15d" - integrity sha512-/Sw27GI0jCg6A7E+93SWFyF3pEwLyLzExB3lIVPTY0mMTx50+rZloRuhuqftUlIscWSlmAUex8Lo4WK8WKPFPA== +"@vector-im/compound-web@^4.4.1": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-4.5.0.tgz#a27c6c3edc6313afaf04b1848e34b1bf8531d451" + integrity sha512-RUzJg1mrurd91S4ONlwgCFjY7j44sJPyV2UIGM80XF3n/y+nsCqoPvn7hG2DTq+2yvKdU/3eD1DOBXz2FgARdw== dependencies: "@floating-ui/react" "^0.26.9" "@floating-ui/react-dom" "^2.0.8" @@ -3668,6 +3765,7 @@ "@radix-ui/react-separator" "^1.0.3" "@radix-ui/react-slot" "^1.0.2" "@radix-ui/react-tooltip" "^1.0.6" + "@storybook/manager-api" "^8.1.1" classnames "^2.3.2" graphemer "^1.4.0" vaul "^0.7.0" @@ -5374,6 +5472,11 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dequal@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -6449,6 +6552,14 @@ file-saver@^2.0.5: resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== +file-system-cache@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-2.3.0.tgz#201feaf4c8cd97b9d0d608e96861bb6005f46fe6" + integrity sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ== + dependencies: + fs-extra "11.1.1" + ramda "0.29.0" + file@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/file/-/file-0.2.2.tgz#c3dfd8f8cf3535ae455c2b423c2e52635d76b4d3" @@ -6605,6 +6716,15 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -6823,7 +6943,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -8155,6 +8275,15 @@ json5@^2.1.2, json5@^2.1.3, json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsrsasign@^11.0.0: version "11.1.0" resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-11.1.0.tgz#195e788102731102fbf3e36b33fde28936f4bf57" @@ -8452,6 +8581,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-or-similar@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" + integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== + maplibre-gl@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/maplibre-gl/-/maplibre-gl-2.4.0.tgz#2b53dbf526626bf4ee92ad4f33f13ef09e5af182" @@ -8528,25 +8662,6 @@ matrix-js-sdk@33.1.0-rc.0: unhomoglyph "^1.0.6" uuid "9" -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "33.0.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/89875b8e314288856f9736ae84ee889991c64b34" - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8554,9 +8669,10 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop": - version "3.100.0" - resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/48a291d5b0e4418d4bd4f99bd86d20a75ec36c7e" +matrix-react-sdk@3.101.0-rc.0: + version "3.101.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.101.0-rc.0.tgz#159968f6dd44dfffccb8679fe8b08a983754a32c" + integrity sha512-uxvuY3yP1ARKmaP4JzgOsFsyCIMwonNCxccgaUtpXAbmsYJqfvA9rYGRb01Zyq0p8NNX6u6M/S7egqrBkaoJZA== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.21.0" @@ -8568,7 +8684,7 @@ matrix-mock-request@^2.5.0: "@sentry/browser" "^7.0.0" "@testing-library/react-hooks" "^8.0.1" "@vector-im/compound-design-tokens" "^1.2.0" - "@vector-im/compound-web" "^4.3.1" + "@vector-im/compound-web" "^4.4.1" "@zxcvbn-ts/core" "^3.0.4" "@zxcvbn-ts/language-common" "^3.0.4" "@zxcvbn-ts/language-en" "^3.0.2" @@ -8601,7 +8717,7 @@ matrix-mock-request@^2.5.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "github:matrix-org/matrix-js-sdk#develop" + matrix-js-sdk "33.1.0-rc.0" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" @@ -8688,6 +8804,13 @@ memoize-one@^6.0.0: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== +memoizerific@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/memoizerific/-/memoizerific-1.11.3.tgz#7c87a4646444c32d75438570905f2dbd1b1a805a" + integrity sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog== + dependencies: + map-or-similar "^1.5.0" + meow@^13.2.0: version "13.2.0" resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" @@ -10188,6 +10311,13 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +qs@^6.10.0: + version "6.12.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" + integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== + dependencies: + side-channel "^1.0.6" + querystring@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" @@ -10213,6 +10343,11 @@ raf-schd@^4.0.2: resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== +ramda@0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.0.tgz#fbbb67a740a754c8a4cbb41e2a6e0eb8507f55fb" + integrity sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -10902,7 +11037,7 @@ shell-quote@^1.8.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -side-channel@^1.0.4: +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== @@ -11096,6 +11231,11 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +store2@^2.14.2: + version "2.14.3" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.14.3.tgz#24077d7ba110711864e4f691d2af941ec533deb5" + integrity sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -11477,6 +11617,13 @@ tar-js@^0.3.0: resolved "https://registry.yarnpkg.com/tar-js/-/tar-js-0.3.0.tgz#6949aabfb0ba18bb1562ae51a439fd0f30183a17" integrity sha512-9uqP2hJUZNKRkwPDe5nXxXdzo6w+BFBPq9x/tyi5/U/DneuSesO/HMb0y5TeWpfcv49YDJTs7SrrZeeu8ZHWDA== +telejson@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/telejson/-/telejson-7.2.0.tgz#3994f6c9a8f8d7f2dba9be2c7c5bbb447e876f32" + integrity sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ== + dependencies: + memoizerific "^1.11.3" + terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.9: version "5.3.10" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" @@ -11532,6 +11679,11 @@ tiny-invariant@^1.0.6: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== +tiny-invariant@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + tinyqueue@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" @@ -11615,6 +11767,11 @@ ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +ts-dedent@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + ts-morph@^13.0.1: version "13.0.3" resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-13.0.3.tgz#c0c51d1273ae2edb46d76f65161eb9d763444c1d" @@ -11701,6 +11858,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -11821,6 +11983,11 @@ universalify@^0.2.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" From ffb69d4c47ab8332e160adc60eee87bfaa9dfbbb Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 11 Jun 2024 12:20:51 +0000 Subject: [PATCH 27/36] v1.11.69-rc.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4d050ff1f..a498e6f634 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.68", + "version": "1.11.69-rc.0", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From 65a87f1a5391237c0698550248265c8d99a5f37f Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 14 Jun 2024 12:22:22 +0000 Subject: [PATCH 28/36] Upgrade dependency to matrix-js-sdk@33.1.0-rc.1 --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a498e6f634..81ca070929 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "33.1.0-rc.0", + "matrix-js-sdk": "33.1.0-rc.1", "matrix-react-sdk": "3.101.0-rc.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 33836dea8c..c7e062ee9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8662,6 +8662,26 @@ matrix-js-sdk@33.1.0-rc.0: unhomoglyph "^1.0.6" uuid "9" +matrix-js-sdk@33.1.0-rc.1: + version "33.1.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.1.0-rc.1.tgz#b33acf2e0e3fccf1a5028a17220dac99de85782e" + integrity sha512-ISs9gHRqjYJsGxA5XcWx8eJa+CQtYcRGMJ1OVG9hmfrs7mRTFt/SiKnG33qlIWaF6tZ3bqrSjHaZyKbPmygZmQ== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" From 4360f5a63e9d294c0b5f144427983d569d6b14fb Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 14 Jun 2024 12:29:18 +0000 Subject: [PATCH 29/36] Upgrade dependency to matrix-react-sdk@3.101.0-rc.1 --- package.json | 2 +- yarn.lock | 30 +++++------------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 81ca070929..5f98fcb079 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "33.1.0-rc.1", - "matrix-react-sdk": "3.101.0-rc.0", + "matrix-react-sdk": "3.101.0-rc.1", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index c7e062ee9d..61296cd32c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8642,26 +8642,6 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@33.1.0-rc.0: - version "33.1.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.1.0-rc.0.tgz#8f335d1623f463428d978582780d19b881b5c4f7" - integrity sha512-QjFryN0d3RJd9s6RVBNlaAZheX+s3YaBiaaXK5BY6m934xKudEUUozfZnb7169lHZ8Z+/zQluOquD5t6RNi9XA== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - matrix-js-sdk@33.1.0-rc.1: version "33.1.0-rc.1" resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.1.0-rc.1.tgz#b33acf2e0e3fccf1a5028a17220dac99de85782e" @@ -8689,10 +8669,10 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.101.0-rc.0: - version "3.101.0-rc.0" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.101.0-rc.0.tgz#159968f6dd44dfffccb8679fe8b08a983754a32c" - integrity sha512-uxvuY3yP1ARKmaP4JzgOsFsyCIMwonNCxccgaUtpXAbmsYJqfvA9rYGRb01Zyq0p8NNX6u6M/S7egqrBkaoJZA== +matrix-react-sdk@3.101.0-rc.1: + version "3.101.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.101.0-rc.1.tgz#a380970b26af9b7a927a107ef756b748af4d5f16" + integrity sha512-OWPxz/vk2YpsK3+rsX5ufwJc32fpyHN/OC19b3Uz3+qtphH0bCWnyvDnx2AfyWYO8Djk9e1Phnm+vhDovgdV5A== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.21.0" @@ -8737,7 +8717,7 @@ matrix-react-sdk@3.101.0-rc.0: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "33.1.0-rc.0" + matrix-js-sdk "33.1.0-rc.1" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" From 087f1bc948a64c10cf8d01b43a62bdf06f818102 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 14 Jun 2024 12:35:42 +0000 Subject: [PATCH 30/36] v1.11.69-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5f98fcb079..a807856a43 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.69-rc.0", + "version": "1.11.69-rc.1", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From d3a0925e42aeef760ab377f9072c07a941dd4cff Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 18 Jun 2024 11:56:40 +0000 Subject: [PATCH 31/36] Upgrade dependency to matrix-js-sdk@33.1.0 --- package.json | 2 +- yarn.lock | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a807856a43..ed2a84672f 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "jsrsasign": "^11.0.0", "katex": "^0.16.0", "lodash": "^4.17.21", - "matrix-js-sdk": "33.1.0-rc.1", + "matrix-js-sdk": "33.1.0", "matrix-react-sdk": "3.101.0-rc.1", "matrix-widget-api": "^1.3.1", "react": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 61296cd32c..752849cf28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8642,6 +8642,26 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== +matrix-js-sdk@33.1.0: + version "33.1.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.1.0.tgz#e6fe3a521955bb2e2b200a5ca2be1a1ea76a8c90" + integrity sha512-Spf+g156eK+SqPd7EuulTVwpyHkVXR0Ikme04fMCKer+SbzuLPPnqV3gL5cSyTMmHbdNejEJaEvzNIMQoD7Xxw== + dependencies: + "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" + another-json "^0.2.0" + bs58 "^5.0.0" + content-type "^1.0.4" + jwt-decode "^4.0.0" + loglevel "^1.7.1" + matrix-events-sdk "0.0.1" + matrix-widget-api "^1.6.0" + oidc-client-ts "^3.0.1" + p-retry "4" + sdp-transform "^2.14.1" + unhomoglyph "^1.0.6" + uuid "9" + matrix-js-sdk@33.1.0-rc.1: version "33.1.0-rc.1" resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.1.0-rc.1.tgz#b33acf2e0e3fccf1a5028a17220dac99de85782e" From 42c0c195567aa2c9544a9ad52dd9ac6069abc3a6 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 18 Jun 2024 12:17:05 +0000 Subject: [PATCH 32/36] Upgrade dependency to matrix-react-sdk@3.101.0 --- package.json | 2 +- yarn.lock | 30 +++++------------------------- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index ed2a84672f..ba8ea60e89 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "katex": "^0.16.0", "lodash": "^4.17.21", "matrix-js-sdk": "33.1.0", - "matrix-react-sdk": "3.101.0-rc.1", + "matrix-react-sdk": "3.101.0", "matrix-widget-api": "^1.3.1", "react": "17.0.2", "react-dom": "17.0.2", diff --git a/yarn.lock b/yarn.lock index 752849cf28..4349bd238b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8662,26 +8662,6 @@ matrix-js-sdk@33.1.0: unhomoglyph "^1.0.6" uuid "9" -matrix-js-sdk@33.1.0-rc.1: - version "33.1.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-33.1.0-rc.1.tgz#b33acf2e0e3fccf1a5028a17220dac99de85782e" - integrity sha512-ISs9gHRqjYJsGxA5XcWx8eJa+CQtYcRGMJ1OVG9hmfrs7mRTFt/SiKnG33qlIWaF6tZ3bqrSjHaZyKbPmygZmQ== - dependencies: - "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-wasm" "^5.0.0" - another-json "^0.2.0" - bs58 "^5.0.0" - content-type "^1.0.4" - jwt-decode "^4.0.0" - loglevel "^1.7.1" - matrix-events-sdk "0.0.1" - matrix-widget-api "^1.6.0" - oidc-client-ts "^3.0.1" - p-retry "4" - sdp-transform "^2.14.1" - unhomoglyph "^1.0.6" - uuid "9" - matrix-mock-request@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/matrix-mock-request/-/matrix-mock-request-2.6.0.tgz#0855c10b250668ce542b697251087be2bcc23f92" @@ -8689,10 +8669,10 @@ matrix-mock-request@^2.5.0: dependencies: expect "^28.1.0" -matrix-react-sdk@3.101.0-rc.1: - version "3.101.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.101.0-rc.1.tgz#a380970b26af9b7a927a107ef756b748af4d5f16" - integrity sha512-OWPxz/vk2YpsK3+rsX5ufwJc32fpyHN/OC19b3Uz3+qtphH0bCWnyvDnx2AfyWYO8Djk9e1Phnm+vhDovgdV5A== +matrix-react-sdk@3.101.0: + version "3.101.0" + resolved "https://registry.yarnpkg.com/matrix-react-sdk/-/matrix-react-sdk-3.101.0.tgz#fe9976d782570fc424feeb5f76d511fd3bd86d30" + integrity sha512-HJUmq55A8pURkCRj7to0udy6Fcy0RoRzyNvT7I0GGK4fye1KxNPKpd/CFOXSmfaXzafVoObZJGTRCg06FYOe5Q== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/analytics-events" "^0.21.0" @@ -8737,7 +8717,7 @@ matrix-react-sdk@3.101.0-rc.1: maplibre-gl "^2.0.0" matrix-encrypt-attachment "^1.0.3" matrix-events-sdk "0.0.1" - matrix-js-sdk "33.1.0-rc.1" + matrix-js-sdk "33.1.0" matrix-widget-api "^1.5.0" memoize-one "^6.0.0" minimist "^1.2.5" From fa1d2c7dfb94d5599378453f2c458dcc56b6df88 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 18 Jun 2024 12:19:08 +0000 Subject: [PATCH 33/36] v1.11.69 --- CHANGELOG.md | 23 +++++++++++++++++++++++ package.json | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 585211fdd2..f8c113a443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +Changes in [1.11.69](https://github.com/element-hq/element-web/releases/tag/v1.11.69) (2024-06-18) +================================================================================================== +## ✨ Features + +* Change avatar setting component to use a menu ([#12585](https://github.com/matrix-org/matrix-react-sdk/pull/12585)). Contributed by @dbkr. +* New user profile UI in User Settings ([#12548](https://github.com/matrix-org/matrix-react-sdk/pull/12548)). Contributed by @dbkr. +* MSC4108 support OIDC QR code login ([#12370](https://github.com/matrix-org/matrix-react-sdk/pull/12370)). Contributed by @t3chguy. + +## 🐛 Bug Fixes + +* Fix image upload preview size ([#12612](https://github.com/matrix-org/matrix-react-sdk/pull/12612)). Contributed by @RiotRobot. +* Fix screen sharing in recent Chrome (https://github.com/matrix-org/matrix-js-sdk/pull/4243). +* Fix roving tab index crash `compareDocumentPosition` ([#12594](https://github.com/matrix-org/matrix-react-sdk/pull/12594)). Contributed by @t3chguy. +* Keep dialog glass border on narrow screens ([#12591](https://github.com/matrix-org/matrix-react-sdk/pull/12591)). Contributed by @dbkr. +* Add missing a11y label to dismiss onboarding button in room list ([#12587](https://github.com/matrix-org/matrix-react-sdk/pull/12587)). Contributed by @t3chguy. +* Add hover / active state on avatar setting upload button ([#12590](https://github.com/matrix-org/matrix-react-sdk/pull/12590)). Contributed by @dbkr. +* Fix EditInPlace button styles ([#12589](https://github.com/matrix-org/matrix-react-sdk/pull/12589)). Contributed by @dbkr. +* Fix incorrect assumptions about required fields in /search response ([#12575](https://github.com/matrix-org/matrix-react-sdk/pull/12575)). Contributed by @t3chguy. +* Fix display of no avatar in avatar setting controls ([#12558](https://github.com/matrix-org/matrix-react-sdk/pull/12558)). Contributed by @dbkr. +* Element-R: pass pickleKey in as raw key for indexeddb encryption ([#12543](https://github.com/matrix-org/matrix-react-sdk/pull/12543)). Contributed by @richvdh. + + + Changes in [1.11.68](https://github.com/element-hq/element-web/releases/tag/v1.11.68) (2024-06-04) ================================================================================================== ## ✨ Features diff --git a/package.json b/package.json index ba8ea60e89..f631700f0a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.69-rc.1", + "version": "1.11.69", "description": "A feature-rich client for Matrix.org", "author": "New Vector Ltd.", "repository": { From b9dc9c245e25658c51d366a6ff40f8cd5876971a Mon Sep 17 00:00:00 2001 From: "marc.sirisak" Date: Wed, 26 Jun 2024 10:00:23 +0200 Subject: [PATCH 34/36] Squashed 'linked-dependencies/matrix-react-sdk/' changes from df47422a082..e261ae81d87 e261ae81d87 Merge pull request #8 from tchapgouv/upgrade-v3.101.0 3c4fe5d93c2 chore(merge-conflict): spacepanel and packagejson 66003d918aa Merge matrix-react-sdk v3.101.0 into TCHAP b705c9e6bc1 fix(theme-tac): use tchap theme for TAC button and badge e810f9622ce v3.101.0 85685a27d67 Upgrade dependency to matrix-js-sdk@33.1.0 a79b5037661 feat(lowercase-invite): automatically lowercase field text in invite input 2a39b307bd9 feat(ff-screenshare): add feature flag screenshare on call 880ff5c7bbc v3.101.0-rc.1 83f238aad2c Upgrade dependency to matrix-js-sdk@33.1.0-rc.1 444e2765dd7 [Backport staging] Fix image upload preview size (#12612) 07ab7958513 feat(lasuite): add gaufre element in spacepanel 6dee68c7267 v3.101.0-rc.0 cc8c89e459d Upgrade dependency to matrix-js-sdk@33.1.0-rc.0 930b4e24247 Fix roving tab index crash `compareDocumentPosition` (#12594) 3e7511cc5df Keep dialog glass border on narrow screens (#12591) 4e3de2b27ee [create-pull-request] automated change (#12595) afd6f63d7e1 Add missing a11y label to dismiss onboarding button in room list (#12587) eee17f43c3d [create-pull-request] automated change (#12592) 8a0dcdd4de1 Update end-to-end-tests.yaml 7091ca02b00 Add hover / active state on avatsetting upload button (#12590) aeea4bb8e10 Fix EditInPlace button styles (#12589) 1696c5cd0a6 Change avatarsetting componment to use a menu (#12585) c0cbd687c2b [create-pull-request] automated change (#12584) fc60eac2b44 [create-pull-request] automated change (#12583) 7e42ffb150c Fix incorrect assumptions about required fields in /search response (#12575) ceafad32f90 Update babel monorepo to v7.24.6 (#12561) 3c8010b719e Fix display of no avatar in avatar setting controls (#12558) cfa322cd626 New user profile UI in User Settings (#12548) c4c1faff979 Add flag for tests to avoid double-reporting check (#12569) 39d0017411e Update typescript-eslint monorepo to v7.11.0 (#12566) 1677ed1be0e MSC4108 support OIDC QR code login (#12370) ca7760789b7 Use LegacyRendezvousFailureReason over RendezvousFailureReason (#12578) e867196c15c [create-pull-request] automated change (#12581) 99b24851d86 Update dependency stylelint to v16.6.1 (#12565) c95fd179ba3 Update dependency @sentry/browser to v7.116.0 (#12563) 58664e7e7d9 Update dependency @playwright/test to v1.44.1 (#12562) 0a01320fca4 Element-R: pass pickleKey in as raw key for indexeddb encryption (#12543) 5004456d82f [create-pull-request] automated change (#12577) 9680a36b145 Update end-to-end-tests.yaml 7cd822fa080 Update definitelyTyped (#12551) 48a291d5b0e Reset matrix-js-sdk back to develop branch c68c33a884d Resetting package fields for development c3a7c246087 Merge branch 'master' into develop 3ec0fe166fb v3.100.0 f894ae6b68f Upgrade dependency to matrix-js-sdk@33.0.0 ab6a94aa8f7 [create-pull-request] automated change (#12574) f2d9f13f1b2 Update end-to-end-tests.yaml cca684d7d62 feat(hide-threads): extends hidding thread with feature flags with TAC 30850709ef6 Build the playwright html report in the main workflow (#12570) c3769addd3b [create-pull-request] automated change (#12573) fa7486e415b [create-pull-request] automated change (#12572) dff05f4ca8c Update CODEOWNERS 3912401db56 [create-pull-request] automated change (#12557) 18edb2e8117 Update all non-major dependencies (#12560) aec15a6ac18 Pin playwright synapse docker image to 2 days ago (#12571) 7f49a3009e0 v3.100.0-rc.1 2e1c1d15fc9 Upgrade dependency to matrix-js-sdk@33.0.0-rc.0 ca16462265a Merge remote-tracking branch 'origin/develop' into staging 679b170bc5a Close the release announcement when a dialog is opened (#12559) 17ab5229422 Tooltip: close field tooltip when ESC is pressed (#12553) e8bb2419c9d Fix tabbedview breakpoint width (#12556) 148a360598d Avoid using deprecated exports, fields, and duplicate code (#12555) 1973197eb69 [create-pull-request] automated change (#12554) bc48fe4b8f2 Add seedrandom dep to `resolutions` (#12552) 88e8e2df03b Merge pull request #12549 from matrix-org/florianduros/tooltip/legacy-tooltip d9f718e5892 Add more test for `ReactionsRowButton.tsx` 8f07672da13 Add more tests for `ReadReceiptGroup.tsx` b6132db68f4 Merge branch 'develop' into florianduros/tooltip/legacy-tooltip 04741ae6a64 Add tests for `ReadReceiptGroup.tsx` 1190de90289 Migrate `TooltipTarget` usage to compound `Tooltip` (#12542) 0c28d37f4e0 Upgrade dependency to matrix-js-sdk@32.4.0 a6907a033e8 Use compound tooltip in `ReactionRowButton` 67c7514dcdd Delete `useTooltip.tsx` 25fa1238eca Use tooltip compound in `ReadReceiptPerson` component dbe00e5889e Use tooltip compound in `ReadReceiptGroup` component 7d3b3d7f957 Use tooltip compound in `MessageComposer.tsx` a5e4daa0d1f Deprecate `Tooltip.tsx` a29cabe45a5 Report verification and recovery state to posthog (#12516) f712b809e27 Remove code smell assertion identified by Sonar (#12547) 4f3dcb6bc98 Upgrade dependency to matrix-js-sdk@32.3.0 3342aa5ff8a Refactor some logic into common AvatarSetting component (#12544) f6e919021ad Fix E2E icon display in room header (#12545) 1bb70c5b3bf Only report undecryptable events once (#12501) 3e103941d67 Cleanup work on `DecryptionFailureTracker` (#12546) 75562b1d1ba Tooltip: migrate remaining tooltips from `AccessibleTooltipButton` to `AccessibleButton` (#12522) 8f3c8b35153 Use `RovingAccessibleButton` instead of `RovingAccessibleTooltipButton` (#12539) 2d0319ec1b0 Improve tooltip placement for space settings (#12541) 4e91d8b857f Update all non-major dependencies (#12530) 5109e7e4c0b Fix deformed avatar in call in a narrow timeline (#12538) eed8d1538b8 Add more encryption properties to PostHog (#12415) 0c04ec1def3 Shown own sent state indicator even when showReadReceipts is disabled (#12540) 8b8b75e4a5b Update dependency eslint-plugin-unicorn to v53 (#12536) 5becbcb1d95 Update stylelint (#12534) f1ef5ba02e4 Update dependency @sentry/browser to v7.114.0 (#12532) 0ed4d510c4f Update dependency @playwright/test to v1.44.0 (#12531) 6a9a02c281e Update dependency axe-core to v4.9.1 (#12529) 24df2e8cb76 Ensure we do not fire the verification mismatch modal multiple times (#12526) 113c3655636 Stop using deprecated methods, fields & exports (#12524) bec8fdb3d32 Tooltip: Improve accessibility for context menus (#12462) 580bc8771c6 Fix avatar in chat export (#12537) a730e1d3d66 Update dependency @testing-library/jest-dom to v6.4.5 (#12528) d184cacb6b1 Update definitelyTyped (#12527) 6b0cb75d82a Use kdb in space panel shortcut (#12525) 667a7548a72 Use `*` for italics as it doesn't break when used mid-word (#12523) git-subtree-dir: linked-dependencies/matrix-react-sdk git-subtree-split: e261ae81d8727438eed055febeb541a45f21170d --- .eslintrc.js | 2 - .github/CODEOWNERS | 3 + .../workflows/end-to-end-tests-netlify.yaml | 29 +- .github/workflows/end-to-end-tests.yaml | 39 + .../workflows/playwright-image-updates.yaml | 45 + .github/workflows/static_analysis.yaml | 2 +- .github/workflows/tests.yml | 2 +- CHANGELOG.md | 42 + package.json | 21 +- playwright/Dockerfile | 2 +- playwright/e2e/crypto/verification.spec.ts | 67 +- .../e2e/file-upload/image-upload.spec.ts | 45 + playwright/e2e/room/room-header.spec.ts | 22 + .../general-user-settings-tab.spec.ts | 40 +- .../plugins/homeserver/synapse/index.ts | 7 +- .../image-upload-preview-linux.png | Bin 0 -> 68910 bytes .../encrypted-room-header-linux.png | Bin 0 -> 5505 bytes ...ab-should-be-rendered-properly-1-linux.png | Bin 56046 -> 50990 bytes .../general-linux.png | Bin 58473 -> 50505 bytes .../general-smallscreen-linux.png | Bin 40426 -> 27331 bytes ...ly-to-the-location-on-ThreadView-linux.png | Bin 21058 -> 18752 bytes res/css/_common.pcss | 33 +- res/css/_components.pcss | 3 +- .../views/elements/_AppPermission.pcss | 21 - res/css/structures/_SpacePanel.pcss | 7 + res/css/structures/_TabbedView.pcss | 2 +- res/css/structures/_UserMenu.pcss | 4 + .../views/dialogs/_UserSettingsDialog.pcss | 8 + res/css/views/messages/_LegacyCallEvent.pcss | 2 +- res/css/views/rooms/_LegacyRoomHeader.pcss | 5 + res/css/views/settings/_AvatarSetting.pcss | 85 +- ...ettings.pcss => _RoomProfileSettings.pcss} | 20 +- .../views/settings/_UserProfileSettings.pcss | 58 + res/img/feather-customised/user.svg | 11 - res/themes/light-custom/css/_custom.pcss | 2 + src/BasePlatform.ts | 22 +- src/DecryptionFailureTracker.ts | 383 ++- src/DeviceListener.ts | 71 + src/Lifecycle.ts | 38 +- src/MatrixClientPeg.ts | 78 +- src/Modal.tsx | 11 + src/PasswordReset.ts | 4 - src/Searching.ts | 12 +- src/SecurityManager.ts | 10 +- src/SlidingSyncManager.ts | 8 +- src/accessibility/KeyboardShortcuts.ts | 1 + src/accessibility/RovingTabIndex.tsx | 7 +- .../context_menu/ContextMenuTooltipButton.tsx | 10 +- .../roving/RovingAccessibleTooltipButton.tsx | 47 - .../security/CreateSecretStorageDialog.tsx | 3 - src/audio/VoiceMessageRecording.ts | 5 +- src/components/structures/MatrixChat.tsx | 21 +- src/components/structures/RoomSearchView.tsx | 2 +- src/components/structures/SpaceRoomView.tsx | 1 + src/components/structures/UserMenu.tsx | 66 +- .../auth/InteractiveAuthEntryComponents.tsx | 20 +- .../views/auth/LoginWithQR-types.ts | 10 +- src/components/views/auth/LoginWithQR.tsx | 249 +- src/components/views/auth/LoginWithQRFlow.tsx | 149 +- src/components/views/avatars/RoomAvatar.tsx | 26 +- src/components/views/beta/BetaCard.tsx | 15 +- .../views/dialogs/CreateRoomDialog.tsx | 2 +- src/components/views/dialogs/InviteDialog.tsx | 10 +- .../views/dialogs/ServerOfflineDialog.tsx | 2 +- .../views/dialogs/UserSettingsDialog.tsx | 55 +- .../views/dialogs/devtools/ServerInfo.tsx | 2 +- .../security/CreateCrossSigningDialog.tsx | 3 - .../views/directory/NetworkDropdown.tsx | 2 +- .../views/elements/AccessibleButton.tsx | 7 + .../elements/AccessibleTooltipButton.tsx | 118 - .../views/elements/AppPermission.tsx | 44 +- .../views/elements/CopyableText.tsx | 6 +- src/components/views/elements/Field.tsx | 24 +- src/components/views/elements/RoomTopic.tsx | 45 +- src/components/views/elements/Tooltip.tsx | 3 + .../views/elements/TooltipTarget.tsx | 92 - .../views/messages/DownloadActionButton.tsx | 6 +- .../views/messages/MLocationBody.tsx | 15 +- .../views/messages/MessageActionBar.tsx | 26 +- .../views/messages/ReactionsRowButton.tsx | 70 +- .../messages/ReactionsRowButtonTooltip.tsx | 44 +- src/components/views/pips/WidgetPip.tsx | 6 +- .../views/right_panel/EncryptionPanel.tsx | 10 +- src/components/views/right_panel/UserInfo.tsx | 4 +- .../room_settings/RoomProfileSettings.tsx | 101 +- src/components/views/rooms/EventTile.tsx | 26 +- .../EventTile/EventTileThreadToolbar.tsx | 10 +- src/components/views/rooms/ExtraTile.tsx | 10 +- .../views/rooms/MessageComposer.tsx | 128 +- .../views/rooms/MessageComposerFormatBar.tsx | 4 +- .../views/rooms/ReadReceiptGroup.tsx | 150 +- src/components/views/rooms/RoomHeader.tsx | 22 +- .../views/settings/AvatarSetting.tsx | 235 +- .../views/settings/ChangePassword.tsx | 3 - .../views/settings/Notifications.tsx | 10 +- .../views/settings/ProfileSettings.tsx | 228 -- .../views/settings/UserProfileSettings.tsx | 184 ++ .../devices/DeviceExpandDetailsButton.tsx | 8 +- .../settings/devices/LoginWithQRSection.tsx | 44 +- .../tabs/user/GeneralUserSettingsTab.tsx | 4 +- .../settings/tabs/user/SessionManagerTab.tsx | 42 +- src/components/views/spaces/SpacePanel.tsx | 25 +- .../user-onboarding/UserOnboardingButton.tsx | 6 +- src/components/views/voip/LegacyCallView.tsx | 15 +- src/contexts/ToastContext.tsx | 93 + src/dispatcher/payloads/OpenToTabPayload.ts | 5 + src/editor/operations.ts | 2 +- src/hooks/useIsReleaseAnnouncementOpen.ts | 21 +- src/hooks/usePublicRoomDirectory.ts | 4 +- src/i18n/strings/cs.json | 7 +- src/i18n/strings/de_DE.json | 7 +- src/i18n/strings/el.json | 6 +- src/i18n/strings/en_EN.json | 38 +- src/i18n/strings/eo.json | 6 +- src/i18n/strings/es.json | 7 +- src/i18n/strings/et.json | 7 +- src/i18n/strings/fa.json | 6 +- src/i18n/strings/fi.json | 7 +- src/i18n/strings/fr.json | 7 +- src/i18n/strings/gl.json | 6 +- src/i18n/strings/he.json | 6 - src/i18n/strings/hu.json | 7 +- src/i18n/strings/id.json | 7 +- src/i18n/strings/is.json | 6 +- src/i18n/strings/it.json | 7 +- src/i18n/strings/ja.json | 7 +- src/i18n/strings/lo.json | 6 +- src/i18n/strings/lt.json | 6 +- src/i18n/strings/nl.json | 6 +- src/i18n/strings/pl.json | 68 +- src/i18n/strings/pt_BR.json | 6 +- src/i18n/strings/ru.json | 7 +- src/i18n/strings/sk.json | 7 +- src/i18n/strings/sq.json | 7 +- src/i18n/strings/sv.json | 7 +- src/i18n/strings/uk.json | 7 +- src/i18n/strings/vi.json | 6 +- src/i18n/strings/zh_Hans.json | 9 +- src/i18n/strings/zh_Hant.json | 7 +- src/rageshake/submit-rageshake.ts | 6 +- src/stores/ReleaseAnnouncementStore.ts | 4 +- src/utils/AutoDiscoveryUtils.tsx | 2 +- src/utils/PasswordScorer.ts | 13 +- src/utils/createVoiceMessageContent.ts | 8 +- src/utils/device/dehydration.ts | 4 +- src/utils/dm/createDmLocalRoom.ts | 3 - src/utils/tokens/pickling.ts | 42 +- src/utils/useId.ts | 24 + src/utils/useTooltip.tsx | 37 - test/DecryptionFailureTracker-test.ts | 579 +++- test/DeviceListener-test.ts | 384 ++- test/Lifecycle-test.ts | 123 +- test/MatrixClientPeg-test.ts | 11 +- test/PosthogAnalytics-test.ts | 3 +- test/TextForEvent-test.ts | 32 +- test/accessibility/RovingTabIndex-test.tsx | 5 +- test/audio/VoiceMessageRecording-test.ts | 7 +- .../components/structures/MatrixChat-test.tsx | 1 + .../structures/ReleaseAnnouncement-test.tsx | 32 +- test/components/structures/RoomView-test.tsx | 1 - test/components/structures/UserMenu-test.tsx | 54 +- .../__snapshots__/RoomView-test.tsx.snap | 12 - .../structures/auth/ForgotPassword-test.tsx | 12 - .../InteractiveAuthEntryComponents-test.tsx | 65 + ...teractiveAuthEntryComponents-test.tsx.snap | 34 + .../views/dialogs/RoomSettingsDialog-test.tsx | 6 + .../views/dialogs/SpotlightDialog-test.tsx | 2 +- .../CreateSecretStorageDialog-test.tsx | 4 +- .../security/ExportE2eKeysDialog-test.tsx | 4 +- .../security/ImportE2eKeysDialog-test.tsx | 4 +- test/components/views/elements/Field-test.tsx | 12 + .../views/elements/RoomTopic-test.tsx | 42 +- .../views/elements/TooltipTarget-test.tsx | 82 - .../__snapshots__/AppTile-test.tsx.snap | 5 - .../__snapshots__/TooltipTarget-test.tsx.snap | 112 - .../views/emojipicker/EmojiPicker-test.tsx | 6 +- .../messages/ReactionsRowButton-test.tsx | 14 + .../views/messages/TextualBody-test.tsx | 2 +- .../__snapshots__/MLocationBody-test.tsx.snap | 6 +- .../ReactionsRowButton-test.tsx.snap | 23 +- .../__snapshots__/TextualBody-test.tsx.snap | 8 +- .../views/right_panel/UserInfo-test.tsx | 28 +- .../__snapshots__/UserInfo-test.tsx.snap | 173 ++ .../RoomProfileSettings-test.tsx | 112 + .../components/views/rooms/EventTile-test.tsx | 3 +- .../views/rooms/ReadReceiptGroup-test.tsx | 65 +- .../__snapshots__/ExtraTile-test.tsx.snap | 1 + .../ReadReceiptGroup-test.tsx.snap | 94 + .../views/settings/AvatarSetting-test.tsx | 54 +- .../settings/UserProfileSettings-test.tsx | 193 ++ .../settings/devices/LoginWithQR-test.tsx | 597 ++-- .../settings/devices/LoginWithQRFlow-test.tsx | 36 +- .../devices/LoginWithQRSection-test.tsx | 146 +- .../LoginWithQRFlow-test.tsx.snap | 746 +++-- .../LoginWithQRSection-test.tsx.snap | 10 +- .../PeopleRoomSettingsTab-test.tsx.snap | 1 - .../tabs/user/GeneralUserSettingsTab-test.tsx | 9 +- .../tabs/user/SessionManagerTab-test.tsx | 79 +- .../GeneralUserSettingsTab-test.tsx.snap | 8 +- .../AddExistingToSpaceDialog-test.tsx.snap | 1 - .../__snapshots__/SpacePanel-test.tsx.snap | 4 +- .../ThreadsActivityCentre-test.tsx.snap | 2 +- test/contexts/ToastContext-test.ts | 43 + test/createRoom-test.ts | 3 +- test/editor/operations-test.ts | 8 +- test/hooks/usePublicRoomDirectory-test.tsx | 2 +- test/hooks/useUserDirectory-test.tsx | 2 +- test/stores/SetupEncryptionStore-test.ts | 3 +- test/submit-rageshake-test.ts | 4 +- test/test-utils/client.ts | 5 +- test/test-utils/oidc.ts | 1 + test/test-utils/test-utils.ts | 10 +- test/toasts/UnverifiedSessionToast-test.tsx | 3 +- test/utils/AutoDiscoveryUtils-test.tsx | 2 +- test/utils/createVoiceMessageContent-test.ts | 4 +- yarn.lock | 2414 ++++++++++------- 216 files changed, 6924 insertions(+), 3939 deletions(-) create mode 100644 .github/workflows/playwright-image-updates.yaml create mode 100644 playwright/e2e/file-upload/image-upload.spec.ts create mode 100644 playwright/snapshots/file-upload/image-upload.spec.ts/image-upload-preview-linux.png create mode 100644 playwright/snapshots/room/room-header.spec.ts/encrypted-room-header-linux.png rename res/css/views/settings/{_ProfileSettings.pcss => _RoomProfileSettings.pcss} (73%) create mode 100644 res/css/views/settings/_UserProfileSettings.pcss delete mode 100644 res/img/feather-customised/user.svg delete mode 100644 src/accessibility/roving/RovingAccessibleTooltipButton.tsx delete mode 100644 src/components/views/elements/AccessibleTooltipButton.tsx delete mode 100644 src/components/views/elements/TooltipTarget.tsx delete mode 100644 src/components/views/settings/ProfileSettings.tsx create mode 100644 src/components/views/settings/UserProfileSettings.tsx create mode 100644 src/contexts/ToastContext.tsx create mode 100644 src/utils/useId.ts delete mode 100644 src/utils/useTooltip.tsx create mode 100644 test/components/views/auth/InteractiveAuthEntryComponents-test.tsx create mode 100644 test/components/views/auth/__snapshots__/InteractiveAuthEntryComponents-test.tsx.snap delete mode 100644 test/components/views/elements/TooltipTarget-test.tsx delete mode 100644 test/components/views/elements/__snapshots__/TooltipTarget-test.tsx.snap create mode 100644 test/components/views/room_settings/RoomProfileSettings-test.tsx create mode 100644 test/components/views/rooms/__snapshots__/ReadReceiptGroup-test.tsx.snap create mode 100644 test/components/views/settings/UserProfileSettings-test.tsx create mode 100644 test/contexts/ToastContext-test.ts diff --git a/.eslintrc.js b/.eslintrc.js index caeeca403d..4bec4e8320 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -98,8 +98,6 @@ module.exports = { "!matrix-js-sdk/src/secret-storage", "!matrix-js-sdk/src/room-hierarchy", "!matrix-js-sdk/src/rendezvous", - "!matrix-js-sdk/src/rendezvous/transports", - "!matrix-js-sdk/src/rendezvous/channels", "!matrix-js-sdk/src/indexeddb-worker", "!matrix-js-sdk/src/pushprocessor", "!matrix-js-sdk/src/extensible_events_v1", diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 91764ba7f5..e7963c2673 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,4 +11,7 @@ /src/stores/SetupEncryptionStore.ts @matrix-org/element-crypto-web-reviewers /test/stores/SetupEncryptionStore-test.ts @matrix-org/element-crypto-web-reviewers +# Ignore translations as those will be updated by GHA for Localazy download /src/i18n/strings +# Ignore the synapse plugin as this is updated by GHA for docker image updating +/playwright/plugins/homeserver/synapse/index.ts diff --git a/.github/workflows/end-to-end-tests-netlify.yaml b/.github/workflows/end-to-end-tests-netlify.yaml index 4667bfb02b..a488cbbfb0 100644 --- a/.github/workflows/end-to-end-tests-netlify.yaml +++ b/.github/workflows/end-to-end-tests-netlify.yaml @@ -21,38 +21,13 @@ jobs: statuses: write deployments: write steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Download blob reports from GitHub Actions Artifacts + - name: Download HTML report uses: actions/download-artifact@v4 with: github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} run-id: ${{ github.event.workflow_run.id }} - pattern: all-blob-reports-* - path: all-blob-reports - merge-multiple: true - - - name: Merge into HTML Report - run: yarn playwright merge-reports --reporter=html,./playwright/flaky-reporter.ts ./all-blob-reports - env: - # Only pass creds to the flaky-reporter on main branch runs - GITHUB_TOKEN: ${{ github.event.workflow_run.head_branch == 'develop' && secrets.ELEMENT_BOT_TOKEN || '' }} - - - name: Upload HTML report - uses: actions/upload-artifact@v4 - with: - name: html-report--attempt-${{ github.run_attempt }} + name: html-report path: playwright-report - retention-days: 14 - name: 📤 Deploy to Netlify uses: matrix-org/netlify-pr-preview@v3 diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 0e224c04db..b663948254 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -46,6 +46,7 @@ jobs: build: name: "Build Element-Web" runs-on: ubuntu-latest + if: inputs.skip != true steps: - name: Checkout code uses: actions/checkout@v4 @@ -163,5 +164,43 @@ jobs: if: always() runs-on: ubuntu-latest steps: + - uses: actions/checkout@v4 + if: inputs.skip != true + with: + persist-credentials: false + repository: ${{ inputs.react-sdk-repository || github.repository }} + + - uses: actions/setup-node@v4 + if: inputs.skip != true + with: + cache: "yarn" + + - name: Install dependencies + if: inputs.skip != true + run: yarn install --frozen-lockfile + + - name: Download blob reports from GitHub Actions Artifacts + if: inputs.skip != true + uses: actions/download-artifact@v4 + with: + pattern: all-blob-reports-* + path: all-blob-reports + merge-multiple: true + + - name: Merge into HTML Report + if: inputs.skip != true + run: yarn playwright merge-reports --reporter=html,./playwright/flaky-reporter.ts ./all-blob-reports + env: + # Only pass creds to the flaky-reporter on main branch runs + GITHUB_TOKEN: ${{ github.event.workflow_run.head_branch == 'develop' && secrets.ELEMENT_BOT_TOKEN || '' }} + + - name: Upload HTML report + if: inputs.skip != true + uses: actions/upload-artifact@v4 + with: + name: html-report + path: playwright-report + retention-days: 14 + - if: needs.playwright.result != 'skipped' && needs.playwright.result != 'success' run: exit 1 diff --git a/.github/workflows/playwright-image-updates.yaml b/.github/workflows/playwright-image-updates.yaml new file mode 100644 index 0000000000..15bea28e0f --- /dev/null +++ b/.github/workflows/playwright-image-updates.yaml @@ -0,0 +1,45 @@ +name: Update Playwright docker images +on: + workflow_dispatch: {} + schedule: + - cron: "0 6 * * *" # Every day at 6am UTC +jobs: + update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Update matrixdotorg/synapse image + run: | + docker pull "$IMAGE" + INSPECT=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") + DIGEST=${INSPECT#*@} + sed -i "s/const DOCKER_TAG.*/const DOCKER_TAG = \"develop@$DIGEST\";/" playwright/plugins/homeserver/synapse/index.ts + env: + IMAGE: matrixdotorg/synapse:develop + + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@153407881ec5c347639a548ade7d8ad1d6740e38 # v5 + with: + token: ${{ secrets.ELEMENT_BOT_TOKEN }} + branch: actions/playwright-image-updates + delete-branch: true + title: Playwright Docker image updates + labels: | + T-Task + + - name: Enable automerge + run: gh pr merge --merge --auto "$PR_NUMBER" + if: steps.cpr.outputs.pull-request-operation == 'created' + env: + GH_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} + PR_NUMBER: ${{ steps.cpr.outputs.pull-request-number }} + + - name: Enable autoapprove + run: | + gh pr review --approve "$PR_NUMBER" + if: steps.cpr.outputs.pull-request-operation == 'created' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ steps.cpr.outputs.pull-request-number }} diff --git a/.github/workflows/static_analysis.yaml b/.github/workflows/static_analysis.yaml index 070ac5f854..6e225467af 100644 --- a/.github/workflows/static_analysis.yaml +++ b/.github/workflows/static_analysis.yaml @@ -27,7 +27,7 @@ jobs: cache: "yarn" - name: Install Deps - run: "./scripts/ci/install-deps.sh --ignore-scripts" + run: "./scripts/ci/install-deps.sh" - name: Typecheck run: "yarn run lint:types" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7089569f73..3815c4fb4c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -47,7 +47,7 @@ jobs: cache: "yarn" - name: Install Deps - run: "./scripts/ci/install-deps.sh --ignore-scripts" + run: "./scripts/ci/install-deps.sh" env: JS_SDK_GITHUB_BASE_REF: ${{ inputs.matrix-js-sdk-sha }} diff --git a/CHANGELOG.md b/CHANGELOG.md index ea324f0e03..ea499883aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,45 @@ +Changes in [3.101.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.101.0) (2024-06-18) +======================================================================================================= +## ✨ Features + +* Change avatar setting component to use a menu ([#12585](https://github.com/matrix-org/matrix-react-sdk/pull/12585)). Contributed by @dbkr. +* New user profile UI in User Settings ([#12548](https://github.com/matrix-org/matrix-react-sdk/pull/12548)). Contributed by @dbkr. +* MSC4108 support OIDC QR code login ([#12370](https://github.com/matrix-org/matrix-react-sdk/pull/12370)). Contributed by @t3chguy. + +## 🐛 Bug Fixes + +* [Backport staging] Fix image upload preview size ([#12612](https://github.com/matrix-org/matrix-react-sdk/pull/12612)). Contributed by @RiotRobot. +* Fix roving tab index crash `compareDocumentPosition` ([#12594](https://github.com/matrix-org/matrix-react-sdk/pull/12594)). Contributed by @t3chguy. +* Keep dialog glass border on narrow screens ([#12591](https://github.com/matrix-org/matrix-react-sdk/pull/12591)). Contributed by @dbkr. +* Add missing a11y label to dismiss onboarding button in room list ([#12587](https://github.com/matrix-org/matrix-react-sdk/pull/12587)). Contributed by @t3chguy. +* Add hover / active state on avatar setting upload button ([#12590](https://github.com/matrix-org/matrix-react-sdk/pull/12590)). Contributed by @dbkr. +* Fix EditInPlace button styles ([#12589](https://github.com/matrix-org/matrix-react-sdk/pull/12589)). Contributed by @dbkr. +* Fix incorrect assumptions about required fields in /search response ([#12575](https://github.com/matrix-org/matrix-react-sdk/pull/12575)). Contributed by @t3chguy. +* Fix display of no avatar in avatar setting controls ([#12558](https://github.com/matrix-org/matrix-react-sdk/pull/12558)). Contributed by @dbkr. +* Element-R: pass pickleKey in as raw key for indexeddb encryption ([#12543](https://github.com/matrix-org/matrix-react-sdk/pull/12543)). Contributed by @richvdh. + + +Changes in [3.100.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.100.0) (2024-06-04) +======================================================================================================= +## ✨ Features + +* Tooltip: Improve accessibility for context menus ([#12462](https://github.com/matrix-org/matrix-react-sdk/pull/12462)). Contributed by @florianduros. +* Tooltip: Improve accessibility of space panel ([#12525](https://github.com/matrix-org/matrix-react-sdk/pull/12525)). Contributed by @florianduros. + +## 🐛 Bug Fixes + +* Close the release announcement when a dialog is opened ([#12559](https://github.com/matrix-org/matrix-react-sdk/pull/12559)). Contributed by @florianduros. +* Tooltip: close field tooltip when ESC is pressed ([#12553](https://github.com/matrix-org/matrix-react-sdk/pull/12553)). Contributed by @florianduros. +* Fix tabbedview breakpoint width ([#12556](https://github.com/matrix-org/matrix-react-sdk/pull/12556)). Contributed by @dbkr. +* Fix E2E icon display in room header ([#12545](https://github.com/matrix-org/matrix-react-sdk/pull/12545)). Contributed by @florianduros. +* Tooltip: Improve placement for space settings ([#12541](https://github.com/matrix-org/matrix-react-sdk/pull/12541)). Contributed by @florianduros. +* Fix deformed avatar in a call in a narrow timeline ([#12538](https://github.com/matrix-org/matrix-react-sdk/pull/12538)). Contributed by @florianduros. +* Shown own sent state indicator even when showReadReceipts is disabled ([#12540](https://github.com/matrix-org/matrix-react-sdk/pull/12540)). Contributed by @t3chguy. +* Ensure we do not fire the verification mismatch modal multiple times ([#12526](https://github.com/matrix-org/matrix-react-sdk/pull/12526)). Contributed by @t3chguy. +* Fix avatar in chat export ([#12537](https://github.com/matrix-org/matrix-react-sdk/pull/12537)). Contributed by @florianduros. +* Use `*` for italics as it doesn't break when used mid-word ([#12523](https://github.com/matrix-org/matrix-react-sdk/pull/12523)). Contributed by @t3chguy. + + Changes in [3.99.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.99.0) (2024-05-07) ===================================================================================================== ## ✨ Features diff --git a/package.json b/package.json index 01e1ff56c5..6e21f438d1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "matrix-react-sdk", "version": "0.0.0", - "version-matrix": "3.100.0-rc.0", + "version-matrix": "3.101.0", "description": "SDK for matrix.org using React for Tchap", "author": "DINUM", "repository": { @@ -63,12 +63,13 @@ "resolutions": { "@types/react-dom": "17.0.25", "@types/react": "17.0.80", + "@types/seedrandom": "3.0.4", "oidc-client-ts": "3.0.1", "jwt-decode": "4.0.0" }, "dependencies": { "@babel/runtime": "^7.12.5", - "@matrix-org/analytics-events": "^0.20.0", + "@matrix-org/analytics-events": "^0.21.0", "@matrix-org/emojibase-bindings": "^1.1.2", "@matrix-org/matrix-wysiwyg": "2.17.0", "@matrix-org/olm": "3.2.15", @@ -77,11 +78,12 @@ "@sentry/browser": "^7.0.0", "@testing-library/react-hooks": "^8.0.1", "@vector-im/compound-design-tokens": "^1.2.0", - "@vector-im/compound-web": "^4.2.0", + "@vector-im/compound-web": "^4.4.1", "@zxcvbn-ts/core": "^3.0.4", "@zxcvbn-ts/language-common": "^3.0.4", "@zxcvbn-ts/language-en": "^3.0.2", "await-lock": "^2.1.0", + "bloom-filters": "^3.0.1", "blurhash": "^2.0.3", "classnames": "^2.2.6", "commonmark": "^0.31.0", @@ -91,7 +93,7 @@ "emojibase-regex": "15.3.0", "escape-html": "^1.0.3", "file-saver": "^2.0.5", - "filesize": "10.1.1", + "filesize": "10.1.2", "gfm.css": "^1.1.2", "glob-to-regexp": "^0.4.1", "graphemer": "^1.4.0", @@ -109,7 +111,7 @@ "maplibre-gl": "^2.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "32.3.0-rc.0", + "matrix-js-sdk": "33.1.0", "matrix-widget-api": "^1.5.0", "memoize-one": "^6.0.0", "minimist": "^1.2.5", @@ -117,7 +119,7 @@ "opus-recorder": "^8.0.3", "pako": "^2.0.3", "png-chunks-extract": "^1.0.0", - "posthog-js": "1.130.1", + "posthog-js": "1.135.2", "proposal-temporal": "^0.9.0", "qrcode": "1.5.3", "re-resizable": "^6.9.0", @@ -183,25 +185,26 @@ "@types/react-transition-group": "^4.4.0", "@types/sanitize-html": "2.11.0", "@types/sdp-transform": "^2.4.6", + "@types/seedrandom": "3.0.4", "@types/tar-js": "^0.3.2", "@types/ua-parser-js": "^0.7.36", "@types/uuid": "^9.0.2", "@typescript-eslint/eslint-plugin": "^7.0.0", "@typescript-eslint/parser": "^7.0.0", - "axe-core": "4.9.0", + "axe-core": "4.9.1", "babel-jest": "^29.0.0", "blob-polyfill": "^7.0.0", "eslint": "8.57.0", "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^9.0.0", - "eslint-plugin-deprecate": "0.8.4", + "eslint-plugin-deprecate": "0.8.5", "eslint-plugin-import": "^2.25.4", "eslint-plugin-jest": "^28.0.0", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-matrix-org": "1.2.1", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-unicorn": "^52.0.0", + "eslint-plugin-unicorn": "^53.0.0", "express": "^4.18.2", "fake-indexeddb": "^5.0.2", "fetch-mock-jest": "^1.5.1", diff --git a/playwright/Dockerfile b/playwright/Dockerfile index 46d617ccc2..7179e08ab0 100644 --- a/playwright/Dockerfile +++ b/playwright/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/playwright:v1.43.1-jammy +FROM mcr.microsoft.com/playwright:v1.44.1-jammy WORKDIR /work/matrix-react-sdk VOLUME ["/work/element-web/node_modules"] diff --git a/playwright/e2e/crypto/verification.spec.ts b/playwright/e2e/crypto/verification.spec.ts index 6819606b64..e471b6b2f5 100644 --- a/playwright/e2e/crypto/verification.spec.ts +++ b/playwright/e2e/crypto/verification.spec.ts @@ -240,24 +240,26 @@ test.describe("User verification", () => { test.use({ displayName: "Alice", botCreateOpts: { displayName: "Bob", autoAcceptInvites: true, userIdPrefix: "bob_" }, + room: async ({ page, app, bot: bob, user: aliceCredentials }, use) => { + await app.client.bootstrapCrossSigning(aliceCredentials); + + // the other user creates a DM + const dmRoomId = await createDMRoom(bob, aliceCredentials.userId); + + // accept the DM + await app.viewRoomByName("Bob"); + await page.getByRole("button", { name: "Start chatting" }).click(); + await use({ roomId: dmRoomId }); + }, }); test("can receive a verification request when there is no existing DM", async ({ page, - app, bot: bob, user: aliceCredentials, toasts, + room: { roomId: dmRoomId }, }) => { - await app.client.bootstrapCrossSigning(aliceCredentials); - - // the other user creates a DM - const dmRoomId = await createDMRoom(bob, aliceCredentials.userId); - - // accept the DM - await app.viewRoomByName("Bob"); - await page.getByRole("button", { name: "Start chatting" }).click(); - // once Alice has joined, Bob starts the verification const bobVerificationRequest = await bob.evaluateHandle( async (client, { dmRoomId, aliceCredentials }) => { @@ -294,6 +296,51 @@ test.describe("User verification", () => { await expect(page.getByText("You've successfully verified Bob!")).toBeVisible(); await page.getByRole("button", { name: "Got it" }).click(); }); + + test("can abort emoji verification when emoji mismatch", async ({ + page, + bot: bob, + user: aliceCredentials, + toasts, + room: { roomId: dmRoomId }, + cryptoBackend, + }) => { + test.skip(cryptoBackend === "legacy", "Not implemented for legacy crypto"); + + // once Alice has joined, Bob starts the verification + const bobVerificationRequest = await bob.evaluateHandle( + async (client, { dmRoomId, aliceCredentials }) => { + const room = client.getRoom(dmRoomId); + while (room.getMember(aliceCredentials.userId)?.membership !== "join") { + await new Promise((resolve) => { + room.once(window.matrixcs.RoomStateEvent.Members, resolve); + }); + } + + return client.getCrypto().requestVerificationDM(aliceCredentials.userId, dmRoomId); + }, + { dmRoomId, aliceCredentials }, + ); + + // Accept verification via toast + const toast = await toasts.getToast("Verification requested"); + await toast.getByRole("button", { name: "Verify Session" }).click(); + + // request verification by emoji + await page.locator("#mx_RightPanel").getByRole("button", { name: "Verify by emoji" }).click(); + + /* on the bot side, wait for the verifier to exist ... */ + const botVerifier = await awaitVerifier(bobVerificationRequest); + // ... confirm ... + botVerifier.evaluate((verifier) => verifier.verify()).catch(() => {}); + // ... and abort the verification + await page.getByRole("button", { name: "They don't match" }).click(); + + const dialog = page.locator(".mx_Dialog"); + await expect(dialog.getByText("Your messages are not secure")).toBeVisible(); + await dialog.getByRole("button", { name: "OK" }).click(); + await expect(dialog).not.toBeVisible(); + }); }); /** Extract the qrcode out of an on-screen html element */ diff --git a/playwright/e2e/file-upload/image-upload.spec.ts b/playwright/e2e/file-upload/image-upload.spec.ts new file mode 100644 index 0000000000..8f0403af31 --- /dev/null +++ b/playwright/e2e/file-upload/image-upload.spec.ts @@ -0,0 +1,45 @@ +/* +Copyright 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { test, expect } from "../../element-web-test"; + +test.describe("Image Upload", () => { + test.use({ + displayName: "Alice", + }); + + test.beforeEach(async ({ page, app, user }) => { + await app.client.createRoom({ name: "My Pictures" }); + await app.viewRoomByName("My Pictures"); + + // Wait until configuration is finished + await expect( + page + .locator(".mx_GenericEventListSummary[data-layout='group'] .mx_GenericEventListSummary_summary") + .getByText(`${user.displayName} created and configured the room.`), + ).toBeVisible(); + }); + + test("should show image preview when uploading an image", async ({ page, app }) => { + await page + .locator(".mx_MessageComposer_actions input[type='file']") + .setInputFiles("playwright/sample-files/riot.png"); + + expect(page.getByRole("button", { name: "Upload" })).toBeEnabled(); + expect(page.getByRole("button", { name: "Close dialog" })).toBeEnabled(); + expect(page).toMatchScreenshot("image-upload-preview.png"); + }); +}); diff --git a/playwright/e2e/room/room-header.spec.ts b/playwright/e2e/room/room-header.spec.ts index a3c5e8c8bc..4008517d09 100644 --- a/playwright/e2e/room/room-header.spec.ts +++ b/playwright/e2e/room/room-header.spec.ts @@ -276,4 +276,26 @@ test.describe("Room Header", () => { await expect(header).toMatchScreenshot("room-header-with-apps-button-not-highlighted.png"); }); }); + + test.describe("with encryption", () => { + test("should render the E2E icon and the buttons", async ({ page, app, user }) => { + // Create an encrypted room + await app.client.createRoom({ + name: "Test Encrypted Room", + initial_state: [ + { + type: "m.room.encryption", + state_key: "", + content: { + algorithm: "m.megolm.v1.aes-sha2", + }, + }, + ], + }); + await app.viewRoomByName("Test Encrypted Room"); + + const header = page.locator(".mx_LegacyRoomHeader"); + await expect(header).toMatchScreenshot("encrypted-room-header.png"); + }); + }); }); diff --git a/playwright/e2e/settings/general-user-settings-tab.spec.ts b/playwright/e2e/settings/general-user-settings-tab.spec.ts index 625f1d6bd5..41210292a3 100644 --- a/playwright/e2e/settings/general-user-settings-tab.spec.ts +++ b/playwright/e2e/settings/general-user-settings-tab.spec.ts @@ -21,8 +21,6 @@ const USER_NAME_NEW = "Alice"; const IntegrationManager = "scalar.vector.im"; test.describe("General user settings tab", () => { - let userId: string; - test.use({ displayName: USER_NAME, config: { @@ -34,26 +32,18 @@ test.describe("General user settings tab", () => { }, }); - test("should be rendered properly", async ({ uut }) => { + test("should be rendered properly", async ({ uut, user }) => { await expect(uut).toMatchScreenshot("general.png"); // Assert that the top heading is rendered await expect(uut.getByRole("heading", { name: "General" })).toBeVisible(); - const profile = uut.locator(".mx_ProfileSettings_profile"); + const profile = uut.locator(".mx_UserProfileSettings_profile"); await profile.scrollIntoViewIfNeeded(); await expect(profile.getByRole("textbox", { name: "Display Name" })).toHaveValue(USER_NAME); // Assert that a userId is rendered - await expect(profile.locator(".mx_ProfileSettings_profile_controls_userId", { hasText: userId })).toBeVisible(); - - // Check avatar setting - const avatar = profile.locator(".mx_AvatarSetting_avatar"); - await avatar.hover(); - - // Hover effect - await expect(avatar.locator(".mx_AvatarSetting_hoverBg")).toBeVisible(); - await expect(avatar.locator(".mx_AvatarSetting_hover span").getByText("Upload")).toBeVisible(); + expect(uut.getByLabel("Username")).toHaveText(user.userId); // Wait until spinners disappear await expect(uut.getByTestId("accountSection").locator(".mx_Spinner")).not.toBeVisible(); @@ -130,20 +120,20 @@ test.describe("General user settings tab", () => { await expect(uut).toMatchScreenshot("general-smallscreen.png"); }); - test("should support adding and removing a profile picture", async ({ uut }) => { - const profileSettings = uut.locator(".mx_ProfileSettings"); + test("should support adding and removing a profile picture", async ({ uut, page }) => { + const profileSettings = uut.locator(".mx_UserProfileSettings"); // Upload a picture - await profileSettings - .locator(".mx_ProfileSettings_avatarUpload") - .setInputFiles("playwright/sample-files/riot.png"); + await profileSettings.getByAltText("Upload").setInputFiles("playwright/sample-files/riot.png"); - // Find and click "Remove" link button - await profileSettings.locator(".mx_ProfileSettings_profile").getByRole("button", { name: "Remove" }).click(); + // Image should be visible + await expect(profileSettings.locator(".mx_AvatarSetting_avatar img")).toBeVisible(); - // Assert that the link button disappeared - await expect( - profileSettings.locator(".mx_AvatarSetting_avatar .mx_AccessibleButton_kind_link_sm"), - ).not.toBeVisible(); + // Open the menu & click remove + await profileSettings.getByRole("button", { name: "Profile Picture" }).click(); + await page.getByRole("menuitem", { name: "Remove" }).click(); + + // Assert that the image disappeared + await expect(profileSettings.locator(".mx_AvatarSetting_avatar img")).not.toBeVisible(); }); test("should set a country calling code based on default_country_code", async ({ uut }) => { @@ -177,7 +167,7 @@ test.describe("General user settings tab", () => { test("should support changing a display name", async ({ uut, page, app }) => { // Change the diaplay name to USER_NAME_NEW const displayNameInput = uut - .locator(".mx_SettingsTab .mx_ProfileSettings") + .locator(".mx_SettingsTab .mx_UserProfileSettings") .getByRole("textbox", { name: "Display Name" }); await displayNameInput.fill(USER_NAME_NEW); await displayNameInput.press("Enter"); diff --git a/playwright/plugins/homeserver/synapse/index.ts b/playwright/plugins/homeserver/synapse/index.ts index c11f937cf3..c88fd641d9 100644 --- a/playwright/plugins/homeserver/synapse/index.ts +++ b/playwright/plugins/homeserver/synapse/index.ts @@ -25,6 +25,11 @@ import { Docker } from "../../docker"; import { HomeserverConfig, HomeserverInstance, Homeserver, StartHomeserverOpts, Credentials } from ".."; import { randB64Bytes } from "../../utils/rand"; +// Docker tag to use for `matrixdotorg/synapse` image. +// We target a specific digest as every now and then a Synapse update will break our CI. +// This digest is updated by the playwright-image-updates.yaml workflow periodically. +const DOCKER_TAG = "develop@sha256:c357ea1486c8cd2613932e97bd2f6ff4e8b4c4fafcb2c28d1e8ec0d383c56d9d"; + async function cfgDirFromTemplate(opts: StartHomeserverOpts): Promise> { const templateDir = path.join(__dirname, "templates", opts.template); @@ -103,7 +108,7 @@ export class Synapse implements Homeserver, HomeserverInstance { console.log(`Starting synapse with config dir ${synCfg.configDir}...`); const dockerSynapseParams = ["-v", `${synCfg.configDir}:/data`, "-p", `${synCfg.port}:8008/tcp`]; const synapseId = await this.docker.run({ - image: "matrixdotorg/synapse:develop", + image: `matrixdotorg/synapse:${DOCKER_TAG}`, containerName: `react-sdk-playwright-synapse`, params: dockerSynapseParams, cmd: ["run"], diff --git a/playwright/snapshots/file-upload/image-upload.spec.ts/image-upload-preview-linux.png b/playwright/snapshots/file-upload/image-upload.spec.ts/image-upload-preview-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..75a9c353deeda4f230f2920bb436e94936199504 GIT binary patch literal 68910 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 literal 0 HcmV?d00001 diff --git a/playwright/snapshots/room/room-header.spec.ts/encrypted-room-header-linux.png b/playwright/snapshots/room/room-header.spec.ts/encrypted-room-header-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..6dced2e99093b4809375d86f6d95443fe6533b92 GIT binary patch literal 5505 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 literal 0 HcmV?d00001 diff --git a/playwright/snapshots/settings/general-room-settings-tab.spec.ts/General-room-settings-tab-should-be-rendered-properly-1-linux.png b/playwright/snapshots/settings/general-room-settings-tab.spec.ts/General-room-settings-tab-should-be-rendered-properly-1-linux.png index 253b230419cb4db41dc8e2303d59d9667ab4099a..57e2a4026cc001fe2e61454b697107d70ccd374d 100644 GIT binary patch literal 50990 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 VTB!sScTrOm2{BpGLSenH{~y!^?WzC( literal 56046 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 >WTp2UTZP-J_3o8 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 diff --git a/playwright/snapshots/settings/general-user-settings-tab.spec.ts/general-smallscreen-linux.png b/playwright/snapshots/settings/general-user-settings-tab.spec.ts/general-smallscreen-linux.png index 75febc97d7a1bff2ad01c8b9f18ac968a8534feb..d59d2946da7de6c202e071202f9dfbc99f8c3933 100644 GIT binary patch literal 27331 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 literal 40426 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 KYNaYxVgCZNmp+sL diff --git a/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png b/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png index 9fc79671a10e60c39fc55c02b454febe67e32e88..281f1cebe5b09c7d336f3b74c0e5ec45491f8596 100644 GIT binary patch literal 18752 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 literal 21058 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 kUB1*++W%HpJ56AZPc?f#0H2KA^#A|> diff --git a/res/css/_common.pcss b/res/css/_common.pcss index 20ed9dfa39..d120194491 100644 --- a/res/css/_common.pcss +++ b/res/css/_common.pcss @@ -332,7 +332,10 @@ legend { .mx_Dialog_border { z-index: var(--dialog-zIndex-standard); position: relative; - max-height: calc(100% - var(--cpd-space-12x)); + width: 100%; + max-width: fit-content; + box-sizing: border-box; + max-height: calc(100% - var(--cpd-space-6x)); display: flex; flex-direction: column; @@ -597,7 +600,10 @@ legend { * Elements that should not be styled like a dialog button are mentioned in a :not() pseudo-class. * For the widest browser support, we use multiple :not pseudo-classes instead of :not(.a, .b). */ -.mx_Dialog button:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]):not(.mx_AccessibleButton), +.mx_Dialog + button:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]):not(.mx_AccessibleButton):not( + .mx_UserProfileSettings button + ), .mx_Dialog input[type="submit"], .mx_Dialog_buttons button:not(.mx_Dialog_nonDialogButton):not(.mx_AccessibleButton), .mx_Dialog_buttons input[type="submit"] { @@ -614,11 +620,17 @@ legend { font-family: inherit; } -.mx_Dialog button:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]):not(.mx_AccessibleButton):last-child { +.mx_Dialog + button:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]):not(.mx_AccessibleButton):not( + .mx_UserProfileSettings button + ):last-child { margin-right: 0px; } -.mx_Dialog button:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]):not(.mx_AccessibleButton):focus, +.mx_Dialog + button:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]):not(.mx_AccessibleButton):not( + .mx_UserProfileSettings button + ):focus, .mx_Dialog input[type="submit"]:focus, .mx_Dialog_buttons button:not(.mx_Dialog_nonDialogButton):not(.mx_AccessibleButton):focus, .mx_Dialog_buttons input[type="submit"]:focus { @@ -627,7 +639,10 @@ legend { .mx_Dialog button.mx_Dialog_primary:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]), .mx_Dialog input[type="submit"].mx_Dialog_primary, -.mx_Dialog_buttons button.mx_Dialog_primary:not(.mx_Dialog_nonDialogButton):not(.mx_AccessibleButton), +.mx_Dialog_buttons + button.mx_Dialog_primary:not(.mx_Dialog_nonDialogButton):not(.mx_AccessibleButton):not( + .mx_UserProfileSettings button + ), .mx_Dialog_buttons input[type="submit"].mx_Dialog_primary { color: var(--cpd-color-text-on-solid-primary); background-color: var(--cpd-color-bg-action-primary-rest); @@ -637,7 +652,8 @@ legend { .mx_Dialog button.danger:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]), .mx_Dialog input[type="submit"].danger, -.mx_Dialog_buttons button.danger:not(.mx_Dialog_nonDialogButton):not(.mx_AccessibleButton), +.mx_Dialog_buttons + button.danger:not(.mx_Dialog_nonDialogButton):not(.mx_AccessibleButton):not(.mx_UserProfileSettings button), .mx_Dialog_buttons input[type="submit"].danger { background-color: var(--cpd-color-bg-critical-primary); border: solid 1px var(--cpd-color-bg-critical-primary); @@ -650,7 +666,10 @@ legend { color: var(--cpd-color-text-critical-primary); } -.mx_Dialog button:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]):not(.mx_AccessibleButton):disabled, +.mx_Dialog + button:not(.mx_Dialog_nonDialogButton):not([class|="maplibregl"]):not(.mx_AccessibleButton):not( + .mx_UserProfileSettings button + ):disabled, .mx_Dialog input[type="submit"]:disabled, .mx_Dialog_buttons button:not(.mx_Dialog_nonDialogButton):not(.mx_AccessibleButton):disabled, .mx_Dialog_buttons input[type="submit"]:disabled { diff --git a/res/css/_components.pcss b/res/css/_components.pcss index cc7e41bc99..a7c79bfbf2 100644 --- a/res/css/_components.pcss +++ b/res/css/_components.pcss @@ -337,7 +337,7 @@ @import "./views/settings/_Notifications.pcss"; @import "./views/settings/_PhoneNumbers.pcss"; @import "./views/settings/_PowerLevelSelector.pcss"; -@import "./views/settings/_ProfileSettings.pcss"; +@import "./views/settings/_RoomProfileSettings.pcss"; @import "./views/settings/_SecureBackupPanel.pcss"; @import "./views/settings/_SetIdServer.pcss"; @import "./views/settings/_SetIntegrationManager.pcss"; @@ -345,6 +345,7 @@ @import "./views/settings/_SpellCheckLanguages.pcss"; @import "./views/settings/_ThemeChoicePanel.pcss"; @import "./views/settings/_UpdateCheckButton.pcss"; +@import "./views/settings/_UserProfileSettings.pcss"; @import "./views/settings/tabs/_SettingsBanner.pcss"; @import "./views/settings/tabs/_SettingsIndent.pcss"; @import "./views/settings/tabs/_SettingsSection.pcss"; diff --git a/res/css/components/views/elements/_AppPermission.pcss b/res/css/components/views/elements/_AppPermission.pcss index 4bbe0ac07a..3b770c7879 100644 --- a/res/css/components/views/elements/_AppPermission.pcss +++ b/res/css/components/views/elements/_AppPermission.pcss @@ -44,24 +44,3 @@ limitations under the License. } } } - -.mx_Tooltip.mx_Tooltip--appPermission { - box-shadow: none; - background-color: $tooltip-timeline-bg-color; - color: $tooltip-timeline-fg-color; - border: none; - border-radius: 3px; - padding: 6px 8px; - - &.mx_Tooltip--appPermission--dark { - .mx_Tooltip_chevron::after { - border-right-color: $tooltip-timeline-bg-color; - } - } - - ul { - list-style-position: inside; - padding-left: 2px; - margin-left: 0; - } -} diff --git a/res/css/structures/_SpacePanel.pcss b/res/css/structures/_SpacePanel.pcss index 0252da01b7..d685617d5b 100644 --- a/res/css/structures/_SpacePanel.pcss +++ b/res/css/structures/_SpacePanel.pcss @@ -472,3 +472,10 @@ limitations under the License. .mx_SpacePanel_sharePublicSpace { margin: 0; } + +.mx_SpacePanel_Tooltip_KeyboardShortcut { + kbd { + font-family: inherit; + text-transform: capitalize; + } +} diff --git a/res/css/structures/_TabbedView.pcss b/res/css/structures/_TabbedView.pcss index 34a1766c19..04f0587b0a 100644 --- a/res/css/structures/_TabbedView.pcss +++ b/res/css/structures/_TabbedView.pcss @@ -167,7 +167,7 @@ limitations under the License. } /* Hide the labels on tabs, showing only the icons, on narrow viewports. */ -@media (max-width: 768px) { +@media (max-width: 1024px) { .mx_TabbedView_tabsOnLeft.mx_TabbedView_responsive { .mx_TabbedView_tabLabel_text { display: none; diff --git a/res/css/structures/_UserMenu.pcss b/res/css/structures/_UserMenu.pcss index 3d37fa73a6..24e06e9a2c 100644 --- a/res/css/structures/_UserMenu.pcss +++ b/res/css/structures/_UserMenu.pcss @@ -211,6 +211,10 @@ limitations under the License. .mx_UserMenu_iconSignOut::before { mask-image: url("$(res)/img/element-icons/leave.svg"); } + + .mx_UserMenu_iconQr::before { + mask-image: url("@vector-im/compound-design-tokens/icons/qr-code.svg"); + } } .mx_UserMenu_CustomStatusSection { diff --git a/res/css/views/dialogs/_UserSettingsDialog.pcss b/res/css/views/dialogs/_UserSettingsDialog.pcss index 41d39f8b79..1e27bb4b6a 100644 --- a/res/css/views/dialogs/_UserSettingsDialog.pcss +++ b/res/css/views/dialogs/_UserSettingsDialog.pcss @@ -14,6 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ +.mx_SettingsDialog_toastContainer { + position: absolute; + bottom: var(--cpd-space-10x); + width: 100%; + display: flex; + justify-content: center; +} + /* ICONS */ /* ========================================================== */ diff --git a/res/css/views/messages/_LegacyCallEvent.pcss b/res/css/views/messages/_LegacyCallEvent.pcss index 403086d51d..4b8c6a73c4 100644 --- a/res/css/views/messages/_LegacyCallEvent.pcss +++ b/res/css/views/messages/_LegacyCallEvent.pcss @@ -204,7 +204,7 @@ limitations under the License. } .mx_LegacyCallEvent_info { - align-items: unset; + align-items: center; } } } diff --git a/res/css/views/rooms/_LegacyRoomHeader.pcss b/res/css/views/rooms/_LegacyRoomHeader.pcss index ce088f7deb..a570b0435a 100644 --- a/res/css/views/rooms/_LegacyRoomHeader.pcss +++ b/res/css/views/rooms/_LegacyRoomHeader.pcss @@ -65,6 +65,11 @@ limitations under the License. .mx_BetaCard_betaPill { margin-right: $spacing-8; } + + /* The container of E2EIcon in the legacy header needs to have its height set */ + & > span { + height: 100%; + } } .mx_LegacyRoomHeader_name { diff --git a/res/css/views/settings/_AvatarSetting.pcss b/res/css/views/settings/_AvatarSetting.pcss index 98bf3ab9b8..7f63c3a564 100644 --- a/res/css/views/settings/_AvatarSetting.pcss +++ b/res/css/views/settings/_AvatarSetting.pcss @@ -21,43 +21,10 @@ limitations under the License. margin-top: 8px; position: relative; - .mx_AvatarSetting_hover { - transition: opacity var(--hover-transition); - - /* position to place the hover bg over the entire thing */ - position: absolute; - inset: 0; - - pointer-events: none; /* let the pointer fall through the underlying thing */ - - line-height: 90px; - text-align: center; - - > span { - color: $primary-content; - position: relative; /* tricks the layout engine into putting this on top of the bg */ - font-weight: 500; - } - - .mx_AvatarSetting_hoverBg { - /* absolute position to lazily fill the entire container */ - position: absolute; - inset: 0; - - opacity: 0.5; - background-color: $quinary-content; - border-radius: 90px; - } - } - - &.mx_AvatarSetting_avatar_hovering .mx_AvatarSetting_hover { + &.mx_AvatarSetting_avatarDisplay:hover .mx_AvatarSetting_hover { opacity: 1; } - &:not(.mx_AvatarSetting_avatar_hovering) .mx_AvatarSetting_hover { - opacity: 0; - } - & > * { box-sizing: border-box; } @@ -71,54 +38,40 @@ limitations under the License. } & > img { - cursor: pointer; - object-fit: cover; - } - - & > img, - .mx_AvatarSetting_avatarPlaceholder { display: block; height: 90px; width: inherit; border-radius: 90px; cursor: pointer; - } - - .mx_AvatarSetting_avatarPlaceholder::before { - background-color: $quinary-content; - mask: url("$(res)/img/feather-customised/user.svg"); - mask-repeat: no-repeat; - mask-size: 36px; - mask-position: center; - content: ""; - position: absolute; - inset: 0; + object-fit: cover; } .mx_AvatarSetting_uploadButton { - width: 32px; - height: 32px; + width: 28px; + height: 28px; border-radius: 32px; - background-color: $secondary-content; + border: 1px solid var(--cpd-color-bg-canvas-default); + background-color: var(--cpd-color-bg-canvas-default); position: absolute; bottom: 0; right: 0; + text-align: center; + cursor: pointer; + + svg { + position: relative; + top: 3px; + } } - .mx_AvatarSetting_uploadButton::before { - content: ""; - display: block; - width: 100%; - height: 100%; - mask-repeat: no-repeat; - mask-position: center; - mask-size: 55%; - background-color: $quinary-content; - mask-image: url("$(res)/img/feather-customised/edit.svg"); + .mx_AvatarSetting_uploadButton:hover, + .mx_AvatarSetting_uploadButton_active { + background-color: var(--cpd-color-bg-subtle-primary); } } -.mx_AvatarSetting_avatar .mx_AvatarSetting_avatarPlaceholder { - background-color: $system; +.mx_AvatarSetting_removeMenuItem svg, +.mx_AvatarSetting_removeMenuItem span { + color: var(--cpd-color-text-critical-primary) !important; } diff --git a/res/css/views/settings/_ProfileSettings.pcss b/res/css/views/settings/_RoomProfileSettings.pcss similarity index 73% rename from res/css/views/settings/_ProfileSettings.pcss rename to res/css/views/settings/_RoomProfileSettings.pcss index 5caff1f2c0..8af0249ab4 100644 --- a/res/css/views/settings/_ProfileSettings.pcss +++ b/res/css/views/settings/_RoomProfileSettings.pcss @@ -1,5 +1,5 @@ /* -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. +Copyright 2019, 2020, 2024 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,17 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -.mx_ProfileSettings { +.mx_RoomProfileSettings { border-bottom: 1px solid $quinary-content; - .mx_ProfileSettings_avatarUpload { - display: none; - } - - .mx_ProfileSettings_profile { + .mx_RoomProfileSettings_profile { display: flex; - .mx_ProfileSettings_profile_controls { + .mx_RoomProfileSettings_profile_controls { flex-grow: 1; margin-inline-end: 54px; @@ -32,7 +28,7 @@ limitations under the License. margin-top: $spacing-8; } - .mx_ProfileSettings_profile_controls_topic { + .mx_RoomProfileSettings_profile_controls_topic { margin-top: $spacing-8; & > textarea { @@ -40,18 +36,18 @@ limitations under the License. resize: vertical; } - &.mx_ProfileSettings_profile_controls_topic--room textarea { + &.mx_RoomProfileSettings_profile_controls_topic--room textarea { min-height: 4em; } } - .mx_ProfileSettings_profile_controls_userId { + .mx_RoomProfileSettings_profile_controls_userId { margin-inline-end: $spacing-20; } } } - .mx_ProfileSettings_buttons { + .mx_RoomProfileSettings_buttons { display: flex; gap: var(--cpd-space-4x); margin-top: 10px; /* 18px is already accounted for by the

above the buttons */ diff --git a/res/css/views/settings/_UserProfileSettings.pcss b/res/css/views/settings/_UserProfileSettings.pcss new file mode 100644 index 0000000000..3a9dc7dcc7 --- /dev/null +++ b/res/css/views/settings/_UserProfileSettings.pcss @@ -0,0 +1,58 @@ +/* +Copyright 2019, 2020, 2024 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +.mx_UserProfileSettings { + border-bottom: 1px solid $quinary-content; + + .mx_UserProfileSettings_profile { + display: flex; + margin-top: var(--cpd-space-6x); + gap: 16px; + /* This is temporary until the 'Remove' link is replaced by a context menu. */ + margin-bottom: 20px; + + .mx_UserProfileSettings_profile_displayName { + flex-grow: 1; + width: 100%; + } + } + + .mx_UserProfileSettings_profile_controls { + flex-grow: 1; + } + + .mx_UserProfileSettings_profile_controls_userId { + width: 100%; + .mx_CopyableText { + margin-top: var(--cpd-space-1x); + width: 100%; + box-sizing: border-box; + } + } + + .mx_UserProfileSettings_profile_controls_userId_label { + font-size: 15px; + font-weight: 500; + } +} + +@media (max-width: 768px) { + .mx_UserProfileSettings_profile { + flex-direction: column; + align-items: center; + gap: 30px; + } +} diff --git a/res/img/feather-customised/user.svg b/res/img/feather-customised/user.svg deleted file mode 100644 index 210ef99e6a..0000000000 --- a/res/img/feather-customised/user.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/res/themes/light-custom/css/_custom.pcss b/res/themes/light-custom/css/_custom.pcss index 7fadb2cd0a..d43740a8d9 100644 --- a/res/themes/light-custom/css/_custom.pcss +++ b/res/themes/light-custom/css/_custom.pcss @@ -131,6 +131,8 @@ $icon-button-color: var(--icon-button-color, $icon-button-color); $strong-input-border-color: var(--strong-input-border-color, $strong-input-border-color); $inverted-bg-color: var(--strong-input-border-color, $inverted-bg-color); +$e2e-verified-color: var(--confirmation-color); // to keep it green instead of tchap red + /** * Variation of the accent color. * Generate this colour scale using LeonardoColor diff --git a/src/BasePlatform.ts b/src/BasePlatform.ts index e7e4ff7e3c..3c515dff84 100644 --- a/src/BasePlatform.ts +++ b/src/BasePlatform.ts @@ -38,7 +38,7 @@ import { idbLoad, idbSave, idbDelete } from "./utils/StorageAccess"; import { ViewRoomPayload } from "./dispatcher/payloads/ViewRoomPayload"; import { IConfigOptions } from "./IConfigOptions"; import SdkConfig from "./SdkConfig"; -import { buildAndEncodePickleKey, getPickleAdditionalData } from "./utils/tokens/pickling"; +import { buildAndEncodePickleKey, encryptPickleKey } from "./utils/tokens/pickling"; export const SSO_HOMESERVER_URL_KEY = "mx_sso_hs_url"; export const SSO_ID_SERVER_URL_KEY = "mx_sso_is_url"; @@ -378,24 +378,16 @@ export default abstract class BasePlatform { * support storing pickle keys. */ public async createPickleKey(userId: string, deviceId: string): Promise { - if (!window.crypto || !window.crypto.subtle) { - return null; - } - const crypto = window.crypto; const randomArray = new Uint8Array(32); crypto.getRandomValues(randomArray); - const cryptoKey = await crypto.subtle.generateKey({ name: "AES-GCM", length: 256 }, false, [ - "encrypt", - "decrypt", - ]); - const iv = new Uint8Array(32); - crypto.getRandomValues(iv); - - const additionalData = getPickleAdditionalData(userId, deviceId); - const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv, additionalData }, cryptoKey, randomArray); + const data = await encryptPickleKey(randomArray, userId, deviceId); + if (data === undefined) { + // no crypto support + return null; + } try { - await idbSave("pickleKey", [userId, deviceId], { encrypted, iv, cryptoKey }); + await idbSave("pickleKey", [userId, deviceId], data); } catch (e) { return null; } diff --git a/src/DecryptionFailureTracker.ts b/src/DecryptionFailureTracker.ts index c842e55ec4..548555cd1d 100644 --- a/src/DecryptionFailureTracker.ts +++ b/src/DecryptionFailureTracker.ts @@ -14,38 +14,64 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { ScalableBloomFilter } from "bloom-filters"; +import { CryptoEvent, HttpApiEvent, MatrixClient, MatrixEventEvent, MatrixEvent } from "matrix-js-sdk/src/matrix"; import { Error as ErrorEvent } from "@matrix-org/analytics-events/types/typescript/Error"; import { DecryptionFailureCode } from "matrix-js-sdk/src/crypto-api"; import { PosthogAnalytics } from "./PosthogAnalytics"; +/** The key that we use to store the `reportedEvents` bloom filter in localstorage */ +const DECRYPTION_FAILURE_STORAGE_KEY = "mx_decryption_failure_event_ids"; + export class DecryptionFailure { - public readonly ts: number; + /** + * The time between our initial failure to decrypt and our successful + * decryption (if we managed to decrypt). + */ + public timeToDecryptMillis?: number; public constructor( public readonly failedEventId: string, public readonly errorCode: DecryptionFailureCode, - ) { - this.ts = Date.now(); - } + /** + * The time that we failed to decrypt the event. If we failed to decrypt + * multiple times, this will be the time of the first failure. + */ + public readonly ts: number, + /** + * Is the sender on a different server from us? + */ + public readonly isFederated: boolean | undefined, + /** + * Was the failed event ever visible to the user? + */ + public wasVisibleToUser: boolean, + /** + * Has the user verified their own cross-signing identity, as of the most + * recent decryption attempt for this event? + */ + public userTrustsOwnIdentity: boolean | undefined, + ) {} } type ErrorCode = ErrorEvent["name"]; -type TrackingFn = (count: number, trackedErrCode: ErrorCode, rawError: string) => void; +/** Properties associated with decryption errors, for classifying the error. */ +export type ErrorProperties = Omit; +type TrackingFn = (trackedErrCode: ErrorCode, rawError: string, properties: ErrorProperties) => void; export type ErrCodeMapFn = (errcode: DecryptionFailureCode) => ErrorCode; export class DecryptionFailureTracker { private static internalInstance = new DecryptionFailureTracker( - (total, errorCode, rawError) => { - for (let i = 0; i < total; i++) { - PosthogAnalytics.instance.trackEvent({ - eventName: "Error", - domain: "E2EE", - name: errorCode, - context: `mxc_crypto_error_type_${rawError}`, - }); - } + (errorCode, rawError, properties) => { + const event: ErrorEvent = { + eventName: "Error", + domain: "E2EE", + name: errorCode, + context: `mxc_crypto_error_type_${rawError}`, + ...properties, + }; + PosthogAnalytics.instance.trackEvent(event); }, (errorCode) => { // Map JS-SDK error codes to tracker codes for aggregation @@ -66,58 +92,82 @@ export class DecryptionFailureTracker { }, ); - // Map of event IDs to DecryptionFailure items. + /** Map of event IDs to `DecryptionFailure` items. + * + * Every `CHECK_INTERVAL_MS`, this map is checked for failures that happened > + * `MAXIMUM_LATE_DECRYPTION_PERIOD` ago (considered undecryptable), or + * decryptions that took > `GRACE_PERIOD_MS` (considered late decryptions). + * + * Any such events are then reported via the `TrackingFn`. + */ public failures: Map = new Map(); - // Set of event IDs that have been visible to the user. - public visibleEvents: Set = new Set(); - - // Map of visible event IDs to `DecryptionFailure`s. Every - // `CHECK_INTERVAL_MS`, this map is checked for failures that - // happened > `GRACE_PERIOD_MS` ago. Those that did are - // accumulated in `failureCounts`. - public visibleFailures: Map = new Map(); - - /** - * A histogram of the number of failures that will be tracked at the next tracking - * interval, split by failure error code. + /** Set of event IDs that have been visible to the user. + * + * This will only contain events that are not already in `reportedEvents`. */ - private failureCounts: Map = new Map(); + public visibleEvents: Set = new Set(); - // Event IDs of failures that were tracked previously - public trackedEvents: Set = new Set(); + /** Bloom filter tracking event IDs of failures that were reported previously */ + private reportedEvents: ScalableBloomFilter = new ScalableBloomFilter(); - // Set to an interval ID when `start` is called + /** Set to an interval ID when `start` is called */ public checkInterval: number | null = null; public trackInterval: number | null = null; - // Spread the load on `Analytics` by tracking at a low frequency, `TRACK_INTERVAL_MS`. - public static TRACK_INTERVAL_MS = 60000; - - // Call `checkFailures` every `CHECK_INTERVAL_MS`. + /** Call `checkFailures` every `CHECK_INTERVAL_MS`. */ public static CHECK_INTERVAL_MS = 40000; - // Give events a chance to be decrypted by waiting `GRACE_PERIOD_MS` before counting - // the failure in `failureCounts`. - public static GRACE_PERIOD_MS = 30000; + /** If the event is successfully decrypted in less than 4s, we don't report. */ + public static GRACE_PERIOD_MS = 4000; + + /** Maximum time for an event to be decrypted to be considered a late + * decryption. If it takes longer, we consider it undecryptable. */ + public static MAXIMUM_LATE_DECRYPTION_PERIOD = 60000; + + /** Properties that will be added to all reported events (mainly reporting + * information about the Matrix client). */ + private baseProperties?: ErrorProperties = {}; + + /** The user's domain (homeserver name). */ + private userDomain?: string; + + /** Whether the user has verified their own cross-signing keys. */ + private userTrustsOwnIdentity: boolean | undefined = undefined; + + /** Whether we are currently checking our own verification status. */ + private checkingVerificationStatus: boolean = false; + + /** Whether we should retry checking our own verification status after we're + * done our current check. i.e. we got notified that our keys changed while + * we were already checking, so the result could be out of date. */ + private retryVerificationStatus: boolean = false; /** * Create a new DecryptionFailureTracker. * - * Call `eventDecrypted(event, err)` on this instance when an event is decrypted. - * - * Call `start()` to start the tracker, and `stop()` to stop tracking. + * Call `start(client)` to start the tracker. The tracker will listen for + * decryption events on the client and track decryption failures, and will + * automatically stop tracking when the client logs out. * * @param {function} fn The tracking function, which will be called when failures - * are tracked. The function should have a signature `(count, trackedErrorCode) => {...}`, - * where `count` is the number of failures and `errorCode` matches the output of `errorCodeMapFn`. + * are tracked. The function should have a signature `(trackedErrorCode, rawError, properties) => {...}`, + * where `errorCode` matches the output of `errorCodeMapFn`, `rawError` is the original + * error (that is, the input to `errorCodeMapFn`), and `properties` is a map of the + * error properties for classifying the error. * * @param {function} errorCodeMapFn The function used to map decryption failure reason codes to the * `trackedErrorCode`. + * + * @param {boolean} checkReportedEvents Check if we have already reported an event. + * Defaults to `true`. This is only used for tests, to avoid possible false positives from + * the Bloom filter. This should be set to `false` for all tests except for those + * that specifically test the `reportedEvents` functionality. */ private constructor( private readonly fn: TrackingFn, private readonly errorCodeMapFn: ErrCodeMapFn, + private readonly checkReportedEvents: boolean = true, ) { if (!fn || typeof fn !== "function") { throw new Error("DecryptionFailureTracker requires tracking function"); @@ -132,130 +182,253 @@ export class DecryptionFailureTracker { return DecryptionFailureTracker.internalInstance; } - // loadTrackedEvents() { - // this.trackedEvents = new Set(JSON.parse(localStorage.getItem('mx-decryption-failure-event-ids')) || []); - // } + private loadReportedEvents(): void { + const storedFailures = localStorage.getItem(DECRYPTION_FAILURE_STORAGE_KEY); + if (storedFailures) { + this.reportedEvents = ScalableBloomFilter.fromJSON(JSON.parse(storedFailures)); + } else { + this.reportedEvents = new ScalableBloomFilter(); + } + } - // saveTrackedEvents() { - // localStorage.setItem('mx-decryption-failure-event-ids', JSON.stringify([...this.trackedEvents])); - // } + private saveReportedEvents(): void { + localStorage.setItem(DECRYPTION_FAILURE_STORAGE_KEY, JSON.stringify(this.reportedEvents.saveAsJSON())); + } - public eventDecrypted(e: MatrixEvent): void { + /** Callback for when an event is decrypted. + * + * This function is called by our `MatrixEventEvent.Decrypted` event + * handler after a decryption attempt on an event, whether the decryption + * is successful or not. + * + * @param e the event that was decrypted + * + * @param nowTs the current timestamp + */ + private eventDecrypted(e: MatrixEvent, nowTs: number): void { // for now we only track megolm decryption failures if (e.getWireContent().algorithm != "m.megolm.v1.aes-sha2") { return; } - const errCode = e.decryptionFailureReason; - if (errCode !== null) { - this.addDecryptionFailure(new DecryptionFailure(e.getId()!, errCode)); - } else { + if (errCode === null) { // Could be an event in the failures, remove it - this.removeDecryptionFailuresForEvent(e); + this.removeDecryptionFailuresForEvent(e, nowTs); + return; } - } - public addVisibleEvent(e: MatrixEvent): void { const eventId = e.getId()!; - if (this.trackedEvents.has(eventId)) { + // if it's already reported, we don't need to do anything + if (this.reportedEvents.has(eventId) && this.checkReportedEvents) { return; } - this.visibleEvents.add(eventId); - if (this.failures.has(eventId) && !this.visibleFailures.has(eventId)) { - this.visibleFailures.set(eventId, this.failures.get(eventId)!); + // if we already have a record of this event, use the previously-recorded timestamp + const failure = this.failures.get(eventId); + const ts = failure ? failure.ts : nowTs; + + const sender = e.getSender(); + const senderDomain = sender?.replace(/^.*?:/, ""); + let isFederated: boolean | undefined; + if (this.userDomain !== undefined && senderDomain !== undefined) { + isFederated = this.userDomain !== senderDomain; } + + const wasVisibleToUser = this.visibleEvents.has(eventId); + this.failures.set( + eventId, + new DecryptionFailure(eventId, errCode, ts, isFederated, wasVisibleToUser, this.userTrustsOwnIdentity), + ); } - public addDecryptionFailure(failure: DecryptionFailure): void { - const eventId = failure.failedEventId; + public addVisibleEvent(e: MatrixEvent): void { + const eventId = e.getId()!; - if (this.trackedEvents.has(eventId)) { + // if it's already reported, we don't need to do anything + if (this.reportedEvents.has(eventId) && this.checkReportedEvents) { return; } - this.failures.set(eventId, failure); - if (this.visibleEvents.has(eventId) && !this.visibleFailures.has(eventId)) { - this.visibleFailures.set(eventId, failure); + // if we've already marked the event as a failure, mark it as visible + // in the failure object + const failure = this.failures.get(eventId); + if (failure) { + failure.wasVisibleToUser = true; } + + this.visibleEvents.add(eventId); } - public removeDecryptionFailuresForEvent(e: MatrixEvent): void { + public removeDecryptionFailuresForEvent(e: MatrixEvent, nowTs: number): void { const eventId = e.getId()!; - this.failures.delete(eventId); - this.visibleFailures.delete(eventId); + const failure = this.failures.get(eventId); + if (failure) { + this.failures.delete(eventId); + + const timeToDecryptMillis = nowTs - failure.ts; + if (timeToDecryptMillis < DecryptionFailureTracker.GRACE_PERIOD_MS) { + // the event decrypted on time, so we don't need to report it + return; + } else if (timeToDecryptMillis <= DecryptionFailureTracker.MAXIMUM_LATE_DECRYPTION_PERIOD) { + // The event is a late decryption, so store the time it took. + // If the time to decrypt is longer than + // MAXIMUM_LATE_DECRYPTION_PERIOD, we consider the event as + // undecryptable, and leave timeToDecryptMillis undefined + failure.timeToDecryptMillis = timeToDecryptMillis; + } + this.reportFailure(failure); + } + } + + private async handleKeysChanged(client: MatrixClient): Promise { + if (this.checkingVerificationStatus) { + // Flag that we'll need to do another check once the current check completes. + this.retryVerificationStatus = true; + return; + } + + this.checkingVerificationStatus = true; + try { + do { + this.retryVerificationStatus = false; + this.userTrustsOwnIdentity = ( + await client.getCrypto()!.getUserVerificationStatus(client.getUserId()!) + ).isCrossSigningVerified(); + } while (this.retryVerificationStatus); + } finally { + this.checkingVerificationStatus = false; + } } /** * Start checking for and tracking failures. */ - public start(): void { + public async start(client: MatrixClient): Promise { + this.loadReportedEvents(); + await this.calculateClientProperties(client); + this.registerHandlers(client); this.checkInterval = window.setInterval( () => this.checkFailures(Date.now()), DecryptionFailureTracker.CHECK_INTERVAL_MS, ); + } - this.trackInterval = window.setInterval(() => this.trackFailures(), DecryptionFailureTracker.TRACK_INTERVAL_MS); + private async calculateClientProperties(client: MatrixClient): Promise { + const baseProperties: ErrorProperties = {}; + this.baseProperties = baseProperties; + + this.userDomain = client.getDomain() ?? undefined; + if (this.userDomain === "matrix.org") { + baseProperties.isMatrixDotOrg = true; + } else if (this.userDomain !== undefined) { + baseProperties.isMatrixDotOrg = false; + } + + const crypto = client.getCrypto(); + if (crypto) { + const version = crypto.getVersion(); + if (version.startsWith("Rust SDK")) { + baseProperties.cryptoSDK = "Rust"; + } else { + baseProperties.cryptoSDK = "Legacy"; + } + this.userTrustsOwnIdentity = ( + await crypto.getUserVerificationStatus(client.getUserId()!) + ).isCrossSigningVerified(); + } + } + + private registerHandlers(client: MatrixClient): void { + // After the client attempts to decrypt an event, we examine it to see + // if it needs to be reported. + const decryptedHandler = (e: MatrixEvent): void => this.eventDecrypted(e, Date.now()); + // When our keys change, we check if the cross-signing keys are now trusted. + const keysChangedHandler = (): void => { + this.handleKeysChanged(client).catch((e) => { + console.log("Error handling KeysChanged event", e); + }); + }; + // When logging out, remove our handlers and destroy state + const loggedOutHandler = (): void => { + client.removeListener(MatrixEventEvent.Decrypted, decryptedHandler); + client.removeListener(CryptoEvent.KeysChanged, keysChangedHandler); + client.removeListener(HttpApiEvent.SessionLoggedOut, loggedOutHandler); + this.stop(); + }; + + client.on(MatrixEventEvent.Decrypted, decryptedHandler); + client.on(CryptoEvent.KeysChanged, keysChangedHandler); + client.on(HttpApiEvent.SessionLoggedOut, loggedOutHandler); } /** * Clear state and stop checking for and tracking failures. */ - public stop(): void { + private stop(): void { if (this.checkInterval) clearInterval(this.checkInterval); if (this.trackInterval) clearInterval(this.trackInterval); + this.userTrustsOwnIdentity = undefined; this.failures = new Map(); this.visibleEvents = new Set(); - this.visibleFailures = new Map(); - this.failureCounts = new Map(); } /** - * Mark failures that occurred before nowTs - GRACE_PERIOD_MS as failures that should be - * tracked. Only mark one failure per event ID. + * Mark failures as undecryptable or late. Only mark one failure per event ID. + * * @param {number} nowTs the timestamp that represents the time now. */ public checkFailures(nowTs: number): void { - const failuresGivenGrace: Set = new Set(); const failuresNotReady: Map = new Map(); - for (const [eventId, failure] of this.visibleFailures) { - if (nowTs > failure.ts + DecryptionFailureTracker.GRACE_PERIOD_MS) { - failuresGivenGrace.add(failure); - this.trackedEvents.add(eventId); + for (const [eventId, failure] of this.failures) { + if ( + failure.timeToDecryptMillis !== undefined || + nowTs > failure.ts + DecryptionFailureTracker.MAXIMUM_LATE_DECRYPTION_PERIOD + ) { + // we report failures under two conditions: + // - if `timeToDecryptMillis` is set, we successfully decrypted + // the event, but we got the key late. We report it so that we + // have the late decrytion stats. + // - we haven't decrypted yet and it's past the time for it to be + // considered a "late" decryption, so we count it as + // undecryptable. + this.reportFailure(failure); } else { + // the event isn't old enough, so we still need to keep track of it failuresNotReady.set(eventId, failure); } } - this.visibleFailures = failuresNotReady; + this.failures = failuresNotReady; - // Commented out for now for expediency, we need to consider unbound nature of storing - // this in localStorage - // this.saveTrackedEvents(); - - this.aggregateFailures(failuresGivenGrace); - } - - private aggregateFailures(failures: Set): void { - for (const failure of failures) { - const errorCode = failure.errorCode; - this.failureCounts.set(errorCode, (this.failureCounts.get(errorCode) ?? 0) + 1); - } + this.saveReportedEvents(); } /** * If there are failures that should be tracked, call the given trackDecryptionFailure - * function with the number of failures that should be tracked. + * function with the failures that should be tracked. */ - public trackFailures(): void { - for (const [errorCode, count] of this.failureCounts.entries()) { - if (count > 0) { - const trackedErrorCode = this.errorCodeMapFn(errorCode); - - this.fn(count, trackedErrorCode, errorCode); - this.failureCounts.set(errorCode, 0); - } + private reportFailure(failure: DecryptionFailure): void { + const errorCode = failure.errorCode; + const trackedErrorCode = this.errorCodeMapFn(errorCode); + const properties: ErrorProperties = { + timeToDecryptMillis: failure.timeToDecryptMillis ?? -1, + wasVisibleToUser: failure.wasVisibleToUser, + }; + if (failure.isFederated !== undefined) { + properties.isFederated = failure.isFederated; + } + if (failure.userTrustsOwnIdentity !== undefined) { + properties.userTrustsOwnIdentity = failure.userTrustsOwnIdentity; } + if (this.baseProperties) { + Object.assign(properties, this.baseProperties); + } + this.fn(trackedErrorCode, errorCode, properties); + + this.reportedEvents.add(failure.failedEventId); + // once we've added it to reportedEvents, we won't check + // visibleEvents for it any more + this.visibleEvents.delete(failure.failedEventId); } } diff --git a/src/DeviceListener.ts b/src/DeviceListener.ts index db3c0bf1f4..bf23412ccd 100644 --- a/src/DeviceListener.ts +++ b/src/DeviceListener.ts @@ -26,7 +26,9 @@ import { import { logger } from "matrix-js-sdk/src/logger"; import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import { KeyBackupInfo } from "matrix-js-sdk/src/crypto-api"; +import { CryptoSessionStateChange } from "@matrix-org/analytics-events/types/typescript/CryptoSessionStateChange"; +import { PosthogAnalytics } from "./PosthogAnalytics"; import dis from "./dispatcher/dispatcher"; import { hideToast as hideBulkUnverifiedSessionsToast, @@ -79,6 +81,10 @@ export default class DeviceListener { private enableBulkUnverifiedSessionsReminder = true; private deviceClientInformationSettingWatcherRef: string | undefined; + // Remember the current analytics state to avoid sending the same event multiple times. + private analyticsVerificationState?: string; + private analyticsRecoveryState?: string; + public static sharedInstance(): DeviceListener { if (!window.mxDeviceListener) window.mxDeviceListener = new DeviceListener(); return window.mxDeviceListener; @@ -301,6 +307,7 @@ export default class DeviceListener { const crossSigningReady = await crypto.isCrossSigningReady(); const secretStorageReady = await crypto.isSecretStorageReady(); const allSystemsReady = crossSigningReady && secretStorageReady; + await this.reportCryptoSessionStateToAnalytics(cli); if (this.dismissedThisDeviceToast || allSystemsReady) { hideSetupEncryptionToast(); @@ -407,6 +414,70 @@ export default class DeviceListener { this.displayingToastsForDeviceIds = newUnverifiedDeviceIds; } + /** + * Reports current recovery state to analytics. + * Checks if the session is verified and if the recovery is correctly set up (i.e all secrets known locally and in 4S). + * @param cli - the matrix client + * @private + */ + private async reportCryptoSessionStateToAnalytics(cli: MatrixClient): Promise { + const crypto = cli.getCrypto()!; + const secretStorageReady = await crypto.isSecretStorageReady(); + const crossSigningStatus = await crypto.getCrossSigningStatus(); + const backupInfo = await this.getKeyBackupInfo(); + const is4SEnabled = (await cli.secretStorage.getDefaultKeyId()) != null; + const deviceVerificationStatus = await crypto.getDeviceVerificationStatus(cli.getUserId()!, cli.getDeviceId()!); + + const verificationState = + deviceVerificationStatus?.signedByOwner && deviceVerificationStatus?.crossSigningVerified + ? "Verified" + : "NotVerified"; + + let recoveryState: "Disabled" | "Enabled" | "Incomplete"; + if (!is4SEnabled) { + recoveryState = "Disabled"; + } else { + const allCrossSigningSecretsCached = + crossSigningStatus.privateKeysCachedLocally.masterKey && + crossSigningStatus.privateKeysCachedLocally.selfSigningKey && + crossSigningStatus.privateKeysCachedLocally.userSigningKey; + if (backupInfo != null) { + // There is a backup. Check that all secrets are stored in 4S and known locally. + // If they are not, recovery is incomplete. + const backupPrivateKeyIsInCache = (await crypto.getSessionBackupPrivateKey()) != null; + if (secretStorageReady && allCrossSigningSecretsCached && backupPrivateKeyIsInCache) { + recoveryState = "Enabled"; + } else { + recoveryState = "Incomplete"; + } + } else { + // No backup. Just consider cross-signing secrets. + if (secretStorageReady && allCrossSigningSecretsCached) { + recoveryState = "Enabled"; + } else { + recoveryState = "Incomplete"; + } + } + } + + if (this.analyticsVerificationState === verificationState && this.analyticsRecoveryState === recoveryState) { + // No changes, no need to send the event nor update the user properties + return; + } + this.analyticsRecoveryState = recoveryState; + this.analyticsVerificationState = verificationState; + + // Update user properties + PosthogAnalytics.instance.setProperty("recoveryState", recoveryState); + PosthogAnalytics.instance.setProperty("verificationState", verificationState); + + PosthogAnalytics.instance.trackEvent({ + eventName: "CryptoSessionState", + verificationState: verificationState, + recoveryState: recoveryState, + }); + } + /** * Check if key backup is enabled, and if not, raise an `Action.ReportKeyBackupNotEnabled` event (which will * trigger an auto-rageshake). diff --git a/src/Lifecycle.ts b/src/Lifecycle.ts index 8b04f74afc..90f320409f 100644 --- a/src/Lifecycle.ts +++ b/src/Lifecycle.ts @@ -18,12 +18,12 @@ limitations under the License. */ import { ReactNode } from "react"; -import { createClient, MatrixClient, SSOAction, OidcTokenRefresher } from "matrix-js-sdk/src/matrix"; +import { createClient, MatrixClient, SSOAction, OidcTokenRefresher, decodeBase64 } from "matrix-js-sdk/src/matrix"; import { IEncryptedPayload } from "matrix-js-sdk/src/crypto/aes"; import { QueryDict } from "matrix-js-sdk/src/utils"; import { logger } from "matrix-js-sdk/src/logger"; -import { IMatrixClientCreds, MatrixClientPeg } from "./MatrixClientPeg"; +import { IMatrixClientCreds, MatrixClientPeg, MatrixClientPegAssignOpts } from "./MatrixClientPeg"; import { ModuleRunner } from "./modules/ModuleRunner"; import EventIndexPeg from "./indexing/EventIndexPeg"; import createMatrixClient from "./utils/createMatrixClient"; @@ -422,6 +422,7 @@ async function onSuccessfulDelegatedAuthLogin(credentials: IMatrixClientCreds): } type TryAgainFunction = () => void; + /** * Display a friendly error to the user when token login or OIDC authorization fails * @param description error description @@ -821,7 +822,23 @@ async function doSetLoggedIn(credentials: IMatrixClientCreds, clearStorageEnable checkSessionLock(); dis.fire(Action.OnLoggedIn); - await startMatrixClient(client, /*startSyncing=*/ !softLogout); + + const clientPegOpts: MatrixClientPegAssignOpts = {}; + if (credentials.pickleKey) { + // The pickleKey, if provided, is probably a base64-encoded 256-bit key, so can be used for the crypto store. + if (credentials.pickleKey.length === 43) { + clientPegOpts.rustCryptoStoreKey = decodeBase64(credentials.pickleKey); + } else { + // We have some legacy pickle key. Continue using it as a password. + clientPegOpts.rustCryptoStorePassword = credentials.pickleKey; + } + } + + try { + await startMatrixClient(client, /*startSyncing=*/ !softLogout, clientPegOpts); + } finally { + clientPegOpts.rustCryptoStoreKey?.fill(0); + } return client; } @@ -955,11 +972,16 @@ export function isLoggingOut(): boolean { /** * Starts the matrix client and all other react-sdk services that * listen for events while a session is logged in. + * * @param client the matrix client to start - * @param {boolean} startSyncing True (default) to actually start - * syncing the client. + * @param startSyncing - `true` to actually start syncing the client. + * @param clientPegOpts - Options to pass through to {@link MatrixClientPeg.start}. */ -async function startMatrixClient(client: MatrixClient, startSyncing = true): Promise { +async function startMatrixClient( + client: MatrixClient, + startSyncing: boolean, + clientPegOpts: MatrixClientPegAssignOpts, +): Promise { logger.log(`Lifecycle: Starting MatrixClient`); // dispatch this before starting the matrix client: it's used @@ -990,10 +1012,10 @@ async function startMatrixClient(client: MatrixClient, startSyncing = true): Pro // index (e.g. the FilePanel), therefore initialize the event index // before the client. await EventIndexPeg.init(); - await MatrixClientPeg.start(); + await MatrixClientPeg.start(clientPegOpts); } else { logger.warn("Caller requested only auxiliary services be started"); - await MatrixClientPeg.assign(); + await MatrixClientPeg.assign(clientPegOpts); } checkSessionLock(); diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts index d14003dbfa..72340cb35f 100644 --- a/src/MatrixClientPeg.ts +++ b/src/MatrixClientPeg.ts @@ -66,6 +66,27 @@ export interface IMatrixClientCreds { freshLogin?: boolean; } +export interface MatrixClientPegAssignOpts { + /** + * If we are using Rust crypto, a key with which to encrypt the indexeddb. + * + * If provided, it must be exactly 32 bytes of data. If both this and + * {@link MatrixClientPegAssignOpts.rustCryptoStorePassword} are undefined, + * the store will be unencrypted. + */ + rustCryptoStoreKey?: Uint8Array; + + /** + * If we are using Rust crypto, a password which will be used to derive a key to encrypt the store with. + * + * An alternative to {@link MatrixClientPegAssignOpts.rustCryptoStoreKey}. Ignored if `rustCryptoStoreKey` is set. + * + * Deriving a key from a password is (deliberately) a slow operation, so prefer to pass a `rustCryptoStoreKey` + * directly where possible. + */ + rustCryptoStorePassword?: string; +} + /** * Holds the current instance of the `MatrixClient` to use across the codebase. * Looking for an `MatrixClient`? Just look for the `MatrixClientPeg` on the peg @@ -78,15 +99,6 @@ export interface IMatrixClientPeg { */ opts: IStartClientOpts; - /** - * Return the server name of the user's homeserver - * Throws an error if unable to deduce the homeserver name - * (e.g. if the user is not logged in) - * - * @returns {string} The homeserver name, if present. - */ - getHomeserverName(): string; - /** * Get the current MatrixClient, if any */ @@ -103,14 +115,14 @@ export interface IMatrixClientPeg { unset(): void; /** - * Prepare the MatrixClient for use, including initialising the store and crypto, but do not start it + * Prepare the MatrixClient for use, including initialising the store and crypto, but do not start it. */ - assign(): Promise; + assign(opts?: MatrixClientPegAssignOpts): Promise; /** - * Prepare the MatrixClient for use, including initialising the store and crypto, and start it + * Prepare the MatrixClient for use, including initialising the store and crypto, and start it. */ - start(): Promise; + start(opts?: MatrixClientPegAssignOpts): Promise; /** * If we've registered a user ID we set this to the ID of the @@ -257,7 +269,10 @@ class MatrixClientPegClass implements IMatrixClientPeg { PlatformPeg.get()?.reload(); }; - public async assign(): Promise { + /** + * Implementation of {@link IMatrixClientPeg.assign}. + */ + public async assign(assignOpts: MatrixClientPegAssignOpts = {}): Promise { if (!this.matrixClient) { throw new Error("createClient must be called first"); } @@ -284,7 +299,7 @@ class MatrixClientPegClass implements IMatrixClientPeg { // try to initialise e2e on the new client if (!SettingsStore.getValue("lowBandwidth")) { - await this.initClientCrypto(); + await this.initClientCrypto(assignOpts.rustCryptoStoreKey, assignOpts.rustCryptoStorePassword); } const opts = utils.deepCopy(this.opts); @@ -310,8 +325,16 @@ class MatrixClientPegClass implements IMatrixClientPeg { /** * Attempt to initialize the crypto layer on a newly-created MatrixClient + * + * @param rustCryptoStoreKey - If we are using Rust crypto, a key with which to encrypt the indexeddb. + * If provided, it must be exactly 32 bytes of data. If both this and `rustCryptoStorePassword` are + * undefined, the store will be unencrypted. + * + * @param rustCryptoStorePassword - An alternative to `rustCryptoStoreKey`. Ignored if `rustCryptoStoreKey` is set. + * A password which will be used to derive a key to encrypt the store with. Deriving a key from a password is + * (deliberately) a slow operation, so prefer to pass a `rustCryptoStoreKey` directly where possible. */ - private async initClientCrypto(): Promise { + private async initClientCrypto(rustCryptoStoreKey?: Uint8Array, rustCryptoStorePassword?: string): Promise { if (!this.matrixClient) { throw new Error("createClient must be called first"); } @@ -347,7 +370,13 @@ class MatrixClientPegClass implements IMatrixClientPeg { // Now we can initialise the right crypto impl. if (useRustCrypto) { - await this.matrixClient.initRustCrypto(); + if (!rustCryptoStoreKey && !rustCryptoStorePassword) { + logger.error("Warning! Not using an encryption key for rust crypto store."); + } + await this.matrixClient.initRustCrypto({ + storageKey: rustCryptoStoreKey, + storagePassword: rustCryptoStorePassword, + }); StorageManager.setCryptoInitialised(true); // TODO: device dehydration and whathaveyou @@ -376,22 +405,17 @@ class MatrixClientPegClass implements IMatrixClientPeg { } } - public async start(): Promise { - const opts = await this.assign(); + /** + * Implementation of {@link IMatrixClientPeg.start}. + */ + public async start(assignOpts?: MatrixClientPegAssignOpts): Promise { + const opts = await this.assign(assignOpts); logger.log(`MatrixClientPeg: really starting MatrixClient`); await this.matrixClient!.startClient(opts); logger.log(`MatrixClientPeg: MatrixClient started`); } - public getHomeserverName(): string { - const matches = /^@[^:]+:(.+)$/.exec(this.safeGet().getSafeUserId()); - if (matches === null || matches.length < 1) { - throw new Error("Failed to derive homeserver name from user ID!"); - } - return matches[1]; - } - private namesToRoomName(names: string[], count: number): string | undefined { const countWithoutMe = count - 1; if (!names.length) { diff --git a/src/Modal.tsx b/src/Modal.tsx index 2ac12d280f..f39372d532 100644 --- a/src/Modal.tsx +++ b/src/Modal.tsx @@ -65,10 +65,12 @@ interface IOptions { export enum ModalManagerEvent { Opened = "opened", + Closed = "closed", } type HandlerMap = { [ModalManagerEvent.Opened]: () => void; + [ModalManagerEvent.Closed]: () => void; }; export class ModalManager extends TypedEventEmitter { @@ -232,6 +234,7 @@ export class ModalManager extends TypedEventEmitter { const modal = this.getCurrentModal(); if (!modal) { diff --git a/src/PasswordReset.ts b/src/PasswordReset.ts index ecff316e6c..0564f008ac 100644 --- a/src/PasswordReset.ts +++ b/src/PasswordReset.ts @@ -97,11 +97,7 @@ export default class PasswordReset { // Note: Though this sounds like a login type for identity servers only, it // has a dual purpose of being used for homeservers too. type: "m.login.email.identity", - // TODO: Remove `threepid_creds` once servers support proper UIA - // See https://github.com/matrix-org/synapse/issues/5665 - // See https://github.com/matrix-org/matrix-doc/issues/2220 threepid_creds: creds, - threepidCreds: creds, }, this.password, this.logoutDevices, diff --git a/src/Searching.ts b/src/Searching.ts index 691600d591..ce3ea96c72 100644 --- a/src/Searching.ts +++ b/src/Searching.ts @@ -248,7 +248,7 @@ async function localPagination( // We only need to restore the encryption state for the new results, so // remember how many of them we got. - const newResultCount = localResult.results.length; + const newResultCount = localResult.results?.length ?? 0; const response = { search_categories: { @@ -419,21 +419,21 @@ function combineEvents( // This is a first search call, combine the events from the server and // the local index. Note where our oldest event came from, we shall // fetch the next batch of events from the other source. - if (compareOldestEvents(localEvents.results, serverEvents.results) < 0) { + if (compareOldestEvents(localEvents.results ?? [], serverEvents.results) < 0) { oldestEventFrom = "local"; } - combineEventSources(previousSearchResult, response, localEvents.results, serverEvents.results); - response.highlights = localEvents.highlights.concat(serverEvents.highlights); + combineEventSources(previousSearchResult, response, localEvents.results ?? [], serverEvents.results); + response.highlights = (localEvents.highlights ?? []).concat(serverEvents.highlights ?? []); } else if (localEvents) { // This is a pagination call fetching more events from the local index, // meaning that our oldest event was on the server. // Change the source of the oldest event if our local event is older // than the cached one. - if (compareOldestEvents(localEvents.results, cachedEvents) < 0) { + if (compareOldestEvents(localEvents.results ?? [], cachedEvents) < 0) { oldestEventFrom = "local"; } - combineEventSources(previousSearchResult, response, localEvents.results, cachedEvents); + combineEventSources(previousSearchResult, response, localEvents.results ?? [], cachedEvents); } else if (serverEvents && serverEvents.results) { // This is a pagination call fetching more events from the server, // meaning that our oldest event was in the local index. diff --git a/src/SecurityManager.ts b/src/SecurityManager.ts index 6d43d83f61..c2254d3dfe 100644 --- a/src/SecurityManager.ts +++ b/src/SecurityManager.ts @@ -14,13 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { - DeviceVerificationStatus, - ICryptoCallbacks, - MatrixClient, - encodeBase64, - SecretStorage, -} from "matrix-js-sdk/src/matrix"; +import { Crypto, ICryptoCallbacks, MatrixClient, encodeBase64, SecretStorage } from "matrix-js-sdk/src/matrix"; import { deriveKey } from "matrix-js-sdk/src/crypto/key_passphrase"; import { decodeRecoveryKey } from "matrix-js-sdk/src/crypto/recoverykey"; import { logger } from "matrix-js-sdk/src/logger"; @@ -249,7 +243,7 @@ async function onSecretRequested( deviceId: string, requestId: string, name: string, - deviceTrust: DeviceVerificationStatus, + deviceTrust: Crypto.DeviceVerificationStatus, ): Promise { logger.log("onSecretRequested", userId, deviceId, requestId, name, deviceTrust); const client = MatrixClientPeg.safeGet(); diff --git a/src/SlidingSyncManager.ts b/src/SlidingSyncManager.ts index c4387e85d6..4885ffa8dc 100644 --- a/src/SlidingSyncManager.ts +++ b/src/SlidingSyncManager.ts @@ -359,10 +359,14 @@ export class SlidingSyncManager { let proxyUrl: string | undefined; try { - const clientWellKnown = await AutoDiscovery.findClientConfig(client.getDomain()!); + const clientDomain = await client.getDomain(); + if (clientDomain === null) { + throw new RangeError("Homeserver domain is null"); + } + const clientWellKnown = await AutoDiscovery.findClientConfig(clientDomain); proxyUrl = clientWellKnown?.["org.matrix.msc3575.proxy"]?.url; } catch (e) { - // client.getDomain() is invalid, `AutoDiscovery.findClientConfig` has thrown + // Either client.getDomain() is null so we've shorted out, or is invalid so `AutoDiscovery.findClientConfig` has thrown } if (proxyUrl != undefined) { diff --git a/src/accessibility/KeyboardShortcuts.ts b/src/accessibility/KeyboardShortcuts.ts index 398dc27008..9a78f07df4 100644 --- a/src/accessibility/KeyboardShortcuts.ts +++ b/src/accessibility/KeyboardShortcuts.ts @@ -203,6 +203,7 @@ export const KEY_ICON: Record = { if (IS_MAC) { KEY_ICON[Key.META] = "⌘"; KEY_ICON[Key.ALT] = "⌥"; + KEY_ICON[Key.SHIFT] = "⇧"; } export const CATEGORIES: Record = { diff --git a/src/accessibility/RovingTabIndex.tsx b/src/accessibility/RovingTabIndex.tsx index 9a2a855242..9da2b4281e 100644 --- a/src/accessibility/RovingTabIndex.tsx +++ b/src/accessibility/RovingTabIndex.tsx @@ -18,7 +18,7 @@ import React, { createContext, useCallback, useContext, - useLayoutEffect, + useEffect, useMemo, useRef, useReducer, @@ -144,7 +144,7 @@ export const reducer: Reducer = (state: IState, action: Action) } if (document.activeElement === document.body) { // if the focus got reverted to the body then the user was likely focused on the unmounted element - state.activeRef?.current?.focus(); + setTimeout(() => state.activeRef?.current?.focus(), 0); } } @@ -362,7 +362,7 @@ export const useRovingTabIndex = ( } // setup (after refs) - useLayoutEffect(() => { + useEffect(() => { context.dispatch({ type: Type.Register, payload: { ref }, @@ -390,4 +390,3 @@ export const useRovingTabIndex = ( // re-export the semantic helper components for simplicity export { RovingTabIndexWrapper } from "./roving/RovingTabIndexWrapper"; export { RovingAccessibleButton } from "./roving/RovingAccessibleButton"; -export { RovingAccessibleTooltipButton } from "./roving/RovingAccessibleTooltipButton"; diff --git a/src/accessibility/context_menu/ContextMenuTooltipButton.tsx b/src/accessibility/context_menu/ContextMenuTooltipButton.tsx index 2ae8a5de9d..3a3048d41f 100644 --- a/src/accessibility/context_menu/ContextMenuTooltipButton.tsx +++ b/src/accessibility/context_menu/ContextMenuTooltipButton.tsx @@ -18,9 +18,9 @@ limitations under the License. import React, { ComponentProps, forwardRef, Ref } from "react"; -import AccessibleTooltipButton from "../../components/views/elements/AccessibleTooltipButton"; +import AccessibleButton from "../../components/views/elements/AccessibleButton"; -type Props = ComponentProps> & { +type Props = ComponentProps> & { // whether the context menu is currently open isExpanded: boolean; }; @@ -31,17 +31,17 @@ export const ContextMenuTooltipButton = forwardRef(function , ) { return ( - {children} - + ); }); diff --git a/src/accessibility/roving/RovingAccessibleTooltipButton.tsx b/src/accessibility/roving/RovingAccessibleTooltipButton.tsx deleted file mode 100644 index 76927c1773..0000000000 --- a/src/accessibility/roving/RovingAccessibleTooltipButton.tsx +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React, { ComponentProps } from "react"; - -import { useRovingTabIndex } from "../RovingTabIndex"; -import { Ref } from "./types"; -import AccessibleButton from "../../components/views/elements/AccessibleButton"; - -type Props = Omit>, "tabIndex"> & { - inputRef?: Ref; -}; - -// Wrapper to allow use of useRovingTabIndex for simple AccessibleButtons outside of React Functional Components. -export const RovingAccessibleTooltipButton = ({ - inputRef, - onFocus, - element, - ...props -}: Props): JSX.Element => { - const [onFocusInternal, isActive, ref] = useRovingTabIndex(inputRef); - return ( - { - onFocusInternal(); - onFocus?.(event); - }} - ref={ref} - tabIndex={isActive ? 0 : -1} - /> - ); -}; diff --git a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx index 7d9dd7d55f..a231a90604 100644 --- a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx +++ b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx @@ -341,9 +341,6 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const tabPayload = payload as OpenToTabPayload; Modal.createDialog( UserSettingsDialog, - { initialTabId: tabPayload.initialTabId as UserTab, sdkContext: this.stores }, + { ...payload.props, initialTabId: tabPayload.initialTabId as UserTab, sdkContext: this.stores }, /*className=*/ undefined, /*isPriority=*/ false, /*isStatic=*/ true, @@ -1587,17 +1586,9 @@ export default class MatrixChat extends React.PureComponent { ); }); - const dft = DecryptionFailureTracker.instance; - - // Shelved for later date when we have time to think about persisting history of - // tracked events across sessions. - // dft.loadTrackedEventHashMap(); - - dft.start(); - - // When logging out, stop tracking failures and destroy state - cli.on(HttpApiEvent.SessionLoggedOut, () => dft.stop()); - cli.on(MatrixEventEvent.Decrypted, (e) => dft.eventDecrypted(e)); + DecryptionFailureTracker.instance + .start(cli) + .catch((e) => logger.error("Unable to start DecryptionFailureTracker", e)); cli.on(ClientEvent.Room, (room) => { if (cli.isCryptoEnabled()) { diff --git a/src/components/structures/RoomSearchView.tsx b/src/components/structures/RoomSearchView.tsx index 0a90ea39d9..2fd883f04e 100644 --- a/src/components/structures/RoomSearchView.tsx +++ b/src/components/structures/RoomSearchView.tsx @@ -161,7 +161,7 @@ export const RoomSearchView = forwardRef( }, []); // eslint-disable-line react-hooks/exhaustive-deps // show searching spinner - if (results?.count === undefined) { + if (results === null) { return (

= ({ space }) => { showSpaceSettings(space); }} title={_t("common|settings")} + placement="bottom" /> ); } diff --git a/src/components/structures/UserMenu.tsx b/src/components/structures/UserMenu.tsx index 544e8d215e..ef33f82b0d 100644 --- a/src/components/structures/UserMenu.tsx +++ b/src/components/structures/UserMenu.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React, { createRef, ReactNode } from "react"; -import { Room } from "matrix-js-sdk/src/matrix"; +import { discoverAndValidateOIDCIssuerWellKnown, Room } from "matrix-js-sdk/src/matrix"; import { MatrixClientPeg } from "../../MatrixClientPeg"; import defaultDispatcher from "../../dispatcher/dispatcher"; @@ -30,7 +30,7 @@ import Modal from "../../Modal"; import LogoutDialog from "../views/dialogs/LogoutDialog"; import SettingsStore from "../../settings/SettingsStore"; import { findHighContrastTheme, getCustomTheme, isHighContrastTheme } from "../../theme"; -import { RovingAccessibleTooltipButton } from "../../accessibility/RovingTabIndex"; +import { RovingAccessibleButton } from "../../accessibility/RovingTabIndex"; import AccessibleButton, { ButtonEvent } from "../views/elements/AccessibleButton"; import SdkConfig from "../../SdkConfig"; import { getHomePageUrl } from "../../utils/pages"; @@ -52,6 +52,8 @@ import { Icon as LiveIcon } from "../../../res/img/compound/live-8px.svg"; import { VoiceBroadcastRecording, VoiceBroadcastRecordingsStoreEvent } from "../../voice-broadcast"; import { SDKContext } from "../../contexts/SDKContext"; import { shouldShowFeedback } from "../../utils/Feedback"; +import { shouldShowQr } from "../views/settings/devices/LoginWithQRSection"; +import { Features } from "../../settings/Settings"; interface IProps { isPanelCollapsed: boolean; @@ -66,6 +68,8 @@ interface IState { isHighContrast: boolean; selectedSpace?: Room | null; showLiveAvatarAddon: boolean; + showQrLogin: boolean; + supportsQrLogin: boolean; } const toRightOf = (rect: PartialDOMRect): MenuProps => { @@ -103,6 +107,8 @@ export default class UserMenu extends React.Component { isHighContrast: this.isUserOnHighContrastTheme(), selectedSpace: SpaceStore.instance.activeSpaceRoom, showLiveAvatarAddon: this.context.voiceBroadcastRecordingsStore.hasCurrent(), + showQrLogin: false, + supportsQrLogin: false, }; OwnProfileStore.instance.on(UPDATE_EVENT, this.onProfileUpdate); @@ -126,6 +132,7 @@ export default class UserMenu extends React.Component { ); this.dispatcherRef = defaultDispatcher.register(this.onAction); this.themeWatcherRef = SettingsStore.watchSetting("theme", null, this.onThemeChanged); + this.checkQrLoginSupport(); } public componentWillUnmount(): void { @@ -140,6 +147,29 @@ export default class UserMenu extends React.Component { ); } + private checkQrLoginSupport = async (): Promise => { + if (!this.context.client || !SettingsStore.getValue(Features.OidcNativeFlow)) return; + + const { issuer } = await this.context.client.getAuthIssuer().catch(() => ({ issuer: undefined })); + if (issuer) { + const [oidcClientConfig, versions, wellKnown, isCrossSigningReady] = await Promise.all([ + discoverAndValidateOIDCIssuerWellKnown(issuer), + this.context.client.getVersions(), + this.context.client.waitForClientWellKnown(), + this.context.client.getCrypto()?.isCrossSigningReady(), + ]); + + const supportsQrLogin = shouldShowQr( + this.context.client, + !!isCrossSigningReady, + oidcClientConfig, + versions, + wellKnown, + ); + this.setState({ supportsQrLogin, showQrLogin: true }); + } + }; + private isUserOnDarkTheme(): boolean { if (SettingsStore.getValue("use_system_theme")) { return window.matchMedia("(prefers-color-scheme: dark)").matches; @@ -237,11 +267,11 @@ export default class UserMenu extends React.Component { SettingsStore.setValue("theme", null, SettingLevel.DEVICE, newTheme); // set at same level as Appearance tab }; - private onSettingsOpen = (ev: ButtonEvent, tabId?: string): void => { + private onSettingsOpen = (ev: ButtonEvent, tabId?: string, props?: Record): void => { ev.preventDefault(); ev.stopPropagation(); - const payload: OpenToTabPayload = { action: Action.ViewUserSettings, initialTabId: tabId }; + const payload: OpenToTabPayload = { action: Action.ViewUserSettings, initialTabId: tabId, props }; defaultDispatcher.dispatch(payload); this.setState({ contextMenuPosition: null }); // also close the menu }; @@ -368,9 +398,33 @@ export default class UserMenu extends React.Component { ); } + let linkNewDeviceButton: JSX.Element | undefined; + if (this.state.showQrLogin) { + const extraProps: Omit< + React.ComponentProps, + "iconClassname" | "label" | "onClick" + > = {}; + if (!this.state.supportsQrLogin) { + extraProps.disabled = true; + extraProps.title = _t("user_menu|link_new_device_not_supported"); + extraProps.caption = _t("user_menu|link_new_device_not_supported_caption"); + extraProps.placement = "right"; + } + + linkNewDeviceButton = ( + this.onSettingsOpen(e, UserTab.SessionManager, { showMsc4108QrCode: true })} + /> + ); + } + let primaryOptionList = ( {homeButton} + {linkNewDeviceButton} {
- { alt="" width={16} /> - + {topSection} {primaryOptionList} diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.tsx b/src/components/views/auth/InteractiveAuthEntryComponents.tsx index e8969f12ad..7bed60d603 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.tsx +++ b/src/components/views/auth/InteractiveAuthEntryComponents.tsx @@ -26,10 +26,8 @@ import SettingsStore from "../../../settings/SettingsStore"; import { LocalisedPolicy, Policies } from "../../../Terms"; import { AuthHeaderModifier } from "../../structures/auth/header/AuthHeaderModifier"; import AccessibleButton, { AccessibleButtonKind, ButtonEvent } from "../elements/AccessibleButton"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import Field from "../elements/Field"; import Spinner from "../elements/Spinner"; -import { Alignment } from "../elements/Tooltip"; import CaptchaForm from "./CaptchaForm"; /* This file contains a collection of components which are used by the @@ -121,9 +119,6 @@ export class PasswordAuthEntry extends React.Component ( - this.setState({ requested: false }) + ? (open) => { + if (!open) this.setState({ requested: false }); + } : undefined } onClick={async (): Promise => { @@ -527,7 +523,7 @@ export class EmailIdentityAuthEntry extends React.Component< }} > {text} - + ), }, )} @@ -634,11 +630,7 @@ export class MsisdnAuthEntry extends React.Component { + private finished = false; + public constructor(props: IProps) { super(props); @@ -66,6 +94,10 @@ export default class LoginWithQR extends React.Component { }; } + private get ourIntent(): RendezvousIntent { + return RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE; + } + public componentDidMount(): void { this.updateMode(this.props.mode).then(() => {}); } @@ -81,27 +113,36 @@ export default class LoginWithQR extends React.Component { if (this.state.rendezvous) { const rendezvous = this.state.rendezvous; rendezvous.onFailure = undefined; - await rendezvous.cancel(RendezvousFailureReason.UserCancelled); + if (rendezvous instanceof MSC3906Rendezvous) { + await rendezvous.cancel(LegacyRendezvousFailureReason.UserCancelled); + } this.setState({ rendezvous: undefined }); } if (mode === Mode.Show) { - await this.generateCode(); + await this.generateAndShowCode(); } } public componentWillUnmount(): void { - if (this.state.rendezvous) { + if (this.state.rendezvous && !this.finished) { // eslint-disable-next-line react/no-direct-mutation-state this.state.rendezvous.onFailure = undefined; // calling cancel will call close() as well to clean up the resources - this.state.rendezvous.cancel(RendezvousFailureReason.UserCancelled).then(() => {}); + if (this.state.rendezvous instanceof MSC3906Rendezvous) { + this.state.rendezvous.cancel(LegacyRendezvousFailureReason.UserCancelled); + } else { + this.state.rendezvous.cancel(MSC4108FailureReason.UserCancelled); + } } } - private approveLogin = async (): Promise => { - if (!this.state.rendezvous) { + private async legacyApproveLogin(): Promise { + if (!(this.state.rendezvous instanceof MSC3906Rendezvous)) { throw new Error("Rendezvous not found"); } + if (!this.props.client) { + throw new Error("No client to approve login with"); + } this.setState({ phase: Phase.Loading }); try { @@ -121,7 +162,7 @@ export default class LoginWithQR extends React.Component { } if (!this.props.client.getCrypto()) { // no E2EE to set up - this.props.onFinished(true); + this.onFinished(true); return; } this.setState({ phase: Phase.Verifying }); @@ -132,7 +173,7 @@ export default class LoginWithQR extends React.Component { } finally { this.setState({ rendezvous: undefined }); } - this.props.onFinished(true); + this.onFinished(true); } catch (e) { logger.error("Error whilst approving sign in", e); if (e instanceof HTTPError && e.httpStatus === 429) { @@ -140,27 +181,38 @@ export default class LoginWithQR extends React.Component { this.setState({ phase: Phase.Error, failureReason: LoginWithQRFailureReason.RateLimited }); return; } - this.setState({ phase: Phase.Error, failureReason: RendezvousFailureReason.Unknown }); + this.setState({ phase: Phase.Error, failureReason: ClientRendezvousFailureReason.Unknown }); } - }; + } - private generateCode = async (): Promise => { - let rendezvous: MSC3906Rendezvous; - try { - const fallbackRzServer = this.props.client.getClientWellKnown()?.["io.element.rendezvous"]?.server; - const transport = new MSC3886SimpleHttpRendezvousTransport({ - onFailure: this.onFailure, - client: this.props.client, - fallbackRzServer, - }); + private onFinished(success: boolean): void { + this.finished = true; + this.props.onFinished(success); + } - const channel = new MSC3903ECDHv2RendezvousChannel( - transport, - undefined, - this.onFailure, - ); + private generateAndShowCode = async (): Promise => { + let rendezvous: MSC4108SignInWithQR | MSC3906Rendezvous; + try { + const fallbackRzServer = this.props.client?.getClientWellKnown()?.["io.element.rendezvous"]?.server; - rendezvous = new MSC3906Rendezvous(channel, this.props.client, this.onFailure); + if (this.props.legacy) { + const transport = new MSC3886SimpleHttpRendezvousTransport({ + onFailure: this.onFailure, + client: this.props.client, + fallbackRzServer, + }); + const channel = new MSC3903ECDHv2RendezvousChannel(transport, undefined, this.onFailure); + rendezvous = new MSC3906Rendezvous(channel, this.props.client, this.onFailure); + } else { + const transport = new MSC4108RendezvousSession({ + onFailure: this.onFailure, + client: this.props.client, + fallbackRzServer, + }); + await transport.send(""); + const channel = new MSC4108SecureChannel(transport, undefined, this.onFailure); + rendezvous = new MSC4108SignInWithQR(channel, false, this.props.client, this.onFailure); + } await rendezvous.generateCode(); this.setState({ @@ -170,23 +222,84 @@ export default class LoginWithQR extends React.Component { }); } catch (e) { logger.error("Error whilst generating QR code", e); - this.setState({ phase: Phase.Error, failureReason: RendezvousFailureReason.HomeserverLacksSupport }); + this.setState({ phase: Phase.Error, failureReason: ClientRendezvousFailureReason.HomeserverLacksSupport }); return; } try { - const confirmationDigits = await rendezvous.startAfterShowingCode(); - this.setState({ phase: Phase.Connected, confirmationDigits }); - } catch (e) { - logger.error("Error whilst doing QR login", e); - // only set to error phase if it hasn't already been set by onFailure or similar - if (this.state.phase !== Phase.Error) { - this.setState({ phase: Phase.Error, failureReason: RendezvousFailureReason.Unknown }); + if (rendezvous instanceof MSC3906Rendezvous) { + const confirmationDigits = await rendezvous.startAfterShowingCode(); + this.setState({ phase: Phase.LegacyConnected, confirmationDigits }); + } else if (this.ourIntent === RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE) { + // MSC4108-Flow: NewScanned + await rendezvous.negotiateProtocols(); + const { verificationUri } = await rendezvous.deviceAuthorizationGrant(); + this.setState({ + phase: Phase.OutOfBandConfirmation, + verificationUri, + }); } + + // we ask the user to confirm that the channel is secure + } catch (e: RendezvousError | unknown) { + logger.error("Error whilst approving login", e); + if (rendezvous instanceof MSC3906Rendezvous) { + // only set to error phase if it hasn't already been set by onFailure or similar + if (this.state.phase !== Phase.Error) { + this.setState({ phase: Phase.Error, failureReason: LegacyRendezvousFailureReason.Unknown }); + } + } else { + await rendezvous?.cancel( + e instanceof RendezvousError + ? (e.code as MSC4108FailureReason) + : ClientRendezvousFailureReason.Unknown, + ); + } + } + }; + + private approveLogin = async (checkCode: string | undefined): Promise => { + if (!(this.state.rendezvous instanceof MSC4108SignInWithQR)) { + this.setState({ phase: Phase.Error, failureReason: ClientRendezvousFailureReason.Unknown }); + throw new Error("Rendezvous not found"); + } + + if (!this.state.lastScannedCode && this.state.rendezvous?.checkCode !== checkCode) { + this.setState({ failureReason: LoginWithQRFailureReason.CheckCodeMismatch }); + return; + } + + try { + if (this.ourIntent === RendezvousIntent.RECIPROCATE_LOGIN_ON_EXISTING_DEVICE) { + // MSC4108-Flow: NewScanned + this.setState({ phase: Phase.Loading }); + + if (this.state.verificationUri) { + window.open(this.state.verificationUri, "_blank"); + } + + this.setState({ phase: Phase.WaitingForDevice }); + + // send secrets + await this.state.rendezvous.shareSecrets(); + + // done + this.onFinished(true); + } else { + this.setState({ phase: Phase.Error, failureReason: ClientRendezvousFailureReason.Unknown }); + throw new Error("New device flows around OIDC are not yet implemented"); + } + } catch (e: RendezvousError | unknown) { + logger.error("Error whilst approving sign in", e); + this.setState({ + phase: Phase.Error, + failureReason: e instanceof RendezvousError ? e.code : ClientRendezvousFailureReason.Unknown, + }); } }; private onFailure = (reason: RendezvousFailureReason): void => { + if (this.state.phase === Phase.Error) return; // Already in failed state logger.info(`Rendezvous failed: ${reason}`); this.setState({ phase: Phase.Error, failureReason: reason }); }; @@ -195,44 +308,72 @@ export default class LoginWithQR extends React.Component { this.setState({ rendezvous: undefined, confirmationDigits: undefined, + verificationUri: undefined, failureReason: undefined, + userCode: undefined, + checkCode: undefined, + homeserverBaseUrl: undefined, + lastScannedCode: undefined, + mediaPermissionError: false, }); } - private onClick = async (type: Click): Promise => { + private onClick = async (type: Click, checkCode?: string): Promise => { switch (type) { case Click.Cancel: - await this.state.rendezvous?.cancel(RendezvousFailureReason.UserCancelled); + if (this.state.rendezvous instanceof MSC3906Rendezvous) { + await this.state.rendezvous?.cancel(LegacyRendezvousFailureReason.UserCancelled); + } else { + await this.state.rendezvous?.cancel(MSC4108FailureReason.UserCancelled); + } this.reset(); - this.props.onFinished(false); + this.onFinished(false); break; case Click.Approve: - await this.approveLogin(); + await (this.props.legacy ? this.legacyApproveLogin() : this.approveLogin(checkCode)); break; case Click.Decline: await this.state.rendezvous?.declineLoginOnExistingDevice(); this.reset(); - this.props.onFinished(false); - break; - case Click.TryAgain: - this.reset(); - await this.updateMode(this.props.mode); + this.onFinished(false); break; case Click.Back: - await this.state.rendezvous?.cancel(RendezvousFailureReason.UserCancelled); - this.props.onFinished(false); + if (this.state.rendezvous instanceof MSC3906Rendezvous) { + await this.state.rendezvous?.cancel(LegacyRendezvousFailureReason.UserCancelled); + } else { + await this.state.rendezvous?.cancel(MSC4108FailureReason.UserCancelled); + } + this.onFinished(false); + break; + case Click.ShowQr: + await this.updateMode(Mode.Show); break; } }; public render(): React.ReactNode { + if (this.state.rendezvous instanceof MSC3906Rendezvous) { + return ( + + ); + } + return ( ); } diff --git a/src/components/views/auth/LoginWithQRFlow.tsx b/src/components/views/auth/LoginWithQRFlow.tsx index 6a6b78a29b..036dc1b451 100644 --- a/src/components/views/auth/LoginWithQRFlow.tsx +++ b/src/components/views/auth/LoginWithQRFlow.tsx @@ -14,12 +14,16 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { ReactNode } from "react"; -import { RendezvousFailureReason as LegacyRendezvousFailureReason } from "matrix-js-sdk/src/rendezvous"; +import React, { createRef, ReactNode } from "react"; +import { + ClientRendezvousFailureReason, + LegacyRendezvousFailureReason, + MSC4108FailureReason, +} from "matrix-js-sdk/src/rendezvous"; import { Icon as ChevronLeftIcon } from "@vector-im/compound-design-tokens/icons/chevron-left.svg"; import { Icon as CheckCircleSolidIcon } from "@vector-im/compound-design-tokens/icons/check-circle-solid.svg"; import { Icon as ErrorIcon } from "@vector-im/compound-design-tokens/icons/error.svg"; -import { Heading, Text } from "@vector-im/compound-web"; +import { Heading, MFAInput, Text } from "@vector-im/compound-web"; import classNames from "classnames"; import { _t } from "../../../languageHandler"; @@ -30,13 +34,24 @@ import { Icon as InfoIcon } from "../../../../res/img/element-icons/i.svg"; import { Click, Phase } from "./LoginWithQR-types"; import SdkConfig from "../../../SdkConfig"; import { FailureReason, LoginWithQRFailureReason } from "./LoginWithQR"; +import { XOR } from "../../../@types/common"; +import { ErrorMessage } from "../../structures/ErrorMessage"; + +/** + * @deprecated the MSC3906 implementation is deprecated in favour of MSC4108. + */ +interface MSC3906Props extends Pick { + code?: string; + confirmationDigits?: string; +} interface Props { phase: Phase; - code?: string; - onClick(type: Click): Promise; + code?: Uint8Array; + onClick(type: Click, checkCodeEntered?: string): Promise; failureReason?: FailureReason; - confirmationDigits?: string; + userCode?: string; + checkCode?: string; } // n.b MSC3886/MSC3903/MSC3906 that this is based on are now closed. @@ -46,17 +61,19 @@ interface Props { /** * A component that implements the UI for sign in and E2EE set up with a QR code. * - * This uses the unstable feature of MSC3906: https://github.com/matrix-org/matrix-spec-proposals/pull/3906 + * This supports the unstable features of MSC3906 and MSC4108 */ -export default class LoginWithQRFlow extends React.Component { - public constructor(props: Props) { +export default class LoginWithQRFlow extends React.Component> { + private checkCodeInput = createRef(); + + public constructor(props: XOR) { super(props); } private handleClick = (type: Click): ((e: React.FormEvent) => Promise) => { return async (e: React.FormEvent): Promise => { e.preventDefault(); - await this.props.onClick(type); + await this.props.onClick(type, type === Click.Approve ? this.checkCodeInput.current?.value : undefined); }; }; @@ -90,24 +107,26 @@ export default class LoginWithQRFlow extends React.Component { let message: ReactNode | undefined; switch (this.props.failureReason) { - case LegacyRendezvousFailureReason.UnsupportedAlgorithm: - case LegacyRendezvousFailureReason.UnsupportedTransport: - case LegacyRendezvousFailureReason.HomeserverLacksSupport: + case MSC4108FailureReason.UnsupportedProtocol: + case LegacyRendezvousFailureReason.UnsupportedProtocol: title = _t("auth|qr_code_login|error_unsupported_protocol_title"); message = _t("auth|qr_code_login|error_unsupported_protocol"); break; + case MSC4108FailureReason.UserCancelled: case LegacyRendezvousFailureReason.UserCancelled: title = _t("auth|qr_code_login|error_user_cancelled_title"); message = _t("auth|qr_code_login|error_user_cancelled"); break; + case MSC4108FailureReason.AuthorizationExpired: + case ClientRendezvousFailureReason.Expired: case LegacyRendezvousFailureReason.Expired: title = _t("auth|qr_code_login|error_expired_title"); message = _t("auth|qr_code_login|error_expired"); break; - case LegacyRendezvousFailureReason.InvalidCode: + case ClientRendezvousFailureReason.InsecureChannelDetected: title = _t("auth|qr_code_login|error_insecure_channel_detected_title"); message = ( <> @@ -125,13 +144,13 @@ export default class LoginWithQRFlow extends React.Component { ); break; - case LegacyRendezvousFailureReason.OtherDeviceAlreadySignedIn: + case ClientRendezvousFailureReason.OtherDeviceAlreadySignedIn: success = true; title = _t("auth|qr_code_login|error_other_device_already_signed_in_title"); message = _t("auth|qr_code_login|error_other_device_already_signed_in"); break; - case LegacyRendezvousFailureReason.UserDeclined: + case ClientRendezvousFailureReason.UserDeclined: title = _t("auth|qr_code_login|error_user_declined_title"); message = _t("auth|qr_code_login|error_user_declined"); break; @@ -141,8 +160,16 @@ export default class LoginWithQRFlow extends React.Component { message = _t("auth|qr_code_login|error_rate_limited"); break; - case LegacyRendezvousFailureReason.OtherDeviceNotSignedIn: - case LegacyRendezvousFailureReason.Unknown: + case ClientRendezvousFailureReason.ETagMissing: + title = _t("error|something_went_wrong"); + message = _t("auth|qr_code_login|error_etag_missing"); + break; + + case MSC4108FailureReason.DeviceAlreadyExists: + case MSC4108FailureReason.DeviceNotFound: + case MSC4108FailureReason.UnexpectedMessageReceived: + case ClientRendezvousFailureReason.OtherDeviceNotSignedIn: + case ClientRendezvousFailureReason.Unknown: default: title = _t("error|something_went_wrong"); message = _t("auth|qr_code_login|error_unexpected"); @@ -150,18 +177,6 @@ export default class LoginWithQRFlow extends React.Component { } className = "mx_LoginWithQR_error"; backButton = false; - buttons = ( - <> - - {_t("action|try_again")} - - {this.cancelButton()} - - ); main = ( <>
{ ); break; } - case Phase.Connected: + case Phase.LegacyConnected: backButton = false; main = ( <> @@ -213,9 +228,62 @@ export default class LoginWithQRFlow extends React.Component { ); break; + case Phase.OutOfBandConfirmation: + backButton = false; + main = ( + <> + + {_t("auth|qr_code_login|check_code_heading")} + + {_t("auth|qr_code_login|check_code_explainer")} + + + + + ); + + buttons = ( + <> + + {_t("action|continue")} + + + {_t("action|cancel")} + + + ); + break; case Phase.ShowingQR: if (this.props.code) { - const data = Buffer.from(this.props.code ?? ""); + const data = + typeof this.props.code !== "string" ? this.props.code : Buffer.from(this.props.code ?? ""); main = ( <> @@ -249,12 +317,19 @@ export default class LoginWithQRFlow extends React.Component { case Phase.Loading: main = this.simpleSpinner(); break; - case Phase.Connecting: - main = this.simpleSpinner(_t("auth|qr_code_login|connecting")); - buttons = this.cancelButton(); - break; case Phase.WaitingForDevice: - main = this.simpleSpinner(_t("auth|qr_code_login|waiting_for_device")); + main = ( + <> + {this.simpleSpinner(_t("auth|qr_code_login|waiting_for_device"))} + {this.props.userCode ? ( +
+

{_t("auth|qr_code_login|security_code")}

+

{_t("auth|qr_code_login|security_code_prompt")}

+

{this.props.userCode}

+
+ ) : null} + + ); buttons = this.cancelButton(); break; case Phase.Verifying: diff --git a/src/components/views/avatars/RoomAvatar.tsx b/src/components/views/avatars/RoomAvatar.tsx index 22dbb4dcf6..8380fb477a 100644 --- a/src/components/views/avatars/RoomAvatar.tsx +++ b/src/components/views/avatars/RoomAvatar.tsx @@ -44,6 +44,19 @@ interface IState { urls: string[]; } +export function idNameForRoom(room: Room): string { + const dmMapUserId = DMRoomMap.shared().getUserIdForRoomId(room.roomId); + // If the room is a DM, we use the other user's ID for the color hash + // in order to match the room avatar with their avatar + if (dmMapUserId) return dmMapUserId; + + if (room instanceof LocalRoom && room.targets.length === 1) { + return room.targets[0].userId; + } + + return room.roomId; +} + export default class RoomAvatar extends React.Component { public static defaultProps = { size: "36px", @@ -117,17 +130,10 @@ export default class RoomAvatar extends React.Component { const room = this.props.room; if (room) { - const dmMapUserId = DMRoomMap.shared().getUserIdForRoomId(room.roomId); - // If the room is a DM, we use the other user's ID for the color hash - // in order to match the room avatar with their avatar - if (dmMapUserId) return dmMapUserId; - - if (room instanceof LocalRoom && room.targets.length === 1) { - return room.targets[0].userId; - } + return idNameForRoom(room); + } else { + return this.props.oobData?.roomId; } - - return this.props.room?.roomId || this.props.oobData?.roomId; } public render(): React.ReactNode { diff --git a/src/components/views/beta/BetaCard.tsx b/src/components/views/beta/BetaCard.tsx index 84c7a27fe0..7d17c3af94 100644 --- a/src/components/views/beta/BetaCard.tsx +++ b/src/components/views/beta/BetaCard.tsx @@ -27,7 +27,6 @@ import SdkConfig from "../../../SdkConfig"; import SettingsFlag from "../elements/SettingsFlag"; import { useFeatureEnabled } from "../../../hooks/useSettings"; import InlineSpinner from "../elements/InlineSpinner"; -import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import { shouldShowFeedback } from "../../../utils/Feedback"; // XXX: Keep this around for re-use in future Betas @@ -50,19 +49,15 @@ export const BetaPill: React.FC = ({ }) => { if (onClick) { return ( - -
{tooltipTitle}
-
{tooltipCaption}
-
- } + aria-label={`${tooltipTitle} ${tooltipCaption}`} + title={tooltipTitle} + caption={tooltipCaption} onClick={onClick} > {_t("common|beta")} - + ); } diff --git a/src/components/views/dialogs/CreateRoomDialog.tsx b/src/components/views/dialogs/CreateRoomDialog.tsx index a1fdc13f29..fa0eef5086 100644 --- a/src/components/views/dialogs/CreateRoomDialog.tsx +++ b/src/components/views/dialogs/CreateRoomDialog.tsx @@ -436,7 +436,7 @@ export default class CreateRoomDialog extends React.Component { ): void => { - const term = e.target.value; + // :TCHAP: lowercase-invite - const term = e.target.value; + const term = e.target.value?.toLowerCase(); + // end :TCHAP: + this.setState({ filterText: term }); // Debounce server lookups to reduce spam. We don't clear the existing server @@ -879,8 +882,9 @@ export default class InviteDialog extends React.PureComponent { timeline = [
{_t("server_offline|empty_timeline")}
]; } - const serverName = MatrixClientPeg.getHomeserverName(); + const serverName = MatrixClientPeg.safeGet().getDomain(); return ( (UIFeature.Voip); const mjolnirEnabled = useSettingValue("feature_mjolnir"); + // store this prop in state as changing tabs back and forth should clear it + const [showMsc4108QrCode, setShowMsc4108QrCode] = useState(props.showMsc4108QrCode); const getTabs = (): NonEmptyArray> => { const tabs: Tab[] = []; @@ -98,7 +103,7 @@ export default function UserSettingsDialog(props: IProps): JSX.Element { UserTab.SessionManager, _td("settings|sessions|title"), "mx_UserSettingsDialog_sessionsIcon", - , + , undefined, ), ); @@ -205,29 +210,41 @@ export default function UserSettingsDialog(props: IProps): JSX.Element { return tabs as NonEmptyArray>; }; - const [activeTabId, setActiveTabId] = useActiveTabWithDefault(getTabs(), UserTab.General, props.initialTabId); + const [activeTabId, _setActiveTabId] = useActiveTabWithDefault(getTabs(), UserTab.General, props.initialTabId); + const setActiveTabId = (tabId: UserTab): void => { + _setActiveTabId(tabId); + // Clear this so switching away from the tab and back to it will not show the QR code again + setShowMsc4108QrCode(false); + }; + + const [activeToast, toastRack] = useActiveToast(); return ( // XXX: SDKContext is provided within the LoggedInView subtree. // Modals function outside the MatrixChat React tree, so sdkContext is reprovided here to simulate that. // The longer term solution is to move our ModalManager into the React tree to inherit contexts properly. - -
- -
-
+ + +
+ +
+
+ {activeToast && {activeToast}} +
+
+
); } diff --git a/src/components/views/dialogs/devtools/ServerInfo.tsx b/src/components/views/dialogs/devtools/ServerInfo.tsx index e055fe1b5a..5b24ea4326 100644 --- a/src/components/views/dialogs/devtools/ServerInfo.tsx +++ b/src/components/views/dialogs/devtools/ServerInfo.tsx @@ -38,7 +38,7 @@ export async function getServerVersionFromFederationApi(client: MatrixClient): P let baseUrl = client.getHomeserverUrl(); try { - const hsName = MatrixClientPeg.getHomeserverName(); + const hsName = MatrixClientPeg.safeGet().getDomain(); // We don't use the js-sdk Autodiscovery module here as it only support client well-known, not server ones. const response = await fetch(`https://${hsName}/.well-known/matrix/server`); const json = await response.json(); diff --git a/src/components/views/dialogs/security/CreateCrossSigningDialog.tsx b/src/components/views/dialogs/security/CreateCrossSigningDialog.tsx index 3873fd2909..1a0fab6202 100644 --- a/src/components/views/dialogs/security/CreateCrossSigningDialog.tsx +++ b/src/components/views/dialogs/security/CreateCrossSigningDialog.tsx @@ -101,9 +101,6 @@ export default class CreateCrossSigningDialog extends React.PureComponent(SdkConfig.getObject("room_directory")?.get("servers") ?? []); removeAll(configServers, homeServer); // configured servers take preference over user-defined ones, if one occurs in both ignore the latter one. diff --git a/src/components/views/elements/AccessibleButton.tsx b/src/components/views/elements/AccessibleButton.tsx index d94162393e..76b90506dc 100644 --- a/src/components/views/elements/AccessibleButton.tsx +++ b/src/components/views/elements/AccessibleButton.tsx @@ -106,6 +106,11 @@ type Props = DynamicHtmlElementProps & * Callback for when the tooltip is opened or closed. */ onTooltipOpenChange?: TooltipProps["onOpenChange"]; + + /** + * Whether the tooltip should be disabled. + */ + disableTooltip?: TooltipProps["disabled"]; }; /** @@ -140,6 +145,7 @@ const AccessibleButton = forwardRef(function , ref: Ref, @@ -217,6 +223,7 @@ const AccessibleButton = forwardRef(function {button} diff --git a/src/components/views/elements/AccessibleTooltipButton.tsx b/src/components/views/elements/AccessibleTooltipButton.tsx deleted file mode 100644 index 759643da1c..0000000000 --- a/src/components/views/elements/AccessibleTooltipButton.tsx +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> -Copyright 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React, { SyntheticEvent, FocusEvent, forwardRef, useEffect, Ref, useState, ComponentProps } from "react"; - -import AccessibleButton from "./AccessibleButton"; -import Tooltip, { Alignment } from "./Tooltip"; - -/** - * Type of props accepted by {@link AccessibleTooltipButton}. - * - * Extends that of {@link AccessibleButton}. - */ -type Props = ComponentProps> & { - /** - * Title to show in the tooltip and use as aria-label - */ - title?: string; - /** - * Tooltip node to show in the tooltip, takes precedence over `title` - */ - tooltip?: React.ReactNode; - /** - * Trigger label to render - */ - label?: string; - /** - * Classname to apply to the tooltip - */ - tooltipClassName?: string; - /** - * Force the tooltip to be hidden - */ - forceHide?: boolean; - /** - * Alignment to render the tooltip with - */ - alignment?: Alignment; - /** - * Function to call when the children are hovered over - */ - onHover?: (hovering: boolean) => void; - /** - * Function to call when the tooltip goes from shown to hidden. - */ - onHideTooltip?(ev: SyntheticEvent): void; -}; - -/** - * @deprecated use AccessibleButton with `title` and `caption` instead. - */ -const AccessibleTooltipButton = forwardRef(function ( - { title, tooltip, children, forceHide, alignment, onHideTooltip, tooltipClassName, element, ...props }: Props, - ref: Ref, -) { - const [hover, setHover] = useState(false); - - useEffect(() => { - // If forceHide is set then force hover to off to hide the tooltip - if (forceHide && hover) { - setHover(false); - } - }, [forceHide, hover]); - - const showTooltip = (): void => { - props.onHover?.(true); - if (forceHide) return; - setHover(true); - }; - - const hideTooltip = (ev: SyntheticEvent): void => { - props.onHover?.(false); - setHover(false); - onHideTooltip?.(ev); - }; - - const onFocus = (ev: FocusEvent): void => { - // We only show the tooltip if focus arrived here from some other - // element, to avoid leaving tooltips hanging around when a modal closes - if (ev.relatedTarget) showTooltip(); - }; - - const tip = hover && (title || tooltip) && ( - - ); - return ( - - {children} - {props.label} - {(tooltip || title) && tip} - - ); -}); - -export default AccessibleTooltipButton; diff --git a/src/components/views/elements/AppPermission.tsx b/src/components/views/elements/AppPermission.tsx index 362863fc3a..fd788290c0 100644 --- a/src/components/views/elements/AppPermission.tsx +++ b/src/components/views/elements/AppPermission.tsx @@ -18,6 +18,7 @@ limitations under the License. import React from "react"; import { RoomMember } from "matrix-js-sdk/src/matrix"; +import { Tooltip } from "@vector-im/compound-web"; import { _t } from "../../../languageHandler"; import SdkConfig from "../../../SdkConfig"; @@ -29,7 +30,6 @@ import Heading from "../typography/Heading"; import AccessibleButton from "./AccessibleButton"; import { parseUrl } from "../../../utils/UrlUtils"; import { Icon as HelpIcon } from "../../../../res/img/feather-customised/help-circle.svg"; -import TooltipTarget from "./TooltipTarget"; interface IProps { url: string; @@ -99,31 +99,27 @@ export default class AppPermission extends React.Component { ); - const warningTooltipText = ( -
- {_t("analytics|shared_data_heading")} -
    -
  • {_t("widget|shared_data_name")}
  • -
  • {_t("widget|shared_data_avatar")}
  • -
  • {_t("widget|shared_data_mxid")}
  • -
  • {_t("widget|shared_data_device_id")}
  • -
  • {_t("widget|shared_data_theme")}
  • -
  • {_t("widget|shared_data_lang")}
  • -
  • {_t("widget|shared_data_url", { brand })}
  • -
  • {_t("widget|shared_data_room_id")}
  • -
  • {_t("widget|shared_data_widget_id")}
  • -
-
- ); const warningTooltip = ( - +
  • {_t("widget|shared_data_name")}
  • +
  • {_t("widget|shared_data_avatar")}
  • +
  • {_t("widget|shared_data_mxid")}
  • +
  • {_t("widget|shared_data_device_id")}
  • +
  • {_t("widget|shared_data_theme")}
  • +
  • {_t("widget|shared_data_lang")}
  • +
  • {_t("widget|shared_data_url", { brand })}
  • +
  • {_t("widget|shared_data_room_id")}
  • +
  • {_t("widget|shared_data_widget_id")}
  • + + } > - -
    +
    + +
    +
    ); // Due to i18n limitations, we can't dedupe the code for variables in these two messages. diff --git a/src/components/views/elements/CopyableText.tsx b/src/components/views/elements/CopyableText.tsx index 5d9946d2c1..994d81607b 100644 --- a/src/components/views/elements/CopyableText.tsx +++ b/src/components/views/elements/CopyableText.tsx @@ -22,14 +22,14 @@ import { _t } from "../../../languageHandler"; import { copyPlaintext } from "../../../utils/strings"; import AccessibleButton, { ButtonEvent } from "./AccessibleButton"; -interface IProps { +interface IProps extends React.HTMLAttributes { children?: React.ReactNode; getTextToCopy: () => string | null; border?: boolean; className?: string; } -const CopyableText: React.FC = ({ children, getTextToCopy, border = true, className }) => { +const CopyableText: React.FC = ({ children, getTextToCopy, border = true, className, ...props }) => { const [tooltip, setTooltip] = useState(undefined); const onCopyClickInternal = async (e: ButtonEvent): Promise => { @@ -50,7 +50,7 @@ const CopyableText: React.FC = ({ children, getTextToCopy, border = true }); return ( -
    +
    {children} { return this.props.inputRef ?? this._inputRef; } + private onKeyDown = (evt: KeyboardEvent): void => { + // If the tooltip is displayed to show a feedback and Escape is pressed + // The tooltip is hided + if (this.state.feedbackVisible && evt.key === Key.ESCAPE) { + evt.preventDefault(); + evt.stopPropagation(); + this.setState({ + feedbackVisible: false, + }); + } + }; + public render(): React.ReactNode { /* eslint @typescript-eslint/no-unused-vars: ["error", { "ignoreRestSiblings": true }] */ const { @@ -318,7 +338,7 @@ export default class Field extends React.PureComponent { }); return ( -
    +
    {prefixContainer} {fieldInput} diff --git a/src/components/views/elements/RoomTopic.tsx b/src/components/views/elements/RoomTopic.tsx index f926ef5cf4..9647188304 100644 --- a/src/components/views/elements/RoomTopic.tsx +++ b/src/components/views/elements/RoomTopic.tsx @@ -14,12 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { useCallback, useContext, useRef } from "react"; +import React, { useCallback, useContext, useState } from "react"; import { Room, EventType } from "matrix-js-sdk/src/matrix"; import classNames from "classnames"; +import { Tooltip } from "@vector-im/compound-web"; import { useTopic } from "../../../hooks/room/useTopic"; -import { Alignment } from "./Tooltip"; import { _t } from "../../../languageHandler"; import dis from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; @@ -28,7 +28,6 @@ import InfoDialog from "../dialogs/InfoDialog"; import { useDispatcher } from "../../../hooks/useDispatcher"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import AccessibleButton from "./AccessibleButton"; -import TooltipTarget from "./TooltipTarget"; import { Linkify, topicToHtml } from "../../../HtmlUtils"; import { tryTransformPermalinkToLocalHref } from "../../../utils/permalinks/Permalinks"; @@ -49,10 +48,10 @@ export function onRoomTopicLinkClick(e: React.MouseEvent): void { export default function RoomTopic({ room, className, ...props }: IProps): JSX.Element { const client = useContext(MatrixClientContext); - const ref = useRef(null); + const [disableTooltip, setDisableTooltip] = useState(false); const topic = useTopic(room); - const body = topicToHtml(topic?.text, topic?.html, ref); + const body = topicToHtml(topic?.text, topic?.html); const onClick = useCallback( (e: React.MouseEvent) => { @@ -70,14 +69,14 @@ export default function RoomTopic({ room, className, ...props }: IProps): JSX.El [props], ); - const ignoreHover = (ev: React.MouseEvent): boolean => { - return (ev.target as HTMLElement).tagName.toUpperCase() === "A"; + const onHover = (ev: React.MouseEvent | React.FocusEvent): void => { + setDisableTooltip((ev.target as HTMLElement).tagName.toUpperCase() === "A"); }; useDispatcher(dis, (payload) => { if (payload.action === Action.ShowRoomTopic) { const canSetTopic = room.currentState.maySendStateEvent(EventType.RoomTopic, client.getSafeUserId()); - const body = topicToHtml(topic?.text, topic?.html, ref, true); + const body = topicToHtml(topic?.text, topic?.html, undefined, true); const modal = Modal.createDialog(InfoDialog, { title: room.name, @@ -115,18 +114,24 @@ export default function RoomTopic({ room, className, ...props }: IProps): JSX.El } }); + // Do not render the tooltip if the topic is empty + // We still need to have a div for the header buttons to be displayed correctly + if (!body) return
    ; + return ( - - {body} - + +
    + {body} +
    +
    ); } diff --git a/src/components/views/elements/Tooltip.tsx b/src/components/views/elements/Tooltip.tsx index aafa28b59a..fdba5f6f5c 100644 --- a/src/components/views/elements/Tooltip.tsx +++ b/src/components/views/elements/Tooltip.tsx @@ -57,6 +57,9 @@ export interface ITooltipProps { type State = Partial>; +/** + * @deprecated Use [compound tooltip](https://element-hq.github.io/compound-web/?path=/docs/tooltip--docs) instead + */ export default class Tooltip extends React.PureComponent { private static container: HTMLElement; private parent: Element | null = null; diff --git a/src/components/views/elements/TooltipTarget.tsx b/src/components/views/elements/TooltipTarget.tsx deleted file mode 100644 index 89de915b45..0000000000 --- a/src/components/views/elements/TooltipTarget.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright 2021 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React, { forwardRef, HTMLAttributes, useRef } from "react"; -import { randomString } from "matrix-js-sdk/src/randomstring"; - -import useFocus from "../../../hooks/useFocus"; -import useHover from "../../../hooks/useHover"; -import Tooltip, { ITooltipProps } from "./Tooltip"; - -interface IProps - extends HTMLAttributes, - Omit { - tooltipTargetClassName?: string; - ignoreHover?: (ev: React.MouseEvent) => boolean; -} - -/** - * Generic tooltip target element that handles tooltip visibility state - * and displays children - */ -const TooltipTarget = forwardRef( - ( - { - children, - tooltipTargetClassName, - // tooltip pass through props - className, - id, - label, - alignment, - tooltipClassName, - maxParentWidth, - ignoreHover, - ...rest - }, - ref, - ) => { - const idRef = useRef("mx_TooltipTarget_" + randomString(8)); - // Use generated ID if one is not passed - if (id === undefined) { - id = idRef.current; - } - - const [isFocused, focusProps] = useFocus(); - const [isHovering, hoverProps] = useHover(ignoreHover || (() => false)); - - // No need to fill up the DOM with hidden tooltip elements. Only add the - // tooltip when we're hovering over the item (performance) - const tooltip = (isFocused || isHovering) && ( - - ); - - return ( -
    - {children} - {tooltip} -
    - ); - }, -); - -export default TooltipTarget; diff --git a/src/components/views/messages/DownloadActionButton.tsx b/src/components/views/messages/DownloadActionButton.tsx index 4105426bb5..457a79b8db 100644 --- a/src/components/views/messages/DownloadActionButton.tsx +++ b/src/components/views/messages/DownloadActionButton.tsx @@ -20,7 +20,7 @@ import classNames from "classnames"; import { Icon as DownloadIcon } from "../../../../res/img/download.svg"; import { MediaEventHelper } from "../../../utils/MediaEventHelper"; -import { RovingAccessibleTooltipButton } from "../../../accessibility/RovingTabIndex"; +import { RovingAccessibleButton } from "../../../accessibility/RovingTabIndex"; import Spinner from "../elements/Spinner"; import { _t, _td, TranslationKey } from "../../../languageHandler"; import { FileDownloader } from "../../../utils/FileDownloader"; @@ -93,7 +93,7 @@ export default class DownloadActionButton extends React.PureComponent {spinner} - + ); } } diff --git a/src/components/views/messages/MLocationBody.tsx b/src/components/views/messages/MLocationBody.tsx index 29c1c97e1a..eedf5a6046 100644 --- a/src/components/views/messages/MLocationBody.tsx +++ b/src/components/views/messages/MLocationBody.tsx @@ -17,6 +17,7 @@ limitations under the License. import React from "react"; import { MatrixEvent, ClientEvent, ClientEventHandlerMap } from "matrix-js-sdk/src/matrix"; import { randomString } from "matrix-js-sdk/src/randomstring"; +import { Tooltip } from "@vector-im/compound-web"; import { _t } from "../../../languageHandler"; import Modal from "../../../Modal"; @@ -27,8 +28,6 @@ import { isSelfLocation, } from "../../../utils/location"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; -import TooltipTarget from "../elements/TooltipTarget"; -import { Alignment } from "../elements/Tooltip"; import { SmartMarker, Map, LocationViewDialog } from "../location"; import { IBodyProps } from "./IBodyProps"; import { createReconnectedListener } from "../../../utils/connection"; @@ -126,7 +125,7 @@ export const LocationBodyFallbackContent: React.FC<{ event: MatrixEvent; error: interface LocationBodyContentProps { mxEvent: MatrixEvent; mapId: string; - tooltip?: string; + tooltip: string; onError: (error: Error) => void; onClick?: () => void; } @@ -156,13 +155,9 @@ export const LocationBodyContent: React.FC = ({ return (
    - {tooltip ? ( - - {mapElement} - - ) : ( - mapElement - )} + +
    {mapElement}
    +
    ); }; diff --git a/src/components/views/messages/MessageActionBar.tsx b/src/components/views/messages/MessageActionBar.tsx index 86c8fb127a..2c314d284e 100644 --- a/src/components/views/messages/MessageActionBar.tsx +++ b/src/components/views/messages/MessageActionBar.tsx @@ -43,7 +43,7 @@ import ContextMenu, { aboveLeftOf, ContextMenuTooltipButton, useContextMenu } fr import { isContentActionable, canEditContent, editEvent, canCancel } from "../../../utils/EventUtils"; import RoomContext, { TimelineRenderingType } from "../../../contexts/RoomContext"; import Toolbar from "../../../accessibility/Toolbar"; -import { RovingAccessibleTooltipButton, useRovingTabIndex } from "../../../accessibility/RovingTabIndex"; +import { RovingAccessibleButton, useRovingTabIndex } from "../../../accessibility/RovingTabIndex"; import MessageContextMenu from "../context_menus/MessageContextMenu"; import Resend from "../../../Resend"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; @@ -235,7 +235,7 @@ const ReplyInThreadButton: React.FC = ({ mxEvent }) => { const title = !hasARelation ? _t("action|reply_in_thread") : _t("threads|error_start_thread_existing_relation"); return ( - = ({ mxEvent }) => { placement="left" > - + ); }; @@ -391,7 +391,7 @@ export default class MessageActionBar extends React.PureComponent - , + , ); } const cancelSendingButton = ( - - + ); const threadTooltipButton = ; @@ -431,7 +431,7 @@ export default class MessageActionBar extends React.PureComponent - , + , ); // The delete button should appear last, so we can just drop it at the end @@ -458,7 +458,7 @@ export default class MessageActionBar extends React.PureComponent - , + , ); } // We hide the react button in search results as we don't show reactions in results @@ -515,7 +515,7 @@ export default class MessageActionBar extends React.PureComponent {this.props.isQuoteExpanded ? : } - , + , ); } diff --git a/src/components/views/messages/ReactionsRowButton.tsx b/src/components/views/messages/ReactionsRowButton.tsx index 2737212d33..1dbd1bd7bf 100644 --- a/src/components/views/messages/ReactionsRowButton.tsx +++ b/src/components/views/messages/ReactionsRowButton.tsx @@ -44,20 +44,10 @@ export interface IProps { customReactionImagesEnabled?: boolean; } -interface IState { - tooltipRendered: boolean; - tooltipVisible: boolean; -} - -export default class ReactionsRowButton extends React.PureComponent { +export default class ReactionsRowButton extends React.PureComponent { public static contextType = MatrixClientContext; public context!: React.ContextType; - public state = { - tooltipRendered: false, - tooltipVisible: false, - }; - public onClick = (): void => { const { mxEvent, myReactionEvent, content } = this.props; if (myReactionEvent) { @@ -74,21 +64,6 @@ export default class ReactionsRowButton extends React.PureComponent { - this.setState({ - // To avoid littering the DOM with a tooltip for every reaction, - // only render it on first use. - tooltipRendered: true, - tooltipVisible: true, - }); - }; - - public onMouseLeave = (): void => { - this.setState({ - tooltipVisible: false, - }); - }; - public render(): React.ReactNode { const { mxEvent, content, count, reactionEvents, myReactionEvent } = this.props; @@ -97,19 +72,6 @@ export default class ReactionsRowButton extends React.PureComponent - ); - } - const room = this.context.getRoom(mxEvent.getRoomId()); let label: string | undefined; let customReactionName: string | undefined; @@ -156,20 +118,24 @@ export default class ReactionsRowButton extends React.PureComponent - {reactionContent} - - {tooltip} - + + {reactionContent} + + + ); } } diff --git a/src/components/views/messages/ReactionsRowButtonTooltip.tsx b/src/components/views/messages/ReactionsRowButtonTooltip.tsx index f2a3d26109..5b4db10ed6 100644 --- a/src/components/views/messages/ReactionsRowButtonTooltip.tsx +++ b/src/components/views/messages/ReactionsRowButtonTooltip.tsx @@ -14,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from "react"; +import React, { PropsWithChildren } from "react"; import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { Tooltip } from "@vector-im/compound-web"; import { unicodeToShortcode } from "../../../HtmlUtils"; import { _t } from "../../../languageHandler"; import { formatList } from "../../../utils/FormattingUtils"; -import Tooltip from "../elements/Tooltip"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { REACTION_SHORTCODE_KEY } from "./ReactionsRow"; interface IProps { @@ -30,20 +30,18 @@ interface IProps { content: string; // A list of Matrix reaction events for this key reactionEvents: MatrixEvent[]; - visible: boolean; // Whether to render custom image reactions customReactionImagesEnabled?: boolean; } -export default class ReactionsRowButtonTooltip extends React.PureComponent { +export default class ReactionsRowButtonTooltip extends React.PureComponent> { public static contextType = MatrixClientContext; public context!: React.ContextType; public render(): React.ReactNode { - const { content, reactionEvents, mxEvent, visible } = this.props; + const { content, reactionEvents, mxEvent, children } = this.props; const room = this.context.getRoom(mxEvent.getRoomId()); - let tooltipLabel: JSX.Element | undefined; if (room) { const senders: string[] = []; let customReactionName: string | undefined; @@ -57,34 +55,16 @@ export default class ReactionsRowButtonTooltip extends React.PureComponent - {_t( - "timeline|reactions|tooltip", - { - shortName, - }, - { - reactors: () => { - return
    {formatList(senders, 6)}
    ; - }, - reactedWith: (sub) => { - if (!shortName) { - return null; - } - return
    {sub}
    ; - }, - }, - )} -
    - ); - } + const formattedSenders = formatList(senders, 6); + const caption = shortName ? _t("timeline|reactions|tooltip_caption", { shortName }) : undefined; - let tooltip: JSX.Element | undefined; - if (tooltipLabel) { - tooltip = ; + return ( + + {children} + + ); } - return tooltip; + return children; } } diff --git a/src/components/views/pips/WidgetPip.tsx b/src/components/views/pips/WidgetPip.tsx index 2ba9e39e25..9bba2ccc53 100644 --- a/src/components/views/pips/WidgetPip.tsx +++ b/src/components/views/pips/WidgetPip.tsx @@ -26,7 +26,7 @@ import WidgetStore from "../../../stores/WidgetStore"; import { Container, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore"; import { useTypedEventEmitterState } from "../../../hooks/useEventEmitter"; import Toolbar from "../../../accessibility/Toolbar"; -import { RovingAccessibleButton, RovingAccessibleTooltipButton } from "../../../accessibility/RovingTabIndex"; +import { RovingAccessibleButton } from "../../../accessibility/RovingTabIndex"; import { Icon as BackIcon } from "../../../../res/img/element-icons/back.svg"; import { Icon as HangupIcon } from "../../../../res/img/element-icons/call/hangup.svg"; import { _t } from "../../../languageHandler"; @@ -125,14 +125,14 @@ export const WidgetPip: FC = ({ widgetId, room, viewingRoom, onStartMovin {(call !== null || WidgetType.JITSI.matches(widget?.type)) && ( - - + )}
    diff --git a/src/components/views/right_panel/EncryptionPanel.tsx b/src/components/views/right_panel/EncryptionPanel.tsx index d6e2ee4407..26ba841f71 100644 --- a/src/components/views/right_panel/EncryptionPanel.tsx +++ b/src/components/views/right_panel/EncryptionPanel.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { useCallback, useEffect, useState } from "react"; +import React, { useCallback, useEffect, useRef, useState } from "react"; import { VerificationPhase, VerificationRequest, VerificationRequestEvent } from "matrix-js-sdk/src/crypto-api"; import { RoomMember, User } from "matrix-js-sdk/src/matrix"; @@ -69,13 +69,17 @@ const EncryptionPanel: React.FC = (props: IProps) => { awaitPromise(); } }, [verificationRequestPromise]); + // Use a ref to track whether we are already showing the mismatch modal as state may not update fast enough + // if two change events are fired in quick succession like can happen with rust crypto. + const isShowingMismatchModal = useRef(false); const changeHandler = useCallback(() => { // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card if ( - request && - request.phase === VerificationPhase.Cancelled && + !isShowingMismatchModal.current && + request?.phase === VerificationPhase.Cancelled && MISMATCHES.includes(request.cancellationCode ?? "") ) { + isShowingMismatchModal.current = true; Modal.createDialog(ErrorDialog, { headerImage: require("../../../../res/img/e2e/warning-deprecated.svg").default, title: _t("encryption|messages_not_secure|title"), diff --git a/src/components/views/right_panel/UserInfo.tsx b/src/components/views/right_panel/UserInfo.tsx index dbc6acb29b..d9839252f9 100644 --- a/src/components/views/right_panel/UserInfo.tsx +++ b/src/components/views/right_panel/UserInfo.tsx @@ -43,7 +43,6 @@ import DMRoomMap from "../../../utils/DMRoomMap"; import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; import SdkConfig from "../../../SdkConfig"; import MultiInviter from "../../../utils/MultiInviter"; -import { MatrixClientPeg } from "../../../MatrixClientPeg"; import E2EIcon from "../rooms/E2EIcon"; import { useTypedEventEmitter } from "../../../hooks/useEventEmitter"; import { textualPowerLevel } from "../../../Roles"; @@ -1413,8 +1412,7 @@ const BasicUserInfo: React.FC<{ // We don't need a perfect check here, just something to pass as "probably not our homeserver". If // someone does figure out how to bypass this check the worst that happens is an error. - // FIXME this should be using cli instead of MatrixClientPeg.matrixClient - if (isSynapseAdmin && member.userId.endsWith(`:${MatrixClientPeg.getHomeserverName()}`)) { + if (isSynapseAdmin && member.userId.endsWith(`:${cli.getDomain()}`)) { synapseDeactivateButton = ( ; @@ -57,8 +57,7 @@ export default class RoomProfileSettings extends React.Component if (!room) throw new Error(`Expected a room for ID: ${props.roomId}`); const avatarEvent = room.currentState.getStateEvents(EventType.RoomAvatar, ""); - let avatarUrl = avatarEvent?.getContent()["url"] ?? null; - if (avatarUrl) avatarUrl = mediaFromMxc(avatarUrl).getSquareThumbnailHttp(96); + const avatarUrl = avatarEvent?.getContent()["url"] ?? null; const topicEvent = room.currentState.getStateEvents(EventType.RoomTopic, ""); const topic = topicEvent && topicEvent.getContent() ? topicEvent.getContent()["topic"] : ""; @@ -71,8 +70,8 @@ export default class RoomProfileSettings extends React.Component originalDisplayName: name, displayName: name, originalAvatarUrl: avatarUrl, - avatarUrl: avatarUrl, avatarFile: null, + avatarRemovalPending: false, originalTopic: topic, topic: topic, profileFieldsTouched: {}, @@ -82,16 +81,23 @@ export default class RoomProfileSettings extends React.Component }; } - private uploadAvatar = (): void => { - this.avatarUpload.current?.click(); + private onAvatarChanged = (file: File): void => { + this.setState({ + avatarFile: file, + avatarRemovalPending: false, + profileFieldsTouched: { + ...this.state.profileFieldsTouched, + avatar: true, + }, + }); }; private removeAvatar = (): void => { // clear file upload field so same file can be selected if (this.avatarUpload.current) this.avatarUpload.current.value = ""; this.setState({ - avatarUrl: null, avatarFile: null, + avatarRemovalPending: true, profileFieldsTouched: { ...this.state.profileFieldsTouched, avatar: true, @@ -112,8 +118,8 @@ export default class RoomProfileSettings extends React.Component profileFieldsTouched: {}, displayName: this.state.originalDisplayName, topic: this.state.originalTopic, - avatarUrl: this.state.originalAvatarUrl, avatarFile: null, + avatarRemovalPending: false, }); }; @@ -138,11 +144,12 @@ export default class RoomProfileSettings extends React.Component if (this.state.avatarFile) { const { content_uri: uri } = await client.uploadContent(this.state.avatarFile); await client.sendStateEvent(this.props.roomId, EventType.RoomAvatar, { url: uri }, ""); - newState.avatarUrl = mediaFromMxc(uri).getSquareThumbnailHttp(96); - newState.originalAvatarUrl = newState.avatarUrl; + newState.originalAvatarUrl = uri; newState.avatarFile = null; - } else if (this.state.originalAvatarUrl !== this.state.avatarUrl) { + } else if (this.state.avatarRemovalPending) { await client.sendStateEvent(this.props.roomId, EventType.RoomAvatar, {}, ""); + newState.avatarRemovalPending = false; + newState.originalAvatarUrl = null; } if (this.state.originalTopic !== this.state.topic) { @@ -192,39 +199,11 @@ export default class RoomProfileSettings extends React.Component } }; - private onAvatarChanged = (e: React.ChangeEvent): void => { - if (!e.target.files || !e.target.files.length) { - this.setState({ - avatarUrl: this.state.originalAvatarUrl, - avatarFile: null, - profileFieldsTouched: { - ...this.state.profileFieldsTouched, - avatar: false, - }, - }); - return; - } - - const file = e.target.files[0]; - const reader = new FileReader(); - reader.onload = (ev) => { - this.setState({ - avatarUrl: String(ev.target?.result), - avatarFile: file, - profileFieldsTouched: { - ...this.state.profileFieldsTouched, - avatar: true, - }, - }); - }; - reader.readAsDataURL(file); - }; - public render(): React.ReactNode { let profileSettingsButtons; if (this.state.canSetName || this.state.canSetTopic || this.state.canSetAvatar) { profileSettingsButtons = ( -
    +
    ); } + const canRemove = this.state.profileFieldsTouched.avatar + ? Boolean(this.state.avatarFile) + : Boolean(this.state.originalAvatarUrl); + return ( -
    - -
    -
    + +
    +
    /> />
    {profileSettingsButtons} diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx index 108e0d9d93..5682cce846 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/src/components/views/rooms/EventTile.tsx @@ -1162,20 +1162,18 @@ export class UnwrappedEventTile extends React.Component const ircPadlock = useIRCLayout && !isBubbleMessage && this.renderE2EPadlock(); let msgOption: JSX.Element | undefined; - if (this.props.showReadReceipts) { - if (this.shouldShowSentReceipt || this.shouldShowSendingReceipt) { - msgOption = ; - } else { - msgOption = ( - - ); - } + if (this.shouldShowSentReceipt || this.shouldShowSendingReceipt) { + msgOption = ; + } else if (this.props.showReadReceipts) { + msgOption = ( + + ); } let replyChain: JSX.Element | undefined; diff --git a/src/components/views/rooms/EventTile/EventTileThreadToolbar.tsx b/src/components/views/rooms/EventTile/EventTileThreadToolbar.tsx index c817222dab..bc41f20b22 100644 --- a/src/components/views/rooms/EventTile/EventTileThreadToolbar.tsx +++ b/src/components/views/rooms/EventTile/EventTileThreadToolbar.tsx @@ -16,7 +16,7 @@ limitations under the License. import React from "react"; -import { RovingAccessibleTooltipButton } from "../../../../accessibility/RovingTabIndex"; +import { RovingAccessibleButton } from "../../../../accessibility/RovingTabIndex"; import Toolbar from "../../../../accessibility/Toolbar"; import { _t } from "../../../../languageHandler"; import { Icon as LinkIcon } from "../../../../../res/img/element-icons/link.svg"; @@ -32,22 +32,22 @@ export function EventTileThreadToolbar({ }): JSX.Element { return ( - - - + - + ); } diff --git a/src/components/views/rooms/ExtraTile.tsx b/src/components/views/rooms/ExtraTile.tsx index 3bb3a21525..3e734651c0 100644 --- a/src/components/views/rooms/ExtraTile.tsx +++ b/src/components/views/rooms/ExtraTile.tsx @@ -17,7 +17,7 @@ limitations under the License. import React from "react"; import classNames from "classnames"; -import { RovingAccessibleButton, RovingAccessibleTooltipButton } from "../../../accessibility/RovingTabIndex"; +import { RovingAccessibleButton } from "../../../accessibility/RovingTabIndex"; import NotificationBadge from "./NotificationBadge"; import { NotificationState } from "../../../stores/notifications/NotificationState"; import { ButtonEvent } from "../elements/AccessibleButton"; @@ -73,15 +73,15 @@ export default function ExtraTile({ ); if (isMinimized) nameContainer = null; - const Button = isMinimized ? RovingAccessibleTooltipButton : RovingAccessibleButton; return ( -
    - + ); } diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index 613701bf23..bb4b4c7245 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -25,6 +25,7 @@ import { THREAD_RELATION_TYPE, } from "matrix-js-sdk/src/matrix"; import { Optional } from "matrix-events-sdk"; +import { Tooltip } from "@vector-im/compound-web"; import { _t } from "../../../languageHandler"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; @@ -40,7 +41,6 @@ import { UPDATE_EVENT } from "../../../stores/AsyncStore"; import VoiceRecordComposerTile from "./VoiceRecordComposerTile"; import { VoiceRecordingStore } from "../../../stores/VoiceRecordingStore"; import { RecordingState } from "../../../audio/VoiceRecording"; -import Tooltip, { Alignment } from "../elements/Tooltip"; import ResizeNotifier from "../../../utils/ResizeNotifier"; import { E2EStatus } from "../../../utils/ShieldUtils"; import SendMessageComposer, { SendMessageComposer as SendMessageComposerClass } from "./SendMessageComposer"; @@ -110,7 +110,6 @@ interface IState { } export class MessageComposer extends React.Component { - private tooltipId = `mx_MessageComposer_${Math.random()}`; private dispatcherRef?: string; private messageComposerInput = createRef(); private voiceRecordingButton = createRef(); @@ -568,12 +567,9 @@ export class MessageComposer extends React.Component { } let recordingTooltip: JSX.Element | undefined; - if (this.state.recordingTimeLeftSeconds) { - const secondsLeft = Math.round(this.state.recordingTimeLeftSeconds); - recordingTooltip = ( - - ); - } + + const isTooltipOpen = Boolean(this.state.recordingTimeLeftSeconds); + const secondsLeft = this.state.recordingTimeLeftSeconds ? Math.round(this.state.recordingTimeLeftSeconds) : 0; const threadId = this.props.relation?.rel_type === THREAD_RELATION_TYPE.name ? this.props.relation.event_id : null; @@ -599,68 +595,66 @@ export class MessageComposer extends React.Component { }); return ( -
    - {recordingTooltip} -
    - -
    - {e2eIcon} - {composer} -
    - {controls} - {canSendMessages && ( - { - setUpVoiceBroadcastPreRecording( - this.props.room, - MatrixClientPeg.safeGet(), - SdkContextClass.instance.voiceBroadcastPlaybacksStore, - SdkContextClass.instance.voiceBroadcastRecordingsStore, - SdkContextClass.instance.voiceBroadcastPreRecordingStore, - ); - this.toggleButtonMenu(); - }} - /> - )} - {showSendButton && ( - - )} + +
    + {recordingTooltip} +
    + +
    + {e2eIcon} + {composer} +
    + {controls} + {canSendMessages && ( + { + setUpVoiceBroadcastPreRecording( + this.props.room, + MatrixClientPeg.safeGet(), + SdkContextClass.instance.voiceBroadcastPlaybacksStore, + SdkContextClass.instance.voiceBroadcastRecordingsStore, + SdkContextClass.instance.voiceBroadcastPreRecordingStore, + ); + this.toggleButtonMenu(); + }} + /> + )} + {showSendButton && ( + + )} +
    -
    + ); } } diff --git a/src/components/views/rooms/MessageComposerFormatBar.tsx b/src/components/views/rooms/MessageComposerFormatBar.tsx index 5893540528..04406158ae 100644 --- a/src/components/views/rooms/MessageComposerFormatBar.tsx +++ b/src/components/views/rooms/MessageComposerFormatBar.tsx @@ -18,7 +18,7 @@ import React, { createRef } from "react"; import classNames from "classnames"; import { _t } from "../../../languageHandler"; -import { RovingAccessibleTooltipButton } from "../../../accessibility/RovingTabIndex"; +import { RovingAccessibleButton } from "../../../accessibility/RovingTabIndex"; import Toolbar from "../../../accessibility/Toolbar"; export enum Formatting { @@ -131,7 +131,7 @@ class FormatButton extends React.PureComponent { // element="button" and type="button" are necessary for the buttons to work on WebKit, // otherwise the text is deselected before onClick can ever be called return ( - it.roomMember?.name ?? it.userId); const tooltipText = readReceiptTooltip(tooltipMembers, maxAvatars); - const [{ showTooltip, hideTooltip }, tooltip] = useTooltip({ - label: ( - <> -
    - {_t("timeline|read_receipt_title", { count: readReceipts.length })} -
    -
    {tooltipText}
    - - ), - alignment: Alignment.TopRight, - }); - // return early if there are no read receipts if (readReceipts.length === 0) { // We currently must include `mx_ReadReceiptGroup_container` in @@ -185,34 +172,35 @@ export function ReadReceiptGroup({ return (
    -
    - - {remText} - +
    + - {avatars} - - - {tooltip} - {contextMenu} -
    + {remText} + + {avatars} + +
    + {contextMenu} +
    +
    ); } @@ -222,60 +210,48 @@ interface ReadReceiptPersonProps extends IReadReceiptProps { onAfterClick?: () => void; } -function ReadReceiptPerson({ +// Export for testing +export function ReadReceiptPerson({ userId, roomMember, ts, isTwelveHour, onAfterClick, }: ReadReceiptPersonProps): JSX.Element { - const [{ showTooltip, hideTooltip }, tooltip] = useTooltip({ - alignment: Alignment.Top, - tooltipClassName: "mx_ReadReceiptGroup_person--tooltip", - label: ( - <> -
    {roomMember?.rawDisplayName ?? userId}
    -
    {userId}
    - - ), - }); - return ( - { - dis.dispatch({ - action: Action.ViewUser, - // XXX: We should be using a real member object and not assuming what the receiver wants. - // The ViewUser action leads to the RightPanelStore, and RightPanelStoreIPanelState defines the - // member property of IRightPanelCardState as `RoomMember | User`, so we’re fine for now, but we - // should definitely clean this up later - member: roomMember ?? ({ userId } as User), - push: false, - }); - onAfterClick?.(); - }} - onMouseOver={showTooltip} - onMouseLeave={hideTooltip} - onFocus={showTooltip} - onBlur={hideTooltip} - onWheel={hideTooltip} - > -
    @@ -531,10 +522,7 @@ exports[`RoomView for a local room in state NEW that is encrypted should match t
    diff --git a/test/components/structures/auth/ForgotPassword-test.tsx b/test/components/structures/auth/ForgotPassword-test.tsx index 6977fe9ec4..b43e6bea6a 100644 --- a/test/components/structures/auth/ForgotPassword-test.tsx +++ b/test/components/structures/auth/ForgotPassword-test.tsx @@ -302,10 +302,6 @@ describe("", () => { client_secret: expect.any(String), sid: testSid, }, - threepidCreds: { - client_secret: expect.any(String), - sid: testSid, - }, }, testPassword, false, @@ -334,10 +330,6 @@ describe("", () => { client_secret: expect.any(String), sid: testSid, }, - threepidCreds: { - client_secret: expect.any(String), - sid: testSid, - }, }, testPassword, false, @@ -430,10 +422,6 @@ describe("", () => { client_secret: expect.any(String), sid: testSid, }, - threepidCreds: { - client_secret: expect.any(String), - sid: testSid, - }, }, testPassword, true, diff --git a/test/components/views/auth/InteractiveAuthEntryComponents-test.tsx b/test/components/views/auth/InteractiveAuthEntryComponents-test.tsx new file mode 100644 index 0000000000..e6e3e1383e --- /dev/null +++ b/test/components/views/auth/InteractiveAuthEntryComponents-test.tsx @@ -0,0 +1,65 @@ +/* + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from "react"; +import { render, screen, waitFor, act } from "@testing-library/react"; +import { AuthType } from "matrix-js-sdk/src/interactive-auth"; +import userEvent from "@testing-library/user-event"; + +import { EmailIdentityAuthEntry } from "../../../../src/components/views/auth/InteractiveAuthEntryComponents"; +import { createTestClient } from "../../../test-utils"; + +describe("", () => { + const renderIdentityAuth = () => { + const matrixClient = createTestClient(); + + return render( + , + ); + }; + + test("should render", () => { + const { container } = renderIdentityAuth(); + expect(container).toMatchSnapshot(); + }); + + test("should clear the requested state when the button tooltip is hidden", async () => { + renderIdentityAuth(); + + // After a click on the resend button, the button should display the resent label + screen.getByRole("button", { name: "Resend" }).click(); + await waitFor(() => expect(screen.queryByRole("button", { name: "Resent!" })).toBeInTheDocument()); + expect(screen.queryByRole("button", { name: "Resend" })).toBeNull(); + + const resentButton = screen.getByRole("button", { name: "Resent!" }); + // Hover briefly the button and wait for the tooltip to be displayed + await userEvent.hover(resentButton); + await waitFor(() => expect(screen.getByRole("tooltip", { name: "Resent!" })).toBeInTheDocument()); + + // On unhover, it should display again the resend button + await act(() => userEvent.unhover(resentButton)); + await waitFor(() => expect(screen.queryByRole("button", { name: "Resend" })).toBeInTheDocument()); + }); +}); diff --git a/test/components/views/auth/__snapshots__/InteractiveAuthEntryComponents-test.tsx.snap b/test/components/views/auth/__snapshots__/InteractiveAuthEntryComponents-test.tsx.snap new file mode 100644 index 0000000000..65f86a35d2 --- /dev/null +++ b/test/components/views/auth/__snapshots__/InteractiveAuthEntryComponents-test.tsx.snap @@ -0,0 +1,34 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` should render 1`] = ` +
    +
    +

    + + To create your account, open the link in the email we just sent to + + alice@example.xyz + + . + +

    +

    + + Did not receive it? +

    + +

    +
    +
    +`; diff --git a/test/components/views/dialogs/RoomSettingsDialog-test.tsx b/test/components/views/dialogs/RoomSettingsDialog-test.tsx index 9a5f9b6745..a94e35dc71 100644 --- a/test/components/views/dialogs/RoomSettingsDialog-test.tsx +++ b/test/components/views/dialogs/RoomSettingsDialog-test.tsx @@ -31,6 +31,7 @@ import RoomSettingsDialog from "../../../../src/components/views/dialogs/RoomSet import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; import SettingsStore from "../../../../src/settings/SettingsStore"; import { UIFeature } from "../../../../src/settings/UIFeature"; +import DMRoomMap from "../../../../src/utils/DMRoomMap"; describe("", () => { const userId = "@alice:server.org"; @@ -62,6 +63,11 @@ describe("", () => { }); jest.spyOn(SettingsStore, "getValue").mockReset().mockReturnValue(false); + + const dmRoomMap = { + getUserIdForRoomId: jest.fn(), + } as unknown as DMRoomMap; + jest.spyOn(DMRoomMap, "shared").mockReturnValue(dmRoomMap); }); const getComponent = (onFinished = jest.fn(), propRoomId = roomId) => diff --git a/test/components/views/dialogs/SpotlightDialog-test.tsx b/test/components/views/dialogs/SpotlightDialog-test.tsx index 5bf1029bc9..f8fe3c00a7 100644 --- a/test/components/views/dialogs/SpotlightDialog-test.tsx +++ b/test/components/views/dialogs/SpotlightDialog-test.tsx @@ -82,8 +82,8 @@ function mockClient({ }: MockClientOptions = {}): MatrixClient { stubClient(); const cli = MatrixClientPeg.safeGet(); - MatrixClientPeg.getHomeserverName = jest.fn(() => homeserver); cli.getUserId = jest.fn(() => userId); + cli.getDomain = jest.fn(() => homeserver); cli.getHomeserverUrl = jest.fn(() => homeserver); cli.getThirdpartyProtocols = jest.fn(() => Promise.resolve(thirdPartyProtocols)); cli.publicRooms = jest.fn((options) => { diff --git a/test/components/views/dialogs/security/CreateSecretStorageDialog-test.tsx b/test/components/views/dialogs/security/CreateSecretStorageDialog-test.tsx index 1412074ed9..06b13f1df7 100644 --- a/test/components/views/dialogs/security/CreateSecretStorageDialog-test.tsx +++ b/test/components/views/dialogs/security/CreateSecretStorageDialog-test.tsx @@ -18,7 +18,7 @@ import { render, RenderResult, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import React from "react"; import { mocked, MockedObject } from "jest-mock"; -import { CryptoApi, MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix"; +import { Crypto, MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix"; import { defer, IDeferred, sleep } from "matrix-js-sdk/src/utils"; import { BackupTrustInfo, KeyBackupInfo } from "matrix-js-sdk/src/crypto-api"; @@ -35,7 +35,7 @@ import RestoreKeyBackupDialog from "../../../../../src/components/views/dialogs/ describe("CreateSecretStorageDialog", () => { let mockClient: MockedObject; - let mockCrypto: MockedObject; + let mockCrypto: MockedObject; beforeEach(() => { mockClient = getMockClientWithEventEmitter({ diff --git a/test/components/views/dialogs/security/ExportE2eKeysDialog-test.tsx b/test/components/views/dialogs/security/ExportE2eKeysDialog-test.tsx index 0436fb2bf2..c4a5ef1ee1 100644 --- a/test/components/views/dialogs/security/ExportE2eKeysDialog-test.tsx +++ b/test/components/views/dialogs/security/ExportE2eKeysDialog-test.tsx @@ -17,7 +17,7 @@ limitations under the License. import React from "react"; import { screen, fireEvent, render, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { CryptoApi, IMegolmSessionData } from "matrix-js-sdk/src/matrix"; +import { Crypto, IMegolmSessionData } from "matrix-js-sdk/src/matrix"; import * as MegolmExportEncryption from "../../../../../src/utils/MegolmExportEncryption"; import ExportE2eKeysDialog from "../../../../../src/async-components/views/dialogs/security/ExportE2eKeysDialog"; @@ -70,7 +70,7 @@ describe("ExportE2eKeysDialog", () => { cli.getCrypto = () => { return { exportRoomKeysAsJson, - } as unknown as CryptoApi; + } as unknown as Crypto.CryptoApi; }; // Mock the result of encrypting the sessions. If we don't do this, the diff --git a/test/components/views/dialogs/security/ImportE2eKeysDialog-test.tsx b/test/components/views/dialogs/security/ImportE2eKeysDialog-test.tsx index af7b85b0c2..f119966030 100644 --- a/test/components/views/dialogs/security/ImportE2eKeysDialog-test.tsx +++ b/test/components/views/dialogs/security/ImportE2eKeysDialog-test.tsx @@ -17,7 +17,7 @@ limitations under the License. import React from "react"; import { fireEvent, render, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; -import { CryptoApi } from "matrix-js-sdk/src/matrix"; +import { Crypto } from "matrix-js-sdk/src/matrix"; import ImportE2eKeysDialog from "../../../../../src/async-components/views/dialogs/security/ImportE2eKeysDialog"; import * as MegolmExportEncryption from "../../../../../src/utils/MegolmExportEncryption"; @@ -75,7 +75,7 @@ describe("ImportE2eKeysDialog", () => { cli.getCrypto = () => { return { importRoomKeysAsJson, - } as unknown as CryptoApi; + } as unknown as Crypto.CryptoApi; }; // Mock the result of decrypting the sessions, to avoid needing to diff --git a/test/components/views/elements/Field-test.tsx b/test/components/views/elements/Field-test.tsx index ce826282ac..7cb3074927 100644 --- a/test/components/views/elements/Field-test.tsx +++ b/test/components/views/elements/Field-test.tsx @@ -69,6 +69,10 @@ describe("Field", () => { // Expect 'alert' role expect(screen.queryByRole("alert")).toBeInTheDocument(); + + // Close the feedback is Escape is pressed + fireEvent.keyDown(screen.getByRole("textbox"), { key: "Escape" }); + expect(screen.queryByRole("alert")).toBeNull(); }); it("Should mark the feedback as status if valid", async () => { @@ -87,6 +91,10 @@ describe("Field", () => { // Expect 'status' role expect(screen.queryByRole("status")).toBeInTheDocument(); + + // Close the feedback is Escape is pressed + fireEvent.keyDown(screen.getByRole("textbox"), { key: "Escape" }); + expect(screen.queryByRole("status")).toBeNull(); }); it("Should mark the feedback as tooltip if custom tooltip set", async () => { @@ -106,6 +114,10 @@ describe("Field", () => { // Expect 'tooltip' role expect(screen.queryByRole("tooltip")).toBeInTheDocument(); + + // Close the feedback is Escape is pressed + fireEvent.keyDown(screen.getByRole("textbox"), { key: "Escape" }); + expect(screen.queryByRole("tooltip")).toBeNull(); }); }); }); diff --git a/test/components/views/elements/RoomTopic-test.tsx b/test/components/views/elements/RoomTopic-test.tsx index dc05779794..8e62bd641f 100644 --- a/test/components/views/elements/RoomTopic-test.tsx +++ b/test/components/views/elements/RoomTopic-test.tsx @@ -16,7 +16,8 @@ limitations under the License. import React from "react"; import { Room } from "matrix-js-sdk/src/matrix"; -import { fireEvent, render, screen } from "@testing-library/react"; +import { fireEvent, render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; import { mkEvent, stubClient } from "../../../test-utils"; import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; @@ -33,9 +34,12 @@ describe("", () => { window.location.href = originalHref; }); - function runClickTest(topic: string, clickText: string) { + /** + * Create a room with the given topic + * @param topic + */ + function createRoom(topic: string) { stubClient(); - const room = new Room("!pMBteVpcoJRdCJxDmn:matrix.org", MatrixClientPeg.safeGet(), "@alice:example.org"); const topicEvent = mkEvent({ type: "m.room.topic", @@ -45,11 +49,27 @@ describe("", () => { ts: 123, event: true, }); - room.addLiveEvents([topicEvent]); + return room; + } + + /** + * Create a room and render it + * @param topic + */ + const renderRoom = (topic: string) => { + const room = createRoom(topic); render(); + }; + /** + * Create a room and click on the given text + * @param topic + * @param clickText + */ + function runClickTest(topic: string, clickText: string) { + renderRoom(topic); fireEvent.click(screen.getByText(clickText)); } @@ -78,4 +98,18 @@ describe("", () => { expect(window.location.href).toEqual(expectedHref); expect(dis.fire).toHaveBeenCalledWith(Action.ShowRoomTopic); }); + + it("should open the tooltip when hovering a text", async () => { + const topic = "room topic"; + renderRoom(topic); + await userEvent.hover(screen.getByText(topic)); + await waitFor(() => expect(screen.getByRole("tooltip", { name: "Click to read topic" })).toBeInTheDocument()); + }); + + it("should not open the tooltip when hovering a link", async () => { + const topic = "https://matrix.org"; + renderRoom(topic); + await userEvent.hover(screen.getByText(topic)); + await waitFor(() => expect(screen.queryByRole("tooltip", { name: "Click to read topic" })).toBeNull()); + }); }); diff --git a/test/components/views/elements/TooltipTarget-test.tsx b/test/components/views/elements/TooltipTarget-test.tsx deleted file mode 100644 index 0823229a90..0000000000 --- a/test/components/views/elements/TooltipTarget-test.tsx +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2022 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; -import { fireEvent, render } from "@testing-library/react"; - -import { Alignment } from "../../../../src/components/views/elements/Tooltip"; -import TooltipTarget from "../../../../src/components/views/elements/TooltipTarget"; - -describe("", () => { - const defaultProps = { - "tooltipTargetClassName": "test tooltipTargetClassName", - "className": "test className", - "tooltipClassName": "test tooltipClassName", - "label": "test label", - "alignment": Alignment.Left, - "id": "test id", - "data-testid": "test", - }; - - const getComponent = (props = {}) => { - const wrapper = render( - // wrap in element so renderIntoDocument can render functional component - - - child - - , - ); - return wrapper.getByTestId("test"); - }; - - const getVisibleTooltip = () => document.querySelector(".mx_Tooltip.mx_Tooltip_visible"); - - it("renders container", () => { - const component = getComponent(); - expect(component).toMatchSnapshot(); - expect(getVisibleTooltip()).toBeFalsy(); - }); - - const alignmentKeys = Object.keys(Alignment).filter((o: any) => isNaN(o)); - it.each(alignmentKeys)("displays %s aligned tooltip on mouseover", async (alignment: any) => { - const wrapper = getComponent({ alignment: Alignment[alignment] })!; - fireEvent.mouseOver(wrapper); - expect(getVisibleTooltip()).toMatchSnapshot(); - }); - - it("hides tooltip on mouseleave", () => { - const wrapper = getComponent()!; - fireEvent.mouseOver(wrapper); - expect(getVisibleTooltip()).toBeTruthy(); - fireEvent.mouseLeave(wrapper); - expect(getVisibleTooltip()).toBeFalsy(); - }); - - it("displays tooltip on focus", () => { - const wrapper = getComponent()!; - fireEvent.focus(wrapper); - expect(getVisibleTooltip()).toBeTruthy(); - }); - - it("hides tooltip on blur", async () => { - const wrapper = getComponent()!; - fireEvent.focus(wrapper); - expect(getVisibleTooltip()).toBeTruthy(); - fireEvent.blur(wrapper); - expect(getVisibleTooltip()).toBeFalsy(); - }); -}); diff --git a/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap b/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap index 4b84fa46c6..b344e3cd58 100644 --- a/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap @@ -116,7 +116,6 @@ exports[`AppTile for a pinned widget should render 1`] = ` Using this widget may share data
    displays Bottom aligned tooltip on mouseover 1`] = ` -