From 95edfdd0669d3671df920719cbcca75898a64371 Mon Sep 17 00:00:00 2001 From: Thomas Zemp Date: Tue, 27 Aug 2024 09:38:27 +0200 Subject: [PATCH 01/11] chore: bump dhis2 dependencies [DHIS2-17941] --- .github/workflows/dhis2-verify-app.yml | 10 +- package.json | 7 +- src/app/layout/Breadcrumb.module.css | 3 +- .../IconPickerModal.module.css | 3 +- .../SearchableSingleSelect.module.css | 2 +- src/components/loading/Loader.module.css | 1 - .../download/DownloadDialog.module.css | 2 - .../listActions/DeleteAction.module.css | 2 +- .../sectionList/toolbar/Toolbar.module.css | 2 - .../overview/group/OverviewGroup.module.css | 2 - src/testUtils/TestComponentWithRouter.tsx | 3 + yarn.lock | 7203 +++++++++-------- 12 files changed, 3929 insertions(+), 3311 deletions(-) diff --git a/.github/workflows/dhis2-verify-app.yml b/.github/workflows/dhis2-verify-app.yml index 495641db..34f9b047 100644 --- a/.github/workflows/dhis2-verify-app.yml +++ b/.github/workflows/dhis2-verify-app.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 - uses: c-hive/gha-yarn-cache@v1 - run: yarn install --frozen-lockfile @@ -44,7 +44,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 - uses: c-hive/gha-yarn-cache@v1 - run: yarn install --frozen-lockfile @@ -63,7 +63,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 - uses: c-hive/gha-yarn-cache@v1 - run: yarn install --frozen-lockfile @@ -86,7 +86,7 @@ jobs: uses: actions/checkout@v2 - uses: actions/setup-node@v1 with: - node-version: 16 + node-version: 20 - name: End-to-End tests uses: cypress-io/github-action@v5 @@ -117,7 +117,7 @@ jobs: - uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 - uses: actions/download-artifact@v2 with: diff --git a/package.json b/package.json index 99caa77b..3cc579aa 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "postinstall": "yarn d2-style install" }, "devDependencies": { - "@dhis2/cli-app-scripts": "^10.3.9", + "@dhis2/cli-app-scripts": "^11.7.0", "@dhis2/cli-style": "^10.5.1", "@dhis2/cypress-commands": "^10.0.3", "@dhis2/cypress-plugins": "^10.0.3", @@ -32,12 +32,13 @@ "@typescript-eslint/eslint-plugin": "^5.55.0", "@typescript-eslint/parser": "^5.55.0", "cypress": "^12.14.0", + "eslint": "^8", "typescript": "^5.0.4", "whatwg-fetch": "^3.6.17" }, "dependencies": { "@dhis2/app-runtime": "^3.9.3", - "@dhis2/ui": "^9.2.0", + "@dhis2/ui": "^9.11.3", "@tanstack/react-table": "^8.16.0", "@types/lodash": "^4.14.198", "lodash": "^4.17.21", @@ -51,6 +52,6 @@ "zustand": "^4.4.0" }, "resolutions": { - "@dhis2/ui": "^9.2.0" + "eslint": "^8" } } diff --git a/src/app/layout/Breadcrumb.module.css b/src/app/layout/Breadcrumb.module.css index 1d97002b..0dc3757f 100644 --- a/src/app/layout/Breadcrumb.module.css +++ b/src/app/layout/Breadcrumb.module.css @@ -1,4 +1,3 @@ - .breadcrumbWrapper { margin-bottom: 8px; } @@ -11,7 +10,7 @@ } span.breadcrumbItem { - cursor: pointer + cursor: pointer; } .breadcrumbItem:hover { diff --git a/src/components/ColorAndIconPicker/IconPickerModal.module.css b/src/components/ColorAndIconPicker/IconPickerModal.module.css index 785346f4..315f3b18 100644 --- a/src/components/ColorAndIconPicker/IconPickerModal.module.css +++ b/src/components/ColorAndIconPicker/IconPickerModal.module.css @@ -25,7 +25,8 @@ cursor: pointer; } -.active, .iconContainer:hover { +.active, +.iconContainer:hover { outline: var(--colors-blue300) solid 3px; } diff --git a/src/components/SearchableSingleSelect/SearchableSingleSelect.module.css b/src/components/SearchableSingleSelect/SearchableSingleSelect.module.css index 80f24c0c..d78ac769 100644 --- a/src/components/SearchableSingleSelect/SearchableSingleSelect.module.css +++ b/src/components/SearchableSingleSelect/SearchableSingleSelect.module.css @@ -43,7 +43,7 @@ position: sticky; top: 0; padding: var(--spacers-dp16); - box-shadow: 0 0 4px rgba(0,0,0,0.4); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.4); background: var(--colors-white); } diff --git a/src/components/loading/Loader.module.css b/src/components/loading/Loader.module.css index 8eca75f2..c3531c39 100644 --- a/src/components/loading/Loader.module.css +++ b/src/components/loading/Loader.module.css @@ -1,4 +1,3 @@ - .loadingSpinner { margin: var(--spacers-dp8) auto; } diff --git a/src/components/sectionList/download/DownloadDialog.module.css b/src/components/sectionList/download/DownloadDialog.module.css index b0bbfa37..056391f2 100644 --- a/src/components/sectionList/download/DownloadDialog.module.css +++ b/src/components/sectionList/download/DownloadDialog.module.css @@ -1,4 +1,3 @@ - .downloadForm { display: flex; flex-direction: column; @@ -9,4 +8,3 @@ display: flex; gap: var(--spacers-dp16); } - diff --git a/src/components/sectionList/listActions/DeleteAction.module.css b/src/components/sectionList/listActions/DeleteAction.module.css index c61f208a..1ed5f065 100644 --- a/src/components/sectionList/listActions/DeleteAction.module.css +++ b/src/components/sectionList/listActions/DeleteAction.module.css @@ -3,6 +3,6 @@ margin-right: 8px; } -.deleteButtonLoadingIcon :global([role="progressbar"]) { +.deleteButtonLoadingIcon :global([role='progressbar']) { border-color: rgba(110, 122, 138, 0.15) rgba(110, 122, 138, 0.15) white; } diff --git a/src/components/sectionList/toolbar/Toolbar.module.css b/src/components/sectionList/toolbar/Toolbar.module.css index ec82b184..33d14b0d 100644 --- a/src/components/sectionList/toolbar/Toolbar.module.css +++ b/src/components/sectionList/toolbar/Toolbar.module.css @@ -1,4 +1,3 @@ - .listHeaderNormal { background-color: #fff; width: 100%; @@ -14,7 +13,6 @@ line-height: var(--spacers-dp16); } - .listHeaderBulk { background-color: var(--colors-green050); width: 100%; diff --git a/src/pages/overview/group/OverviewGroup.module.css b/src/pages/overview/group/OverviewGroup.module.css index 7ea1f7ff..a5a96e55 100644 --- a/src/pages/overview/group/OverviewGroup.module.css +++ b/src/pages/overview/group/OverviewGroup.module.css @@ -1,5 +1,3 @@ - - .header { font-size: 28px; color: var(--colors-grey900); diff --git a/src/testUtils/TestComponentWithRouter.tsx b/src/testUtils/TestComponentWithRouter.tsx index 1a32c7f5..1d129b87 100644 --- a/src/testUtils/TestComponentWithRouter.tsx +++ b/src/testUtils/TestComponentWithRouter.tsx @@ -29,6 +29,9 @@ export const ComponentWithProvider = ({ baseUrl: 'http://dhis2-imaginary-test-server', apiVersion: 41, }} + plugin={false} + parentAlertsAdd={() => undefined} + showAlertsInPlugin={true} > = 1.43.0 < 2": +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -9766,11 +10046,12 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.4.5, mini-css-extract-plugin@^2.5.3: - version "2.7.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz#e049d3ea7d3e4e773aad585c6cb329ce0c7b72d7" - integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== + version "2.9.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz#4d184f12ce90582e983ccef0f6f9db637b4be758" + integrity sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ== dependencies: schema-utils "^4.0.0" + tapable "^2.2.1" minimalistic-assert@^1.0.0: version "1.0.1" @@ -9791,6 +10072,13 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimatch@~3.0.2: version "3.0.8" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" @@ -9820,6 +10108,11 @@ minipass@^2.6.0, minipass@^2.9.0: safe-buffer "^5.1.2" yallist "^3.0.0" +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -9843,9 +10136,9 @@ mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: minimist "^1.2.6" moment@^2.24.0, moment@^2.29.1: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== ms@2.0.0: version "2.0.0" @@ -9875,6 +10168,15 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nano-time@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" @@ -9882,10 +10184,10 @@ nano-time@1.0.0: dependencies: big-integer "^1.6.16" -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nanomatch@^1.2.9: version "1.2.13" @@ -9919,7 +10221,7 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -9964,10 +10266,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.8: - version "2.0.9" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.9.tgz#fe66405285382b0c4ac6bcfbfbe7e8a510650b4d" - integrity sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== normalize-package-data@^2.5.0: version "2.5.0" @@ -10052,16 +10354,16 @@ nth-check@^2.0.1: boolbase "^1.0.0" nwsapi@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -10080,18 +10382,18 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" @@ -10105,51 +10407,56 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.4, object.assign@^4.1.3, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.0.4, object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== +object.fromentries@^2.0.7, object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" object.getownpropertydescriptors@^2.1.0: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== - dependencies: - array.prototype.reduce "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + version "2.1.8" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923" + integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A== + dependencies: + array.prototype.reduce "^1.0.6" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + gopd "^1.0.1" + safe-array-concat "^1.1.2" -object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" object.pick@^1.3.0: version "1.3.0" @@ -10158,14 +10465,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== +object.values@^1.1.0, object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" oblivious-set@1.0.0: version "1.0.0" @@ -10212,9 +10519,9 @@ open@^7.3.1: is-wsl "^2.1.1" open@^8.0.9, open@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -10232,17 +10539,17 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" + word-wrap "^1.2.5" ordered-read-streams@^1.0.0: version "1.0.1" @@ -10326,6 +10633,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -10373,16 +10685,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5@6.0.1: +parse5@6.0.1, parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -10441,6 +10748,14 @@ 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.11.1: + 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-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -10471,10 +10786,10 @@ picocolors@^0.2.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== -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== +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== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -10496,10 +10811,10 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.4, pirates@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^3.0.0: version "3.0.0" @@ -10527,6 +10842,22 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +post-robot@^10.0.46: + version "10.0.46" + resolved "https://registry.yarnpkg.com/post-robot/-/post-robot-10.0.46.tgz#39cea5b51033729390fc7c90be3285cd285f0377" + integrity sha512-EgVJiuvI4iRWDZvzObWes0X/n8olWBEJWxlSw79zmhpgkigX8UsVL4VOBhVtoJKwf0Y9qP9g2zOONw1rv80QbA== + dependencies: + belter "^1.0.41" + cross-domain-safe-weakmap "^1.0.1" + cross-domain-utils "^2.0.0" + universal-serialize "^1.0.4" + zalgo-promise "^1.0.3" + postcss-attribute-case-insensitive@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" @@ -10575,12 +10906,12 @@ postcss-color-rebeccapurple@^7.1.1: dependencies: postcss-value-parser "^4.2.0" -postcss-colormin@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" - integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" colord "^2.9.1" postcss-value-parser "^4.2.0" @@ -10692,10 +11023,10 @@ postcss-image-set-function@^4.0.7: dependencies: postcss-value-parser "^4.2.0" -postcss-import@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" @@ -10706,10 +11037,10 @@ postcss-initial@^4.0.1: resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== -postcss-js@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" - integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" @@ -10721,13 +11052,13 @@ postcss-lab-function@^4.2.1: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" + lilconfig "^3.0.0" + yaml "^2.3.4" postcss-loader@^6.2.1: version "6.2.1" @@ -10739,13 +11070,13 @@ postcss-loader@^6.2.1: semver "^7.3.5" postcss-loader@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.0.2.tgz#b53ff44a26fba3688eee92a048c7f2d4802e23bb" - integrity sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg== + version "7.3.4" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" + integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.8" + cosmiconfig "^8.3.5" + jiti "^1.20.0" + semver "^7.5.4" postcss-logical@^5.0.4: version "5.0.4" @@ -10765,10 +11096,10 @@ postcss-merge-longhand@^5.1.7: postcss-value-parser "^4.2.0" stylehacks "^5.1.1" -postcss-merge-rules@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz#8f97679e67cc8d08677a6519afca41edf2220894" - integrity sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA== +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== dependencies: browserslist "^4.21.4" caniuse-api "^3.0.0" @@ -10807,24 +11138,24 @@ postcss-minify-selectors@^5.2.1: dependencies: postcss-selector-parser "^6.0.5" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz#f1b9bd757a8edf4d8556e8d0f4f894260e3df78f" + integrity sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== +postcss-modules-scope@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz#a43d28289a169ce2c15c00c4e64c0858e43457d5" + integrity sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ== dependencies: postcss-selector-parser "^6.0.4" @@ -10835,12 +11166,12 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nested@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" - integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== +postcss-nested@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: - postcss-selector-parser "^6.0.10" + postcss-selector-parser "^6.1.1" postcss-nesting@^10.2.0: version "10.2.0" @@ -11016,10 +11347,10 @@ postcss-pseudo-class-any-link@^7.1.6: dependencies: postcss-selector-parser "^6.0.10" -postcss-reduce-initial@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz#c18b7dfb88aee24b1f8e4936541c29adbd35224e" - integrity sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w== +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== dependencies: browserslist "^4.21.4" caniuse-api "^3.0.0" @@ -11036,6 +11367,16 @@ postcss-replace-overflow-wrap@^4.0.0: resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== +postcss-resolve-nested-selector@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz#3d84dec809f34de020372c41b039956966896686" + integrity sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw== + +postcss-safe-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz#6273d4e5149e286db5a45bc6cf6eafcad464014a" + integrity sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg== + postcss-selector-not@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" @@ -11043,14 +11384,19 @@ postcss-selector-not@^6.0.1: dependencies: postcss-selector-parser "^6.0.10" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-styled-jsx@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-styled-jsx/-/postcss-styled-jsx-1.0.1.tgz#07c17ca3bc574a06627103bb5dd475006c2d0d9e" + integrity sha512-508Vg2A0pHQstRxz8eoNYiT+RiCZdgE4EqN0x8oiPIZ/a6pp5q2NYefL39RRG8ORlxDehLHU3u/EOpux0kuATQ== + postcss-svgo@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" @@ -11059,6 +11405,11 @@ postcss-svgo@^5.1.0: postcss-value-parser "^4.2.0" svgo "^2.7.0" +postcss-syntax@^0.36.2: + version "0.36.2" + resolved "https://registry.yarnpkg.com/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" + integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== + postcss-unique-selectors@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" @@ -11079,14 +11430,14 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.18, postcss@^8.4.19, postcss@^8.4.4: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@^8.3.5, postcss@^8.4.23, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.4, postcss@^8.4.41: + version "8.4.41" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" + integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" + nanoid "^3.3.7" + picocolors "^1.0.1" + source-map-js "^1.2.0" prelude-ls@^1.2.1: version "1.2.1" @@ -11104,9 +11455,9 @@ prepend-http@^2.0.0: integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== prettier@^2.4.1: - version "2.8.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" - integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1, pretty-bytes@^5.6.0: version "5.6.0" @@ -11154,11 +11505,6 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise@^8.1.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -11232,9 +11578,9 @@ pumpify@^1.3.5: pump "^2.0.0" punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== q@^1.1.2, q@^1.5.1: version "1.5.1" @@ -11275,11 +11621,6 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -11299,10 +11640,10 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" http-errors "2.0.0" @@ -11404,9 +11745,9 @@ react-error-overlay@^6.0.11: integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== react-fast-compare@^3.0.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" - integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" + integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== react-final-form@^6.5.3, react-final-form@^6.5.9: version "6.5.9" @@ -11426,9 +11767,9 @@ react-is@^17.0.1: integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-popper@^2.2.5: version "2.3.0" @@ -11564,19 +11905,19 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.2.0, readable-stream@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.2.0, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -11618,10 +11959,23 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -11630,15 +11984,20 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.9: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -11651,32 +12010,28 @@ regex-not@^1.0.0, regex-not@^1.0.2: safe-regex "^1.1.0" regex-parser@^2.2.11: - version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.0.tgz#4bb61461b1a19b8b913f3960364bb57887f920ee" + integrity sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg== -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.1.0, regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" @@ -11695,11 +12050,6 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -11712,10 +12062,10 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== -remove-accents@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" - integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== +remove-accents@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.5.0.tgz#77991f37ba212afba162e375b627631315bed687" + integrity sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A== remove-bom-buffer@^3.0.0: version "3.0.0" @@ -11875,21 +12225,21 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -11985,6 +12335,16 @@ rxjs@^7.5.1: dependencies: tslib "^2.1.0" +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -11995,13 +12355,13 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" safe-regex@^1.1.0: @@ -12067,24 +12427,24 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== +schema-utils@^4.0.0, schema-utils@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" - ajv "^8.8.0" + ajv "^8.9.0" ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" + ajv-keywords "^5.1.0" select-hose@^2.0.0: version "2.0.0" @@ -12092,10 +12452,11 @@ select-hose@^2.0.0: integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" semver-diff@^2.0.0: @@ -12106,9 +12467,9 @@ semver-diff@^2.0.0: semver "^5.0.3" "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@7.3.5: version "7.3.5" @@ -12117,17 +12478,15 @@ semver@7.3.5: dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== send@0.18.0: version "0.18.0" @@ -12155,10 +12514,10 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -12195,6 +12554,28 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -12246,25 +12627,31 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== +shell-quote@^1.7.3, shell-quote@^1.8.1: + version "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: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -12337,12 +12724,10 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" -sortobject@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sortobject/-/sortobject-1.3.0.tgz#bc8ce57014c567bdbf78e89ae6c484e64d51e9dc" - integrity sha512-rr0RrgE3ZoWaREnHiidnywzXLaeqmxDKfB4Htdbzu4WBzsVeZEJrhz7AR4ZF+gzHgbog/lQoNXxCWHaXeLc1Dg== - dependencies: - editions "^2.2.0" +sortobject@^4.0.0: + version "4.17.0" + resolved "https://registry.yarnpkg.com/sortobject/-/sortobject-4.17.0.tgz#cd92134a9084d2508ef11952a86badb551db950c" + integrity sha512-gzx7USv55AFRQ7UCWJHHauwD/ptUHF9MLXCGO3f5M9zauDPZ/4a9H6/VVbOXefdpEoI1unwB/bArHIVMbWBHmA== source-list-map@^2.0.0, source-list-map@^2.0.1: version "2.0.1" @@ -12367,10 +12752,10 @@ source-map-explorer@^2.1.0: temp "^0.9.4" yargs "^16.2.0" -source-map-js@^1.0.1, source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.0.1, source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-loader@^3.0.0: version "3.0.2" @@ -12438,17 +12823,17 @@ sourcemap-codec@^1.4.8: integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -12459,9 +12844,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== spdy-transport@^3.0.0: version "3.0.0" @@ -12505,7 +12890,7 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.14.1, sshpk@^1.7.0: +sshpk@^1.14.1: version "1.17.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== @@ -12520,6 +12905,21 @@ sshpk@^1.14.1, sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +sshpk@^1.7.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -12537,6 +12937,13 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -12563,9 +12970,9 @@ stop-iteration-iterator@^1.0.0: internal-slot "^1.0.4" stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== string-hash@1.1.3: version "1.1.3" @@ -12593,6 +13000,15 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -12610,46 +13026,76 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== +string.prototype.includes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" + integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.1.3" + es-abstract "^1.17.5" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.1.1: version "1.3.0" @@ -12674,6 +13120,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" @@ -12688,17 +13141,10 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -12734,7 +13180,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -12745,9 +13191,9 @@ strip-json-comments@~2.0.1: integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== style-loader@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + version "3.3.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== styled-jsx@^4.0.1: version "4.0.1" @@ -12771,6 +13217,56 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylelint-use-logical@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/stylelint-use-logical/-/stylelint-use-logical-2.1.2.tgz#60296915cc27aa1292fbff9a29391c9a1d877563" + integrity sha512-4ffvPNk/swH4KS3izExWuzQOuzLmi0gb0uOhvxWJ20vDA5W5xKCjcHHtLoAj1kKvTIX6eGIN5xGtaVin9PD0wg== + +stylelint@^16.3.1: + version "16.8.2" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.8.2.tgz#7fda18b919a36e206e897417d4720baceb3af122" + integrity sha512-fInKATippQhcSm7AB+T32GpI+626yohrg33GkFT/5jzliUw5qhlwZq2UQQwgl3HsHrf09oeARi0ZwgY/UWEv9A== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.0" + "@csstools/css-tokenizer" "^3.0.0" + "@csstools/media-query-list-parser" "^3.0.0" + "@csstools/selector-specificity" "^4.0.0" + "@dual-bundle/import-meta-resolve" "^4.1.0" + balanced-match "^2.0.0" + colord "^2.9.3" + cosmiconfig "^9.0.0" + css-functions-list "^3.2.2" + css-tree "^2.3.1" + debug "^4.3.6" + fast-glob "^3.3.2" + fastest-levenshtein "^1.0.16" + file-entry-cache "^9.0.0" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.3.1" + ignore "^5.3.2" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.34.0" + mathml-tag-names "^2.1.3" + meow "^13.2.0" + micromatch "^4.0.7" + normalize-path "^3.0.0" + picocolors "^1.0.1" + postcss "^8.4.41" + postcss-resolve-nested-selector "^0.1.6" + postcss-safe-parser "^7.0.0" + postcss-selector-parser "^6.1.2" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + string-width "^4.2.3" + strip-ansi "^7.1.0" + supports-hyperlinks "^3.0.0" + svg-tags "^1.0.0" + table "^6.8.2" + write-file-atomic "^5.0.1" + stylis-rule-sheet@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" @@ -12781,6 +13277,19 @@ stylis@3.5.4: resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -12810,6 +13319,14 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-hyperlinks@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz#b56150ff0173baacc15f21956450b61f2b18d3ac" + integrity sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -12820,6 +13337,11 @@ svg-parser@^2.0.2: resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + svgo@^1.2.2: version "1.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" @@ -12857,10 +13379,10 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.9: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== +table@^6.8.2: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -12869,40 +13391,39 @@ table@^6.0.9: strip-ansi "^6.0.1" tailwindcss@^3.0.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250" - integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== + version "3.4.10" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.10.tgz#70442d9aeb78758d1f911af29af8255ecdb8ffef" + integrity sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w== dependencies: + "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" chokidar "^3.5.3" - color-name "^1.1.4" - detective "^5.2.1" didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.2.12" + fast-glob "^3.3.0" glob-parent "^6.0.2" is-glob "^4.0.3" - lilconfig "^2.0.6" + jiti "^1.21.0" + lilconfig "^2.1.0" micromatch "^4.0.5" normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.18" - postcss-import "^14.1.0" - postcss-js "^4.0.0" - postcss-load-config "^3.1.4" - postcss-nested "6.0.0" - postcss-selector-parser "^6.0.10" - postcss-value-parser "^4.2.0" - quick-lru "^5.1.1" - resolve "^1.22.1" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" tapable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -12976,24 +13497,24 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.1: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== +terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.20" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" -terser@^5.0.0, terser@^5.10.0, terser@^5.14.1: - version "5.16.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.2.tgz#8f495819439e8b5c150e7530fc434a6e70ea18b2" - integrity sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg== +terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: + version "5.31.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1" + integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -13016,6 +13537,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + throat@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" @@ -13027,14 +13562,13 @@ throttleit@^1.0.0: integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== through2-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" - integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.1.0.tgz#4a1b45d2b76b3ac93ec137951e372c268efc1a4e" + integrity sha512-VhZsTsfrIJjyUi6GeecnwcOJlmoqgIdGFDjqnV5ape+F1DN8GejfPO66XyIhoinxmxGImiUTrq9RwpTN5yszGA== dependencies: - through2 "~2.0.0" - xtend "~4.0.0" + through2 "^4.0.2" -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: +through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -13042,15 +13576,7 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== - dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" - -through2@^4.0.0: +through2@^4.0.0, through2@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== @@ -13154,9 +13680,9 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -13195,13 +13721,18 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -13210,10 +13741,10 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.1: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== +tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== tsutils@^3.21.0: version "3.21.0" @@ -13296,14 +13827,49 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -13333,9 +13899,9 @@ typescript@^5.0.4: integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + version "3.19.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.2.tgz#319ae26a5fbd18d03c7dc02496cfa1d6f1cd4307" + integrity sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -13352,6 +13918,16 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -13407,6 +13983,11 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +universal-serialize@^1.0.4: + version "1.0.10" + resolved "https://registry.yarnpkg.com/universal-serialize/-/universal-serialize-1.0.10.tgz#3279bb30f47290ea479f45135620f98fa9d3f3a6" + integrity sha512-FdouA4xSFa0fudk1+z5vLWtxZCoC0Q9lKYV3uUdFl7DttNfolmiw2ASr5ddY+/Yz6Isr68u3IqC9XMSwMP+Pow== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -13418,9 +13999,9 @@ universalify@^0.2.0: integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unload@2.2.0: version "2.2.0" @@ -13458,13 +14039,13 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" update-notifier@^3.0.0: version "3.0.1" @@ -13568,11 +14149,6 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - v8-to-istanbul@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" @@ -13685,10 +14261,10 @@ warning@^4.0.2: dependencies: loose-envify "^1.0.0" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -13715,10 +14291,10 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== +webpack-dev-middleware@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" + integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== dependencies: colorette "^2.0.10" memfs "^3.4.3" @@ -13727,9 +14303,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.6.0, webpack-dev-server@^4.7.4: - version "4.11.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" - integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + version "4.15.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" + integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -13737,7 +14313,7 @@ webpack-dev-server@^4.6.0, webpack-dev-server@^4.7.4: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -13750,6 +14326,7 @@ webpack-dev-server@^4.6.0, webpack-dev-server@^4.7.4: html-entities "^2.3.2" http-proxy-middleware "^2.0.3" ipaddr.js "^2.0.1" + launch-editor "^2.6.0" open "^8.0.9" p-retry "^4.5.0" rimraf "^3.0.2" @@ -13758,8 +14335,8 @@ webpack-dev-server@^4.6.0, webpack-dev-server@^4.7.4: serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.4.2" + webpack-dev-middleware "^5.3.4" + ws "^8.13.0" webpack-manifest-plugin@^4.0.2: version "4.1.1" @@ -13791,33 +14368,33 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.41.1, webpack@^5.64.4: - version "5.75.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== + version "5.93.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.93.0.tgz#2e89ec7035579bdfba9760d26c63ac5c3462a5e5" + integrity sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" + acorn-import-attributes "^1.9.5" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.17.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -13842,9 +14419,9 @@ whatwg-encoding@^1.0.5: iconv-lite "0.4.24" whatwg-fetch@^3.6.17, whatwg-fetch@^3.6.2: - version "3.6.17" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz#009bbbfc122b227b74ba1ff31536b3a1a0e0e212" - integrity sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ== + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== whatwg-mimetype@^2.3.0: version "2.3.0" @@ -13880,32 +14457,49 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== +which-builtin-type@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== + dependencies: + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.1, which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" + has-tostringtag "^1.0.2" which@^1.2.9, which@^1.3.1: version "1.3.1" @@ -13928,35 +14522,35 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.5, word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -workbox-background-sync@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9" - integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g== +workbox-background-sync@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz#08d603a33717ce663e718c30cc336f74909aff2f" + integrity sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg== dependencies: idb "^7.0.1" - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-broadcast-update@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66" - integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw== +workbox-broadcast-update@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz#0fad9454cf8e4ace0c293e5617c64c75d8a8c61e" + integrity sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-build@6.5.4, workbox-build@^6.1.5: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389" - integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA== +workbox-build@6.6.1, workbox-build@^6.1.5: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.6.1.tgz#6010e9ce550910156761448f2dbea8cfcf759cb0" + integrity sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw== dependencies: "@apideck/better-ajv-errors" "^0.3.1" "@babel/core" "^7.11.1" @@ -13980,132 +14574,141 @@ workbox-build@6.5.4, workbox-build@^6.1.5: strip-comments "^2.0.1" tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "6.5.4" - workbox-broadcast-update "6.5.4" - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-google-analytics "6.5.4" - workbox-navigation-preload "6.5.4" - workbox-precaching "6.5.4" - workbox-range-requests "6.5.4" - workbox-recipes "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" - workbox-streams "6.5.4" - workbox-sw "6.5.4" - workbox-window "6.5.4" - -workbox-cacheable-response@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137" - integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug== - dependencies: - workbox-core "6.5.4" - -workbox-core@6.5.4, workbox-core@^6.1.5: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba" - integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q== - -workbox-expiration@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539" - integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ== + workbox-background-sync "6.6.1" + workbox-broadcast-update "6.6.1" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-google-analytics "6.6.1" + workbox-navigation-preload "6.6.1" + workbox-precaching "6.6.1" + workbox-range-requests "6.6.1" + workbox-recipes "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" + workbox-streams "6.6.1" + workbox-sw "6.6.1" + workbox-window "6.6.1" + +workbox-cacheable-response@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz#284c2b86be3f4fd191970ace8c8e99797bcf58e9" + integrity sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag== + dependencies: + workbox-core "6.6.1" + +workbox-core@6.6.1, workbox-core@^6.1.5: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.6.1.tgz#7184776d4134c5ed2f086878c882728fc9084265" + integrity sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw== + +workbox-expiration@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.6.1.tgz#a841fa36676104426dbfb9da1ef6a630b4f93739" + integrity sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A== dependencies: idb "^7.0.1" - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-google-analytics@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d" - integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg== +workbox-google-analytics@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz#a07a6655ab33d89d1b0b0a935ffa5dea88618c5d" + integrity sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA== dependencies: - workbox-background-sync "6.5.4" - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-background-sync "6.6.1" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-navigation-preload@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212" - integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng== +workbox-navigation-preload@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz#61a34fe125558dd88cf09237f11bd966504ea059" + integrity sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-precaching@6.5.4, workbox-precaching@^6.1.5: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72" - integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg== +workbox-precaching@6.6.1, workbox-precaching@^6.1.5: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.6.1.tgz#dedeeba10a2d163d990bf99f1c2066ac0d1a19e2" + integrity sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A== dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-core "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-range-requests@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399" - integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg== +workbox-range-requests@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz#ddaf7e73af11d362fbb2f136a9063a4c7f507a39" + integrity sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-recipes@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb" - integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA== +workbox-recipes@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.6.1.tgz#ea70d2b2b0b0bce8de0a9d94f274d4a688e69fae" + integrity sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g== dependencies: - workbox-cacheable-response "6.5.4" - workbox-core "6.5.4" - workbox-expiration "6.5.4" - workbox-precaching "6.5.4" - workbox-routing "6.5.4" - workbox-strategies "6.5.4" + workbox-cacheable-response "6.6.1" + workbox-core "6.6.1" + workbox-expiration "6.6.1" + workbox-precaching "6.6.1" + workbox-routing "6.6.1" + workbox-strategies "6.6.1" -workbox-routing@6.5.4, workbox-routing@^6.1.5: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da" - integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg== +workbox-routing@6.6.1, workbox-routing@^6.1.5: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.6.1.tgz#cba9a1c7e0d1ea11e24b6f8c518840efdc94f581" + integrity sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-strategies@6.5.4, workbox-strategies@^6.1.5: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d" - integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw== +workbox-strategies@6.6.1, workbox-strategies@^6.1.5: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.6.1.tgz#38d0f0fbdddba97bd92e0c6418d0b1a2ccd5b8bf" + integrity sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw== dependencies: - workbox-core "6.5.4" + workbox-core "6.6.1" -workbox-streams@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69" - integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg== +workbox-streams@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.6.1.tgz#b2f7ba7b315c27a6e3a96a476593f99c5d227d26" + integrity sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q== dependencies: - workbox-core "6.5.4" - workbox-routing "6.5.4" + workbox-core "6.6.1" + workbox-routing "6.6.1" -workbox-sw@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736" - integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA== +workbox-sw@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.6.1.tgz#d4c4ca3125088e8b9fd7a748ed537fa0247bd72c" + integrity sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ== workbox-webpack-plugin@^6.4.1, workbox-webpack-plugin@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.4.tgz#baf2d3f4b8f435f3469887cf4fba2b7fac3d0fd7" - integrity sha512-LmWm/zoaahe0EGmMTrSLUi+BjyR3cdGEfU3fS6PN1zKFYbqAKuQ+Oy/27e4VSXsyIwAw8+QDfk1XHNGtZu9nQg== + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz#4f81cc1ad4e5d2cd7477a86ba83c84ee2d187531" + integrity sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA== dependencies: fast-json-stable-stringify "^2.1.0" pretty-bytes "^5.4.1" upath "^1.2.0" webpack-sources "^1.4.3" - workbox-build "6.5.4" + workbox-build "6.6.1" -workbox-window@6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91" - integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug== +workbox-window@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.6.1.tgz#f22a394cbac36240d0dadcbdebc35f711bb7b89e" + integrity sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ== dependencies: "@types/trusted-types" "^2.0.2" - workbox-core "6.5.4" + workbox-core "6.6.1" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrap-ansi@^5.1.0: version "5.1.0" @@ -14125,14 +14728,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" @@ -14158,15 +14761,23 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.4.2: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" - integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== +ws@^8.13.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== xdg-basedir@^3.0.0: version "3.0.0" @@ -14183,7 +14794,7 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -14218,6 +14829,11 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" + integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -14273,6 +14889,11 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +zalgo-promise@^1, zalgo-promise@^1.0.11, zalgo-promise@^1.0.3: + version "1.0.48" + resolved "https://registry.yarnpkg.com/zalgo-promise/-/zalgo-promise-1.0.48.tgz#9e33eef502d5ed9f5a09fc5728c833c3e87afa2e" + integrity sha512-LLHANmdm53+MucY9aOFIggzYtUdkSBFxUsy4glTTQYNyK6B3uCPWTbfiGvSrEvLojw0mSzyFJ1/RRLv+QMNdzQ== + zip-stream@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.1.3.tgz#26cc4bdb93641a8590dd07112e1f77af1758865b" From 28554384f3a5e1ee5d9ad8d56b9caa24dddd690a Mon Sep 17 00:00:00 2001 From: Thomas Zemp Date: Thu, 29 Aug 2024 08:36:47 +0200 Subject: [PATCH 02/11] Dependencies update further [DHIS2-17941] (#409) --- .eslintignore | 1 + .eslintrc.js | 4 +- .prettierrc.js | 1 - package.json | 14 +- src/app/LoadApp.spec.tsx | 1 - src/app/layout/Breadcrumb.spec.tsx | 18 +- src/app/routes/DefaultErrorRoute.tsx | 2 +- src/app/routes/Router.tsx | 20 +- src/app/sidebar/Sidebar.spec.tsx | 27 +- src/pages/dataElements/List.spec.tsx | 15 +- yarn.lock | 508 ++++++++++++++++----------- 11 files changed, 370 insertions(+), 241 deletions(-) diff --git a/.eslintignore b/.eslintignore index 9ca98e28..3f810a72 100644 --- a/.eslintignore +++ b/.eslintignore @@ -11,3 +11,4 @@ cypress.env.json cypress/screenshots/* src/types/generated +.prettierrc.js \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index 1d9010c9..45d91b63 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,4 +1,4 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires +// eslint-disable-next-line @typescript-eslint/no-require-imports const { config } = require('@dhis2/cli-style') module.exports = { @@ -16,5 +16,7 @@ module.exports = { }, rules: { 'import/extensions': 'off', + '@typescript-eslint/no-explicit-any': 1, + '@typescript-eslint/no-unused-vars': 1, }, } diff --git a/.prettierrc.js b/.prettierrc.js index 33aabee2..def7934e 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires const { config } = require('@dhis2/cli-style') module.exports = { diff --git a/package.json b/package.json index 3cc579aa..9b0ce4d4 100644 --- a/package.json +++ b/package.json @@ -26,14 +26,14 @@ "@testing-library/jest-dom": "^6.1.2", "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^8.0.1", - "@testing-library/user-event": "^12.8.3", + "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.3", "@types/react": "^18.2.6", - "@typescript-eslint/eslint-plugin": "^5.55.0", - "@typescript-eslint/parser": "^5.55.0", - "cypress": "^12.14.0", + "@typescript-eslint/eslint-plugin": "^8.2.0", + "@typescript-eslint/parser": "^8.2.0", + "cypress": "^13.13.3", "eslint": "^8", - "typescript": "^5.0.4", + "typescript": "^5.5.4", "whatwg-fetch": "^3.6.17" }, "dependencies": { @@ -45,8 +45,8 @@ "react-color": "^2.19.3", "react-error-boundary": "^4.0.11", "react-final-form": "^6.5.9", - "react-router-dom": "^6.11.2", - "use-debounce": "^9.0.4", + "react-router-dom": "^6.26.1", + "use-debounce": "^10.0.3", "use-query-params": "^2.2.1", "zod": "^3.22.2", "zustand": "^4.4.0" diff --git a/src/app/LoadApp.spec.tsx b/src/app/LoadApp.spec.tsx index 6d20324f..e71167a0 100644 --- a/src/app/LoadApp.spec.tsx +++ b/src/app/LoadApp.spec.tsx @@ -32,7 +32,6 @@ describe('LoadApp', () => { } beforeEach(async () => { - // eslint-disable-next-line @typescript-eslint/no-extra-semi ;(useSetSchemas as jest.Mock).mockImplementation(() => setSchemaMock) ;(useSetSystemSettings as jest.Mock).mockImplementation( () => setSystemSettingsMock diff --git a/src/app/layout/Breadcrumb.spec.tsx b/src/app/layout/Breadcrumb.spec.tsx index bbcbe628..03ce6aa6 100644 --- a/src/app/layout/Breadcrumb.spec.tsx +++ b/src/app/layout/Breadcrumb.spec.tsx @@ -76,22 +76,20 @@ describe('BreadcrumbItem', () => { }) }) describe('Breadcrumbs', () => { - it('should render crumb components in handle ', () => { + it('should render crumb components in handle', () => { const { getByText } = render(, { wrapper: HashRouter }) expect(getByText('Crumb 1')).toBeDefined() expect(getByText('Crumb 2')).toBeDefined() - }), - it('should not crash when no crumb components are in handle ', () => { - mockedUseMatches.mockReturnValue([ - mockHandle({ hideSidebar: true }), - ]) + }) + it('should not crash when no crumb components are in handle ', () => { + mockedUseMatches.mockReturnValue([mockHandle({ hideSidebar: true })]) - const { queryByText } = render() + const { queryByText } = render() - expect(queryByText('Crumb 1')).not.toBeInTheDocument() - expect(queryByText('Crumb 2')).not.toBeInTheDocument() - }) + expect(queryByText('Crumb 1')).not.toBeInTheDocument() + expect(queryByText('Crumb 2')).not.toBeInTheDocument() + }) describe('with BreadcrumbItem', () => { beforeEach(() => { diff --git a/src/app/routes/DefaultErrorRoute.tsx b/src/app/routes/DefaultErrorRoute.tsx index 2446e4f4..bef818c9 100644 --- a/src/app/routes/DefaultErrorRoute.tsx +++ b/src/app/routes/DefaultErrorRoute.tsx @@ -15,7 +15,7 @@ export const DefaultErrorRoute = () => { if (isRouteError) { title = error.statusText - message = error?.error?.message + message = error?.data?.message } return ( diff --git a/src/app/routes/Router.tsx b/src/app/routes/Router.tsx index 15798886..df1ddd24 100644 --- a/src/app/routes/Router.tsx +++ b/src/app/routes/Router.tsx @@ -6,8 +6,6 @@ import { Navigate, Route, createRoutesFromElements, - LazyRouteFunction, - RouteObject, useParams, } from 'react-router-dom' import { QueryParamProvider } from 'use-query-params' @@ -33,10 +31,24 @@ import { LegacyAppRedirect } from './LegacyAppRedirect' // see https://reactrouter.com/en/main/route/lazy#multiple-routes-in-a-single-file // Overviews are small, and the AllOverview would load all the other overviews anyway, // so it's propbably better to load them all at once + +// function foo(returnString: T): T extends true ? string : number; +// function foo(returnString: T): string | number { +// return returnString ? String(Math.random()) : Math.random(); +// } + +// function getStatsById(userId: string, timeWindow: TimeWindow, convertJSONOutput: true): Promise; +// function getStatsById(userId: string, timeWindow: TimeWindow, convertJSONOutput: false): Promise; +// function getStatsById( +// userId: string, +// timeWindow: TimeWindow = TimeWindow.Alltime, +// convertJSONOutput: boolean = true +// ): Promise + function createOverviewLazyRouteFunction( componentName: string, //keyof typeof import('../../pages/overview/'), section?: OverviewSection -): LazyRouteFunction { +) { return async () => { const routeComponent = await import(`../../pages/overview/`) const name = componentName as keyof typeof routeComponent @@ -56,7 +68,7 @@ function createOverviewLazyRouteFunction( function createSectionLazyRouteFunction( section: Section, componentFileName: string -): LazyRouteFunction { +) { return async () => { try { return await import( diff --git a/src/app/sidebar/Sidebar.spec.tsx b/src/app/sidebar/Sidebar.spec.tsx index 67c9707a..eee192c2 100644 --- a/src/app/sidebar/Sidebar.spec.tsx +++ b/src/app/sidebar/Sidebar.spec.tsx @@ -80,52 +80,56 @@ describe('Sidebar', () => { }) describe('searching', () => { - it('should filter the list when a search string is entered', () => { + it('should filter the list when a search string is entered', async () => { + const user = userEvent.setup() const { getByPlaceholderText, getByText, queryByText } = renderSideBar() expect(queryByText('Data element group')).toBeNull() - userEvent.type(getByPlaceholderText(/Search/), 'elements') + await user.type(getByPlaceholderText(/Search/), 'elements') expect(getByText('Data elements')).toBeDefined() expect(getByText('Overview')).toBeDefined() expect(getByText('Data element group')).toBeDefined() expect(getByText('Data element group set')).toBeDefined() }) - it('should allow searching for a match in a subcategory', () => { + it('should allow searching for a match in a subcategory', async () => { + const user = userEvent.setup() const { getByPlaceholderText, getByText, queryByText } = renderSideBar() expect(queryByText('Data element group')).toBeNull() - userEvent.type(getByPlaceholderText(/Search/), 'group') + await user.type(getByPlaceholderText(/Search/), 'group') expect(queryByText('Overview')).toBeNull() expect(getByText('Data element group')).toBeDefined() expect(getByText('Data element group set')).toBeDefined() }) describe('when no match', () => { - it('should display an appropriate message', () => { + it('should display an appropriate message', async () => { + const user = userEvent.setup() const { getByPlaceholderText, getByText, queryByText } = renderSideBar() expect(queryByText('Data element group')).toBeNull() - userEvent.type( + await user.type( getByPlaceholderText(/Search/), 'something not in list' ) expect(getByText(/No menu items found for/)).toBeDefined() }) - it('should still display "MetaData Overview"', () => { + it('should still display "MetaData Overview"', async () => { + const user = userEvent.setup() const { getByPlaceholderText, getByText, queryByText } = renderSideBar() expect(queryByText('Data element group')).toBeNull() - userEvent.type( + await user.type( getByPlaceholderText(/Search/), 'something not in list' ) @@ -135,13 +139,14 @@ describe('Sidebar', () => { }) }) - it('should allow tabbing through the menu', () => { + it('should allow tabbing through the menu', async () => { + const user = userEvent.setup() const { getByPlaceholderText, getByText } = renderSideBar() getByPlaceholderText(/Search/).focus() - userEvent.tab() + await user.tab() expect(getByText('Metadata Overview')).toHaveFocus() - userEvent.tab() + await user.tab() expect(getByText('Categories').parentElement).toHaveFocus() }) diff --git a/src/pages/dataElements/List.spec.tsx b/src/pages/dataElements/List.spec.tsx index 2d6f35ef..3c8f4592 100644 --- a/src/pages/dataElements/List.spec.tsx +++ b/src/pages/dataElements/List.spec.tsx @@ -213,10 +213,13 @@ describe('Data Elements List', () => { }) // next page it('should allowing going to Next page', async () => { + const user = userEvent.setup() const { getByTestId, findByText, queryByText } = await renderWithPager() - userEvent.click(getByTestId('dhis2-uiwidgets-pagination-page-next')) + await user.click( + getByTestId('dhis2-uiwidgets-pagination-page-next') + ) await findByText('second page result') expect(queryByText('first page result')).toBeNull() @@ -224,6 +227,7 @@ describe('Data Elements List', () => { // previous page it('should allow going to Previous page ', async () => { + const user = userEvent.setup() const { getByTestId, findByText, queryByText } = await renderWithPager() @@ -231,12 +235,14 @@ describe('Data Elements List', () => { await findByText('first page result') // go to next page - userEvent.click(getByTestId('dhis2-uiwidgets-pagination-page-next')) + await user.click( + getByTestId('dhis2-uiwidgets-pagination-page-next') + ) await findByText('second page result') expect(queryByText('first page result')).toBeNull() // go back to previous page - userEvent.click( + await user.click( getByTestId('dhis2-uiwidgets-pagination-page-previous') ) await findByText('first page result') @@ -279,6 +285,7 @@ describe('Data Elements List', () => { }) // select all it('should allow selecting all items', async () => { + const user = userEvent.setup() const customData = { userDataStore: defaultUserDataStoreData, dataElements: dataElementsMock, @@ -287,7 +294,7 @@ describe('Data Elements List', () => { customData ) - userEvent.click(getByTestId('section-list-selectall')) + await user.click(getByTestId('section-list-selectall')) const allCheckBoxes = queryAllByTestId('section-list-row-checkbox') diff --git a/yarn.lock b/yarn.lock index 6a86032f..31430535 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@adobe/css-tools@^4.3.0": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" - integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== +"@adobe/css-tools@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63" + integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ== "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -1459,10 +1459,10 @@ resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz#7dfccb9df5499e627e7bfdbb4021a06813a45dba" integrity sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ== -"@cypress/request@^2.88.10": - version "2.88.11" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.11.tgz#5a4c7399bc2d7e7ed56e92ce5acb620c8b187047" - integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== +"@cypress/request@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -1477,9 +1477,9 @@ json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.10.3" + qs "6.10.4" safe-buffer "^5.1.2" - tough-cookie "~2.5.0" + tough-cookie "^4.1.3" tunnel-agent "^0.6.0" uuid "^8.3.2" @@ -2383,14 +2383,14 @@ 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.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" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": version "4.11.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== @@ -2535,12 +2535,12 @@ "@types/node" "*" jest-mock "^27.5.1" -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - jest-get-type "^29.4.3" + jest-get-type "^29.6.3" "@jest/fake-timers@^27.5.1": version "27.5.1" @@ -2601,12 +2601,12 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@sinclair/typebox" "^0.25.16" + "@sinclair/typebox" "^0.27.8" "@jest/source-map@^27.5.1": version "27.5.1" @@ -2691,12 +2691,12 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -2844,10 +2844,10 @@ "@react-hook/passive-layout-effect" "^1.2.0" "@react-hook/resize-observer" "^1.2.1" -"@remix-run/router@1.6.2": - version "1.6.2" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.2.tgz#bbe75f8c59e0b7077584920ce2cc76f8f354934d" - integrity sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA== +"@remix-run/router@1.19.1": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.1.tgz#984771bfd1de2715f42394c87fb716c1349e014f" + integrity sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -2896,10 +2896,10 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -3067,17 +3067,17 @@ pretty-format "^27.0.2" "@testing-library/jest-dom@^6.1.2": - version "6.1.2" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.2.tgz#3e7422904349223cb1e04968adada63f65f40d5b" - integrity sha512-NP9jl1Q2qDDtx+cqogowtQtmgD2OVs37iMSIsTv5eN5ETRkf26Kj6ugVwA93/gZzzFWQAsgkKkcftDe91BJCkQ== + version "6.4.8" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.8.tgz#9c435742b20c6183d4e7034f2b329d562c079daa" + integrity sha512-JD0G+Zc38f5MBHA4NgxQMR5XtO5Jx9g86jqturNTt2WUfRmLDIY7iKkWHDCCTiDuFMre6nxAD5wHw9W5kI4rGw== dependencies: - "@adobe/css-tools" "^4.3.0" + "@adobe/css-tools" "^4.4.0" "@babel/runtime" "^7.9.2" aria-query "^5.0.0" chalk "^3.0.0" css.escape "^1.5.1" - dom-accessibility-api "^0.5.6" - lodash "^4.17.15" + dom-accessibility-api "^0.6.3" + lodash "^4.17.21" redent "^3.0.0" "@testing-library/react-hooks@^8.0.1": @@ -3097,12 +3097,10 @@ "@testing-library/dom" "^8.0.0" "@types/react-dom" "<18.0.0" -"@testing-library/user-event@^12.8.3": - version "12.8.3" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.8.3.tgz#1aa3ed4b9f79340a1e1836bc7f57c501e838704a" - integrity sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ== - dependencies: - "@babel/runtime" "^7.12.5" +"@testing-library/user-event@^14.5.2": + version "14.5.2" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" + integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== "@tootallnate/once@1": version "1.1.2" @@ -3285,9 +3283,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^29.5.3": - version "29.5.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.3.tgz#7a35dc0044ffb8b56325c6802a4781a626b05777" - integrity sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA== + version "29.5.12" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -3303,9 +3301,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/lodash@^4.14.198": - version "4.14.198" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.198.tgz#4d27465257011aedc741a809f1269941fa2c5d4c" - integrity sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg== + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612" + integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA== "@types/mime@^1": version "1.3.5" @@ -3331,11 +3329,6 @@ dependencies: undici-types "~6.19.2" -"@types/node@^14.14.31": - version "14.18.48" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.48.tgz#ee5c7ac6e38fd2a9e6885f15c003464cf2da343c" - integrity sha512-iL0PIMwejpmuVHgfibHpfDwOdsbmB50wr21X71VnF5d7SsBF7WK+ZvP/SCcFm7Iwb9iiYSap9rlrdhToNAWdxg== - "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -3388,12 +3381,11 @@ csstype "^3.0.2" "@types/react@^18.2.6": - version "18.2.9" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.9.tgz#9207f8571afdc59a9c9c30df50e8ad2591ecefaf" - integrity sha512-pL3JAesUkF7PEQGxh5XOwdXGV907te6m1/Qe1ERJLgomojS6Ne790QiA7GUl434JEkFA2aAaB6qJ5z4e1zJn/w== + version "18.3.4" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.4.tgz#dfdd534a1d081307144c00e325c06e00312c93a3" + integrity sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" csstype "^3.0.2" "@types/resolve@1.17.1": @@ -3408,11 +3400,6 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/scheduler@*": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.23.0.tgz#0a6655b3e2708eaabca00b7372fafd7a792a7b09" - integrity sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw== - "@types/scheduler@^0.16": version "0.16.8" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" @@ -3453,9 +3440,9 @@ integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== "@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" + integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== "@types/sockjs@^0.3.33": version "0.3.36" @@ -3501,13 +3488,13 @@ "@types/yargs-parser" "*" "@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.5.0", "@typescript-eslint/eslint-plugin@^5.55.0": +"@typescript-eslint/eslint-plugin@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== @@ -3523,6 +3510,21 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz#bf50e9c8dac6bdf15dd1b52ca29448550903558e" + integrity sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.2.0" + "@typescript-eslint/type-utils" "8.2.0" + "@typescript-eslint/utils" "8.2.0" + "@typescript-eslint/visitor-keys" "8.2.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/experimental-utils@^5.0.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" @@ -3530,7 +3532,7 @@ dependencies: "@typescript-eslint/utils" "5.62.0" -"@typescript-eslint/parser@^5.5.0", "@typescript-eslint/parser@^5.55.0": +"@typescript-eslint/parser@^5.5.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== @@ -3540,6 +3542,17 @@ "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" +"@typescript-eslint/parser@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.2.0.tgz#de3993304feb98576d9ffbf10c83ca1bcb68a5dd" + integrity sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg== + dependencies: + "@typescript-eslint/scope-manager" "8.2.0" + "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/typescript-estree" "8.2.0" + "@typescript-eslint/visitor-keys" "8.2.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -3548,6 +3561,14 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz#4a4bd7e7df5522acc8795c3b6f21e8c41b951138" + integrity sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw== + dependencies: + "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/visitor-keys" "8.2.0" + "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -3558,11 +3579,26 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz#5cd7fef50f492e5a0f508bdd40678861a57c3549" + integrity sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w== + dependencies: + "@typescript-eslint/typescript-estree" "8.2.0" + "@typescript-eslint/utils" "8.2.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.2.0.tgz#dfe9895a2812f7c6bf7af863054c22a67060420c" + integrity sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -3576,6 +3612,20 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz#fbdb93a1c7ac7f1f96ae2de4fc97cd64c60ae894" + integrity sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA== + dependencies: + "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/visitor-keys" "8.2.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -3590,6 +3640,16 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.2.0.tgz#02d442285925f28d520587185f295f932702e733" + integrity sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.2.0" + "@typescript-eslint/types" "8.2.0" + "@typescript-eslint/typescript-estree" "8.2.0" + "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -3598,6 +3658,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz#f6abb3b6508898a117175ddc11f9b9869cc96834" + integrity sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q== + dependencies: + "@typescript-eslint/types" "8.2.0" + eslint-visitor-keys "^3.4.3" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -4720,7 +4788,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.1.0, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.1.0, buffer@^5.5.0, buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -4777,9 +4845,9 @@ cacheable-request@^6.0.0: responselike "^1.0.2" cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" @@ -4984,9 +5052,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-table3@~0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + version "0.6.5" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== dependencies: string-width "^4.2.0" optionalDependencies: @@ -5658,20 +5726,19 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -cypress@^12.14.0: - version "12.14.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.14.0.tgz#37a19b85f5e9d881995e9fee1ddf41b3d3a623dd" - integrity sha512-HiLIXKXZaIT1RT7sw1sVPt+qKtis3uYNm6KwC4qoYjabwLKaqZlyS/P+uVvvlBNcHIwL/BC6nQZajpbUd7hOgQ== +cypress@^13.13.3: + version "13.13.3" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.13.3.tgz#21ee054bb4e00b3858f2e33b4f8f4e69128470a9" + integrity sha512-hUxPrdbJXhUOTzuML+y9Av7CKoYznbD83pt8g3klgpioEha0emfx4WNIuVRx0C76r0xV2MIwAW9WYiXfVJYFQw== dependencies: - "@cypress/request" "^2.88.10" + "@cypress/request" "^3.0.1" "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" arch "^2.2.0" blob-util "^2.0.2" bluebird "^3.7.2" - buffer "^5.6.0" + buffer "^5.7.1" cachedir "^2.3.0" chalk "^4.1.0" check-more-types "^2.24.0" @@ -5689,7 +5756,7 @@ cypress@^12.14.0: figures "^3.2.0" fs-extra "^9.1.0" getos "^3.2.1" - is-ci "^3.0.0" + is-ci "^3.0.1" is-installed-globally "~0.4.0" lazy-ass "^1.6.0" listr2 "^3.8.3" @@ -5698,11 +5765,12 @@ cypress@^12.14.0: minimist "^1.2.8" ospath "^1.2.2" pretty-bytes "^5.6.0" + process "^0.11.10" proxy-from-env "1.0.0" request-progress "^3.0.0" - semver "^7.3.2" + semver "^7.5.3" supports-color "^8.1.1" - tmp "~0.2.1" + tmp "~0.2.3" untildify "^4.0.0" yauzl "^2.10.0" @@ -5760,9 +5828,9 @@ data-view-byte-offset@^1.0.0: is-data-view "^1.0.1" dayjs@^1.10.4: - version "1.11.8" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.8.tgz#4282f139c8c19dd6d0c7bd571e30c2d0ba7698ea" - integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: version "2.6.9" @@ -5977,10 +6045,10 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== dir-glob@^3.0.1: version "3.0.1" @@ -6015,11 +6083,16 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: +dom-accessibility-api@^0.5.9: version "0.5.16" resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -6844,15 +6917,15 @@ expect@^27.5.1: jest-message-util "^27.5.1" expect@^29.0.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" express@^4.17.3: version "4.19.2" @@ -8065,7 +8138,7 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0, ignore@^5.3.2: +ignore@^5.2.0, ignore@^5.3.1, ignore@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== @@ -8254,7 +8327,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-ci@^3.0.0: +is-ci@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== @@ -8814,15 +8887,15 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-docblock@^27.5.1: version "27.5.1" @@ -8872,10 +8945,10 @@ jest-get-type@^27.5.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^27.5.1: version "27.5.1" @@ -8938,15 +9011,15 @@ jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-message-util@^27.5.1: version "27.5.1" @@ -8978,18 +9051,18 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.5.0" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" @@ -9156,12 +9229,12 @@ jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -11491,12 +11564,12 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -11505,6 +11578,11 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + promise@^8.1.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -11587,6 +11665,13 @@ q@^1.1.2, q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== +qs@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== + dependencies: + side-channel "^1.0.4" + qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" @@ -11594,13 +11679,6 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@~6.10.3: - version "6.10.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== - dependencies: - side-channel "^1.0.4" - qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -11733,9 +11811,9 @@ react-error-boundary@^3.1.0: "@babel/runtime" "^7.12.5" react-error-boundary@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.0.11.tgz#36bf44de7746714725a814630282fee83a7c9a1c" - integrity sha512-U13ul67aP5DOSPNSCWQ/eO0AQEYzEFkVljULQIjMV0KlffTAhxuDoBKdO0pb/JZ8mDhMKFZ9NZi0BmLGUiNphw== + version "4.0.13" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.0.13.tgz#80386b7b27b1131c5fbb7368b8c0d983354c7947" + integrity sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ== dependencies: "@babel/runtime" "^7.12.5" @@ -11793,20 +11871,20 @@ react-refresh@^0.11.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== -react-router-dom@^6.11.2: - version "6.11.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.11.2.tgz#324d55750ffe2ecd54ca4ec6b7bc7ab01741f170" - integrity sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw== +react-router-dom@^6.26.1: + version "6.26.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.1.tgz#a408892b41767a49dc94b3564b0e7d8e3959f623" + integrity sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw== dependencies: - "@remix-run/router" "1.6.2" - react-router "6.11.2" + "@remix-run/router" "1.19.1" + react-router "6.26.1" -react-router@6.11.2: - version "6.11.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.11.2.tgz#006301c4da1a173d7ad76b7ecd2da01b9dd3837a" - integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== +react-router@6.26.1: + version "6.26.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.1.tgz#88c64837e05ffab6899a49df2a1484a22471e4ce" + integrity sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ== dependencies: - "@remix-run/router" "1.6.2" + "@remix-run/router" "1.19.1" react-scripts@^5.0.1: version "5.0.1" @@ -12274,9 +12352,9 @@ reusify@^1.0.4: integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" @@ -12483,7 +12561,7 @@ semver@^6.0.0, semver@^6.2.0, 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.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -13000,7 +13078,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -13026,6 +13104,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -13120,7 +13207,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -13141,6 +13228,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -13557,9 +13651,9 @@ throat@^6.0.1: integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== + version "1.0.1" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== through2-filter@^3.0.0: version "3.1.0" @@ -13605,12 +13699,10 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" +tmp@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== tmpl@1.0.5: version "1.0.5" @@ -13679,7 +13771,7 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^4.0.0: +tough-cookie@^4.0.0, tough-cookie@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== @@ -13721,6 +13813,11 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-api-utils@^1.3.0: + version "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-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" @@ -13893,10 +13990,10 @@ typescript@^3.6.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== -typescript@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== +typescript@^5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== uglify-js@^3.1.4: version "3.19.2" @@ -14092,10 +14189,10 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -use-debounce@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-9.0.4.tgz#51d25d856fbdfeb537553972ce3943b897f1ac85" - integrity sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ== +use-debounce@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-10.0.3.tgz#636094a37f7aa2bcc77b26b961481a0b571bf7ea" + integrity sha512-DxQSI9ZKso689WM1mjgGU3ozcxU1TJElBJ3X6S4SMzMNcm2lVH0AHmyXB+K7ewjz2BSUKJTDqTcwtSMRfB89dg== use-query-params@^2.2.1: version "2.2.1" @@ -14104,10 +14201,10 @@ use-query-params@^2.2.1: dependencies: serialize-query-params "^2.0.2" -use-sync-external-store@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-sync-external-store@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== use@^3.1.0: version "3.1.1" @@ -14701,7 +14798,7 @@ workbox-window@6.6.1: "@types/trusted-types" "^2.0.2" workbox-core "6.6.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -14728,6 +14825,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -14904,13 +15010,13 @@ zip-stream@^2.1.2: readable-stream "^3.4.0" zod@^3.22.2: - version "3.22.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" - integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== zustand@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.0.tgz#13b3e8ca959dd53d536034440aec382ff91b65c3" - integrity sha512-2dq6wq4dSxbiPTamGar0NlIG/av0wpyWZJGeQYtUOLegIUvhM2Bf86ekPlmgpUtS5uR7HyetSiktYrGsdsyZgQ== + version "4.5.5" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.5.tgz#f8c713041543715ec81a2adda0610e1dc82d4ad1" + integrity sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q== dependencies: - use-sync-external-store "1.2.0" + use-sync-external-store "1.2.2" From a8dfc9df0cc00bbb46553f4bd63279c1261271a4 Mon Sep 17 00:00:00 2001 From: Flaminia Date: Mon, 9 Sep 2024 09:54:29 -0700 Subject: [PATCH 03/11] test: org unit list tests (#406) * test: add tests for org unit list page * fix: extend user type --------- Co-authored-by: Birk Johansson Co-authored-by: Thomas Zemp --- package.json | 1 + .../schema/organisationUnitsSchema.json | 1798 +++++++++++++++++ src/app/LoadApp.spec.tsx | 2 +- .../sectionList/listActions/DeleteAction.tsx | 2 +- .../listActions/SectionListActions.tsx | 6 +- src/pages/organisationUnits/List.spec.tsx | 491 +++++ .../list/OrganisationUnitList.tsx | 1 + .../list/OrganisationUnitListActions.tsx | 2 + .../list/OrganisationUnitRow.tsx | 1 + src/testUtils/TestComponentWithRouter.tsx | 2 +- src/testUtils/builders.ts | 91 + src/types/generated/models.ts | 11 +- yarn.lock | 5 + 13 files changed, 2404 insertions(+), 9 deletions(-) create mode 100644 src/__mocks__/schema/organisationUnitsSchema.json create mode 100644 src/pages/organisationUnits/List.spec.tsx create mode 100644 src/testUtils/builders.ts diff --git a/package.json b/package.json index 9b0ce4d4..66b2ad3c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@dhis2/cli-style": "^10.5.1", "@dhis2/cypress-commands": "^10.0.3", "@dhis2/cypress-plugins": "^10.0.3", + "@faker-js/faker": "^8.4.1", "@testing-library/jest-dom": "^6.1.2", "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^8.0.1", diff --git a/src/__mocks__/schema/organisationUnitsSchema.json b/src/__mocks__/schema/organisationUnitsSchema.json new file mode 100644 index 00000000..35a8d603 --- /dev/null +++ b/src/__mocks__/schema/organisationUnitsSchema.json @@ -0,0 +1,1798 @@ +{ + "singular": "organisationUnit", + "plural": "organisationUnits", + "name": "organisationUnit", + "displayName": "Organisation Unit", + "shareable": false, + "dataShareable": false, + "authorities": [ + { + "type": "CREATE", + "authorities": ["F_ORGANISATIONUNIT_ADD"] + }, + { + "type": "DELETE", + "authorities": ["F_ORGANISATIONUNIT_DELETE"] + } + ], + "properties": { + "parent": { + "klass": "org.hisp.dhis.organisationunit.OrganisationUnit", + "propertyType": "REFERENCE", + "name": "parent", + "fieldName": "parent", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": true, + "nameableObject": true, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "cascade": "none", + "manyToMany": false, + "oneToOne": false, + "manyToOne": true, + "oneToMany": false, + "owningRole": "org.hisp.dhis.organisationunit.OrganisationUnit.parent", + "href": "https://debug.dhis2.org/dev/api/42/schemas/organisationUnit", + "relativeApiEndpoint": "/organisationUnits", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/organisationUnits", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "type": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "type", + "fieldName": "type", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 2147483647, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "path": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "path", + "fieldName": "path", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": true, + "required": false, + "length": 255, + "max": 255, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "lastUpdated": { + "klass": "java.util.Date", + "propertyType": "DATE", + "name": "lastUpdated", + "fieldName": "lastUpdated", + "persisted": true, + "description": "The date this object was last updated.", + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "children": { + "klass": "java.util.Set", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.organisationunit.OrganisationUnit", + "itemPropertyType": "REFERENCE", + "name": "child", + "fieldName": "children", + "persisted": true, + "collectionName": "children", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": false, + "owner": false, + "identifiableObject": true, + "nameableObject": true, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "cascade": "none", + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": true, + "inverseRole": "org.hisp.dhis.organisationunit.OrganisationUnit.children", + "href": "https://debug.dhis2.org/dev/api/42/schemas/organisationUnit", + "relativeApiEndpoint": "/organisationUnits", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/organisationUnits", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "translations": { + "klass": "java.util.Set", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.translation.Translation", + "itemPropertyType": "COMPLEX", + "name": "translation", + "fieldName": "translations", + "persisted": true, + "collectionName": "translations", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "max": 255, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "FALSE", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "uid": { + "klass": "java.lang.String", + "propertyType": "IDENTIFIER", + "name": "id", + "fieldName": "uid", + "persisted": true, + "description": "The Unique Identifier for this Object.", + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": true, + "required": false, + "length": 11, + "max": 11, + "min": 11, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "href": { + "klass": "java.lang.String", + "propertyType": "URL", + "name": "href", + "fieldName": "href", + "persisted": false, + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "ancestors": { + "klass": "java.util.List", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.organisationunit.OrganisationUnit", + "itemPropertyType": "REFERENCE", + "name": "organisationUnit", + "fieldName": "ancestors", + "persisted": false, + "collectionName": "ancestors", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": true, + "owner": false, + "identifiableObject": true, + "nameableObject": true, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "href": "https://debug.dhis2.org/dev/api/42/schemas/organisationUnit", + "relativeApiEndpoint": "/organisationUnits", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/organisationUnits", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "groups": { + "klass": "java.util.Set", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.organisationunit.OrganisationUnitGroup", + "itemPropertyType": "REFERENCE", + "name": "organisationUnitGroup", + "fieldName": "groups", + "persisted": true, + "collectionName": "organisationUnitGroups", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": false, + "owner": false, + "identifiableObject": true, + "nameableObject": true, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "cascade": "none", + "manyToMany": true, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "owningRole": "org.hisp.dhis.organisationunit.OrganisationUnitGroup.members", + "inverseRole": "org.hisp.dhis.organisationunit.OrganisationUnit.groups", + "href": "https://debug.dhis2.org/dev/api/42/schemas/organisationUnitGroup", + "relativeApiEndpoint": "/organisationUnitGroups", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/organisationUnitGroups", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "displayDescription": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "displayDescription", + "fieldName": "displayDescription", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "image": { + "klass": "org.hisp.dhis.fileresource.FileResource", + "propertyType": "REFERENCE", + "name": "image", + "fieldName": "image", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": true, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "cascade": "none", + "manyToMany": false, + "oneToOne": false, + "manyToOne": true, + "oneToMany": false, + "owningRole": "org.hisp.dhis.organisationunit.OrganisationUnit.image", + "href": "https://debug.dhis2.org/dev/api/42/schemas/fileResource", + "relativeApiEndpoint": "/fileResources", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/fileResources", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "lastUpdatedBy": { + "klass": "org.hisp.dhis.user.User", + "propertyType": "REFERENCE", + "name": "lastUpdatedBy", + "fieldName": "lastUpdatedBy", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": true, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "cascade": "none", + "manyToMany": false, + "oneToOne": false, + "manyToOne": true, + "oneToMany": false, + "owningRole": "org.hisp.dhis.organisationunit.OrganisationUnit.lastUpdatedBy", + "href": "https://debug.dhis2.org/dev/api/42/schemas/user", + "relativeApiEndpoint": "/users", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/users", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": true + }, + "hierarchyLevel": { + "klass": "java.lang.Integer", + "propertyType": "INTEGER", + "name": "level", + "fieldName": "hierarchyLevel", + "persisted": true, + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 2147483647, + "max": 2147483647, + "min": -2147483648, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "created": { + "klass": "java.util.Date", + "propertyType": "DATE", + "name": "created", + "fieldName": "created", + "persisted": true, + "description": "The date this object was created.", + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "attributeValues": { + "klass": "java.util.Set", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.attribute.AttributeValue", + "itemPropertyType": "COMPLEX", + "name": "attributeValue", + "fieldName": "attributeValues", + "persisted": true, + "collectionName": "attributeValues", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": true, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "max": 255, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "sharing": { + "klass": "org.hisp.dhis.user.sharing.Sharing", + "propertyType": "COMPLEX", + "name": "sharing", + "fieldName": "sharing", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "FALSE", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "displayFormName": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "displayFormName", + "fieldName": "displayFormName", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "users": { + "klass": "java.util.Set", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.user.User", + "itemPropertyType": "REFERENCE", + "name": "userItem", + "fieldName": "users", + "persisted": true, + "collectionName": "users", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": false, + "owner": false, + "identifiableObject": true, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "cascade": "none", + "manyToMany": true, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "owningRole": "org.hisp.dhis.user.User.organisationUnits", + "inverseRole": "org.hisp.dhis.organisationunit.OrganisationUnit.users", + "href": "https://debug.dhis2.org/dev/api/42/schemas/user", + "relativeApiEndpoint": "/users", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/users", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "phoneNumber": { + "klass": "java.lang.String", + "propertyType": "PHONENUMBER", + "name": "phoneNumber", + "fieldName": "phoneNumber", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 150, + "max": 150, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "name": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "name", + "fieldName": "name", + "persisted": true, + "description": "The name of this Object. Required and unique.", + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": true, + "length": 230, + "max": 230, + "min": 1, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": true, + "translationKey": "NAME", + "i18nTranslationKey": "name", + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "dataSets": { + "klass": "java.util.Set", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.dataset.DataSet", + "itemPropertyType": "REFERENCE", + "name": "dataSet", + "fieldName": "dataSets", + "persisted": true, + "collectionName": "dataSets", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": false, + "owner": false, + "identifiableObject": true, + "nameableObject": true, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "cascade": "none", + "manyToMany": true, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "owningRole": "org.hisp.dhis.dataset.DataSet.sources", + "inverseRole": "org.hisp.dhis.organisationunit.OrganisationUnit.dataSets", + "href": "https://debug.dhis2.org/dev/api/42/schemas/dataSet", + "relativeApiEndpoint": "/dataSets", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/dataSets", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "legendSets": { + "klass": "java.util.List", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.legend.LegendSet", + "itemPropertyType": "REFERENCE", + "name": "legendSets", + "fieldName": "legendSets", + "persisted": false, + "collectionName": "legendSets", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": true, + "owner": false, + "identifiableObject": true, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "href": "https://debug.dhis2.org/dev/api/42/schemas/legendSet", + "relativeApiEndpoint": "/legendSets", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/legendSets", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "programs": { + "klass": "java.util.Set", + "propertyType": "COLLECTION", + "itemKlass": "org.hisp.dhis.program.Program", + "itemPropertyType": "REFERENCE", + "name": "program", + "fieldName": "programs", + "persisted": true, + "collectionName": "programs", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": true, + "ordered": false, + "owner": false, + "identifiableObject": true, + "nameableObject": true, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "cascade": "none", + "manyToMany": true, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "owningRole": "org.hisp.dhis.program.Program.organisationUnits", + "inverseRole": "org.hisp.dhis.organisationunit.OrganisationUnit.programs", + "href": "https://debug.dhis2.org/dev/api/42/schemas/program", + "relativeApiEndpoint": "/programs", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/programs", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "shortName": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "shortName", + "fieldName": "shortName", + "persisted": true, + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": true, + "length": 50, + "max": 50, + "min": 1, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": true, + "translationKey": "SHORT_NAME", + "i18nTranslationKey": "short_name", + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "favorite": { + "klass": "java.lang.Boolean", + "propertyType": "BOOLEAN", + "name": "favorite", + "fieldName": "favorite", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "dimensionItemType": { + "klass": "org.hisp.dhis.common.DimensionItemType", + "propertyType": "CONSTANT", + "name": "dimensionItemType", + "fieldName": "dimensionItemType", + "persisted": false, + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "constants": [ + "DATA_ELEMENT", + "DATA_ELEMENT_OPERAND", + "INDICATOR", + "REPORTING_RATE", + "PROGRAM_DATA_ELEMENT", + "PROGRAM_ATTRIBUTE", + "PROGRAM_INDICATOR", + "PERIOD", + "ORGANISATION_UNIT", + "CATEGORY_OPTION", + "OPTION_GROUP", + "DATA_ELEMENT_GROUP", + "ORGANISATION_UNIT_GROUP", + "CATEGORY_OPTION_GROUP", + "EXPRESSION_DIMENSION_ITEM", + "SUBEXPRESSION_DIMENSION_ITEM" + ], + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "favorites": { + "klass": "java.util.Set", + "propertyType": "COLLECTION", + "itemKlass": "java.lang.String", + "itemPropertyType": "TEXT", + "name": "favorite", + "fieldName": "favorites", + "persisted": false, + "collectionName": "favorites", + "collectionWrapping": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": true, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "aggregationType": { + "klass": "org.hisp.dhis.analytics.AggregationType", + "propertyType": "CONSTANT", + "name": "aggregationType", + "fieldName": "aggregationType", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "constants": [ + "SUM", + "AVERAGE", + "AVERAGE_SUM_ORG_UNIT", + "LAST", + "LAST_AVERAGE_ORG_UNIT", + "LAST_LAST_ORG_UNIT", + "LAST_IN_PERIOD", + "LAST_IN_PERIOD_AVERAGE_ORG_UNIT", + "FIRST", + "FIRST_AVERAGE_ORG_UNIT", + "FIRST_FIRST_ORG_UNIT", + "COUNT", + "STDDEV", + "VARIANCE", + "MIN", + "MAX", + "MIN_SUM_ORG_UNIT", + "MAX_SUM_ORG_UNIT", + "NONE", + "CUSTOM", + "DEFAULT" + ], + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "access": { + "klass": "org.hisp.dhis.security.acl.Access", + "propertyType": "COMPLEX", + "name": "access", + "fieldName": "access", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": true, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "FALSE", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "code": { + "klass": "java.lang.String", + "propertyType": "IDENTIFIER", + "name": "code", + "fieldName": "code", + "persisted": true, + "description": "The unique code for this Object.", + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": true, + "required": false, + "length": 50, + "max": 50, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "displayName": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "displayName", + "fieldName": "displayName", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "contactPerson": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "contactPerson", + "fieldName": "contactPerson", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "max": 255, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "description": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "description", + "fieldName": "description", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 2147483647, + "max": 2147483647, + "min": 1, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": true, + "translationKey": "DESCRIPTION", + "i18nTranslationKey": "description", + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "displayShortName": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "displayShortName", + "fieldName": "displayShortName", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "queryMods": { + "klass": "org.hisp.dhis.common.QueryModifiers", + "propertyType": "COMPLEX", + "name": "queryMods", + "fieldName": "queryMods", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 1.7976931348623157e308, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "formName": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "formName", + "fieldName": "formName", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 2147483647, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "openingDate": { + "klass": "java.util.Date", + "propertyType": "DATE", + "name": "openingDate", + "fieldName": "openingDate", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": true, + "length": 255, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "email": { + "klass": "java.lang.String", + "propertyType": "EMAIL", + "name": "email", + "fieldName": "email", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 150, + "max": 150, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "address": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "address", + "fieldName": "address", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "max": 255, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "dimensionItem": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "dimensionItem", + "fieldName": "dimensionItem", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "memberCount": { + "klass": "java.lang.Integer", + "propertyType": "INTEGER", + "name": "memberCount", + "fieldName": "memberCount", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "max": 2147483647, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "leaf": { + "klass": "java.lang.Boolean", + "propertyType": "BOOLEAN", + "name": "leaf", + "fieldName": "leaf", + "persisted": false, + "attribute": true, + "simple": true, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "url": { + "klass": "java.lang.String", + "propertyType": "URL", + "name": "url", + "fieldName": "url", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "max": 255, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "closedDate": { + "klass": "java.util.Date", + "propertyType": "DATE", + "name": "closedDate", + "fieldName": "closedDate", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "createdBy": { + "klass": "org.hisp.dhis.user.User", + "propertyType": "REFERENCE", + "name": "createdBy", + "fieldName": "createdBy", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": true, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 255, + "cascade": "none", + "manyToMany": false, + "oneToOne": false, + "manyToOne": true, + "oneToMany": false, + "owningRole": "org.hisp.dhis.organisationunit.OrganisationUnit.createdBy", + "href": "https://debug.dhis2.org/dev/api/42/schemas/user", + "relativeApiEndpoint": "/users", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/users", + "translatable": false, + "gistPreferences": { + "included": "FALSE", + "transformation": "AUTO" + }, + "propertyTransformer": true + }, + "legendSet": { + "klass": "org.hisp.dhis.legend.LegendSet", + "propertyType": "REFERENCE", + "name": "legendSet", + "fieldName": "legendSet", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": true, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": false, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "href": "https://debug.dhis2.org/dev/api/42/schemas/legendSet", + "relativeApiEndpoint": "/legendSets", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/legendSets", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "comment": { + "klass": "java.lang.String", + "propertyType": "TEXT", + "name": "comment", + "fieldName": "comment", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": true, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 2147483647, + "max": 2147483647, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "geometry": { + "klass": "org.locationtech.jts.geom.Geometry", + "propertyType": "COMPLEX", + "name": "geometry", + "fieldName": "geometry", + "persisted": true, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": true, + "identifiableObject": false, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "length": 131072, + "max": 131072, + "min": 0, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "translatable": false, + "gistPreferences": { + "included": "FALSE", + "transformation": "AUTO" + }, + "propertyTransformer": false + }, + "user": { + "klass": "org.hisp.dhis.user.User", + "propertyType": "REFERENCE", + "name": "user", + "fieldName": "user", + "persisted": false, + "namespace": "http://dhis2.org/schema/dxf/2.0", + "attribute": false, + "simple": false, + "collection": false, + "ordered": false, + "owner": false, + "identifiableObject": true, + "nameableObject": false, + "embeddedObject": false, + "analyticalObject": false, + "readable": true, + "writable": true, + "unique": false, + "required": false, + "manyToMany": false, + "oneToOne": false, + "manyToOne": false, + "oneToMany": false, + "href": "https://debug.dhis2.org/dev/api/42/schemas/user", + "relativeApiEndpoint": "/users", + "apiEndpoint": "https://debug.dhis2.org/dev/api/42/users", + "translatable": false, + "gistPreferences": { + "included": "AUTO", + "transformation": "AUTO" + }, + "propertyTransformer": true + } + }, + "translatable": true +} diff --git a/src/app/LoadApp.spec.tsx b/src/app/LoadApp.spec.tsx index e71167a0..7e481dee 100644 --- a/src/app/LoadApp.spec.tsx +++ b/src/app/LoadApp.spec.tsx @@ -56,7 +56,7 @@ describe('LoadApp', () => { expect(setSchemaMock.mock.lastCall).toMatchSnapshot() }) - it('should set the current useer removing any duplicate authorities', async () => { + it('should set the current user removing any duplicate authorities', async () => { expect(setUserMock.mock.lastCall[0]).toEqual({ name: 'dhis2 user', authorities: new Set(['auth1', 'auth2-duplicated', 'auth3']), diff --git a/src/components/sectionList/listActions/DeleteAction.tsx b/src/components/sectionList/listActions/DeleteAction.tsx index 01b952b2..04975263 100644 --- a/src/components/sectionList/listActions/DeleteAction.tsx +++ b/src/components/sectionList/listActions/DeleteAction.tsx @@ -92,7 +92,7 @@ function ConfirmationDialog({ const errorReports = deleteModelMutation.error?.details?.response?.errorReports return ( - + {i18n.t( 'Are you sure that you want to delete this {{modelType}}?', diff --git a/src/components/sectionList/listActions/SectionListActions.tsx b/src/components/sectionList/listActions/SectionListActions.tsx index a2ba3e9d..7d8be85e 100644 --- a/src/components/sectionList/listActions/SectionListActions.tsx +++ b/src/components/sectionList/listActions/SectionListActions.tsx @@ -20,7 +20,11 @@ import { DeleteAction } from './DeleteAction' import css from './SectionListActions.module.css' export const ListActions = ({ children }: React.PropsWithChildren) => { - return
{children}
+ return ( +
+ {children} +
+ ) } export const ActionEdit = ({ modelId }: { modelId: string }) => { diff --git a/src/pages/organisationUnits/List.spec.tsx b/src/pages/organisationUnits/List.spec.tsx new file mode 100644 index 00000000..04b56f48 --- /dev/null +++ b/src/pages/organisationUnits/List.spec.tsx @@ -0,0 +1,491 @@ +import { FetchError } from '@dhis2/app-runtime' +import { faker } from '@faker-js/faker' +import { + fireEvent, + render, + waitFor, + waitForElementToBeRemoved, + within, +} from '@testing-library/react' +import React from 'react' +import organisationUnitsSchemaMock from '../../__mocks__/schema/organisationUnitsSchema.json' +import { getRelativeTime, ModelSchemas, SECTIONS_MAP } from '../../lib' +import { useSchemaStore } from '../../lib/schemas/schemaStore' +import { useCurrentUserStore } from '../../lib/user/currentUserStore' +import { testAccess, testOrgUnit, testPager } from '../../testUtils/builders' +import TestComponentWithRouter, { + CustomData, +} from '../../testUtils/TestComponentWithRouter' +import type { OrganisationUnit } from '../../types/generated' +import { Component as OrgUnitsList } from './List' + +const error404 = new FetchError({ + type: 'unknown', + message: '404 not found', + details: { httpStatusCode: 404 } as FetchError['details'], +}) + +const defaultUserDataStoreData = () => Promise.reject(new FetchError(error404)) + +const deleteOrgUnitMock = jest.fn() +const renderList = async ({ + rootOrgUnits = [testOrgUnit()] as Partial[], + otherOrgUnits = [] as Partial[], + userDataStore = defaultUserDataStoreData, +}) => { + const routeOptions = { + handle: { section: SECTIONS_MAP.organisationUnit }, + } + + const organisationUnits = [...otherOrgUnits, ...rootOrgUnits] + + useSchemaStore.getState().setSchemas({ + organisationUnit: organisationUnitsSchemaMock, + } as unknown as ModelSchemas) + + useCurrentUserStore.getState().setCurrentUser({ + organisationUnits: rootOrgUnits as OrganisationUnit[], + authorities: new Set(), + name: faker.person.fullName(), + email: faker.internet.email(), + settings: {}, + }) + + const result = render( + { + if (type === 'read') { + const regex = /:(\w+)$/ + const orgUnitFilter = + params.params.filter[0].match(regex)[1] + const filteredOrgUnits = organisationUnits.filter( + (ou) => + ou.id === orgUnitFilter || + ou.parent?.id === orgUnitFilter + ) + return { organisationUnits: filteredOrgUnits } + } + if (type === 'delete') { + deleteOrgUnitMock(params) + } + }, + userDataStore, + }} + routeOptions={routeOptions} + > + + + ) + + await waitForElementToBeRemoved(() => + result.queryByTestId('dhis2-uicore-circularloader') + ) + return result +} + +describe('Org Unit List', () => { + const originalWarn = console.warn + jest.spyOn(console, 'warn').mockImplementation((value) => { + if (!value.match(/No server timezone/)) { + originalWarn(value) + } + }) + + it('should show evey org unit in the right order', async () => { + const rootOrg1 = testOrgUnit({ level: 1, childCount: 2 }) + const rootOrg2 = testOrgUnit({ level: 2, childCount: 1 }) + + const root1Level2Child1 = testOrgUnit({ + level: 2, + ancestors: [rootOrg1], + parentId: rootOrg1.id, + childCount: 1, + }) + const root1Level2Child2 = testOrgUnit({ + level: 2, + ancestors: [rootOrg1], + parentId: rootOrg1.id, + childCount: 0, + }) + const root1Level3Child1 = testOrgUnit({ + level: 3, + ancestors: [rootOrg1, root1Level2Child1], + parentId: root1Level2Child1.id, + childCount: 0, + }) + const root2Level3Child = testOrgUnit({ + level: 3, + ancestors: [rootOrg2], + parentId: rootOrg2.id, + childCount: 0, + }) + + const screen = await renderList({ + rootOrgUnits: [rootOrg1, rootOrg2], + otherOrgUnits: [ + root1Level2Child1, + root1Level2Child2, + root1Level3Child1, + root2Level3Child, + ], + }) + + const tableRows = screen.getAllByTestId('dhis2-uicore-datatablerow') + expect(tableRows.length).toBe(6) + + expect(tableRows[0]).toHaveTextContent('Name') + expect(tableRows[0]).toHaveTextContent('Id') + expect(tableRows[0]).toHaveTextContent('Code') + expect(tableRows[0]).toHaveTextContent('Last updated') + expect(tableRows[0]).toHaveTextContent('Actions') + + expect(tableRows[1]).toHaveTextContent(rootOrg1.displayName!) + expect(tableRows[1]).toHaveTextContent(rootOrg1.id!) + expect(tableRows[1]).toHaveTextContent(rootOrg1.code!) + expect(tableRows[1]).toHaveTextContent( + getRelativeTime(new Date(rootOrg1.lastUpdated!)) + ) + + expect(tableRows[2]).toHaveTextContent(root1Level2Child1.displayName!) + expect(tableRows[2]).toHaveTextContent(root1Level2Child1.id!) + expect(tableRows[2]).toHaveTextContent(root1Level2Child1.code!) + expect(tableRows[2]).toHaveTextContent( + getRelativeTime(new Date(root1Level2Child1.lastUpdated!)) + ) + + expect(tableRows[3]).toHaveTextContent(root1Level2Child2.displayName!) + expect(tableRows[3]).toHaveTextContent(root1Level2Child2.id!) + expect(tableRows[3]).toHaveTextContent(root1Level2Child2.code!) + expect(tableRows[3]).toHaveTextContent( + getRelativeTime(new Date(root1Level2Child2.lastUpdated!)) + ) + + expect(tableRows[4]).toHaveTextContent(rootOrg2.displayName!) + expect(tableRows[4]).toHaveTextContent(rootOrg2.id!) + expect(tableRows[4]).toHaveTextContent(rootOrg2.code!) + expect(tableRows[4]).toHaveTextContent( + getRelativeTime(new Date(rootOrg2.lastUpdated!)) + ) + + expect(tableRows[5]).toHaveTextContent(root2Level3Child.displayName!) + expect(tableRows[5]).toHaveTextContent(root2Level3Child.id!) + expect(tableRows[5]).toHaveTextContent(root2Level3Child.code!) + expect(tableRows[5]).toHaveTextContent( + getRelativeTime(new Date(root2Level3Child.lastUpdated!)) + ) + }) + + it('should collapse visible tree nodes', async () => { + const rootOrg1 = testOrgUnit({ level: 1, childCount: 2 }) + const rootOrg2 = testOrgUnit({ level: 2, childCount: 1 }) + + const root1Level2Child1 = testOrgUnit({ + level: 2, + ancestors: [rootOrg1], + parentId: rootOrg1.id, + childCount: 1, + }) + const root1Level2Child2 = testOrgUnit({ + level: 2, + ancestors: [rootOrg1], + parentId: rootOrg1.id, + childCount: 0, + }) + const root1Level3Child1 = testOrgUnit({ + level: 3, + ancestors: [rootOrg1, root1Level2Child1], + parentId: root1Level2Child1.id, + childCount: 0, + }) + const root2Level3Child = testOrgUnit({ + level: 3, + ancestors: [rootOrg2], + parentId: rootOrg2.id, + childCount: 0, + }) + + const screen = await renderList({ + rootOrgUnits: [rootOrg1, rootOrg2], + otherOrgUnits: [ + root1Level2Child1, + root1Level2Child2, + root1Level3Child1, + root2Level3Child, + ], + }) + + const tableRows = screen.getAllByTestId('dhis2-uicore-datatablerow') + expect(tableRows.length).toBe(6) + + const rootOrg2Row = tableRows[4] + const rootOrg2RowExpandIcon = + within(rootOrg2Row).getByTestId('row-expand-icon') + fireEvent.click(rootOrg2RowExpandIcon) + + const tableRowsRefreshed = await screen.findAllByTestId( + 'dhis2-uicore-datatablerow' + ) + expect(tableRowsRefreshed.length).toBe(5) + + expect(tableRows[1]).toHaveTextContent(rootOrg1.displayName!) + expect(tableRows[2]).toHaveTextContent(root1Level2Child1.displayName!) + expect(tableRows[3]).toHaveTextContent(root1Level2Child2.displayName!) + expect(tableRows[4]).toHaveTextContent(rootOrg2.displayName!) + }) + + it('should expand a node tree', async () => { + const rootOrg1 = testOrgUnit({ level: 1, childCount: 2 }) + const rootOrg2 = testOrgUnit({ level: 2, childCount: 1 }) + + const root1Level2Child1 = testOrgUnit({ + level: 2, + ancestors: [rootOrg1], + parentId: rootOrg1.id, + childCount: 1, + }) + const root1Level2Child2 = testOrgUnit({ + level: 2, + ancestors: [rootOrg1], + parentId: rootOrg1.id, + childCount: 0, + }) + const root1Level3Child1 = testOrgUnit({ + level: 3, + ancestors: [rootOrg1, root1Level2Child1], + parentId: root1Level2Child1.id, + childCount: 0, + }) + const root2Level3Child = testOrgUnit({ + level: 3, + ancestors: [rootOrg2], + parentId: rootOrg2.id, + childCount: 0, + }) + + const screen = await renderList({ + rootOrgUnits: [rootOrg1, rootOrg2], + otherOrgUnits: [ + root1Level2Child1, + root1Level2Child2, + root1Level3Child1, + root2Level3Child, + ], + }) + + const tableRows = screen.getAllByTestId('dhis2-uicore-datatablerow') + expect(tableRows.length).toBe(6) + + const root1Level2Child1Row = tableRows[2] + const rootOrg2RowExpandIcon = + within(root1Level2Child1Row).getByTestId('row-expand-icon') + fireEvent.click(rootOrg2RowExpandIcon) + + let tableRowsRefreshed: any = [] + await waitFor(() => { + tableRowsRefreshed = screen.getAllByTestId( + 'dhis2-uicore-datatablerow' + ) + expect(tableRowsRefreshed.length).toBe(7) + }) + + expect(tableRowsRefreshed[1]).toHaveTextContent(rootOrg1.displayName!) + expect(tableRowsRefreshed[2]).toHaveTextContent( + root1Level2Child1.displayName! + ) + expect(tableRowsRefreshed[3]).toHaveTextContent( + root1Level3Child1.displayName! + ) + expect(tableRowsRefreshed[4]).toHaveTextContent( + root1Level2Child2.displayName! + ) + expect(tableRowsRefreshed[5]).toHaveTextContent(rootOrg2.displayName!) + expect(tableRowsRefreshed[6]).toHaveTextContent( + root2Level3Child.displayName! + ) + }) + + it('should show a clickable delete action when org unit can be deleted', async () => { + const rootOrg = testOrgUnit({ + level: 1, + childCount: 0, + access: testAccess({ deleteAccess: true }), + }) + + const screen = await renderList({ + rootOrgUnits: [rootOrg], + }) + + const tableRows = screen.getAllByTestId('dhis2-uicore-datatablerow') + expect(tableRows.length).toBe(2) + + expect(tableRows[1]).toHaveTextContent(rootOrg.displayName!) + const actionButton = within(tableRows[1]).getByTestId( + 'row-actions-menu-button' + ) + fireEvent.click(actionButton) + const actionsMenu = screen.getByTestId('row-actions-menu') + expect(actionsMenu).toBeVisible() + expect( + within(actionsMenu).getByText('Delete').closest('li') + ).not.toHaveClass('disabled') + }) + + it('should show a disabled delete action when org unit can not be deleted', async () => { + const rootOrg = testOrgUnit({ + level: 1, + childCount: 0, + access: testAccess({ deleteAccess: false }), + }) + + const screen = await renderList({ + rootOrgUnits: [rootOrg], + }) + + const tableRows = screen.getAllByTestId('dhis2-uicore-datatablerow') + expect(tableRows.length).toBe(2) + + expect(tableRows[1]).toHaveTextContent(rootOrg.displayName!) + const actionButton = within(tableRows[1]).getByTestId( + 'row-actions-menu-button' + ) + fireEvent.click(actionButton) + const actionsMenu = screen.getByTestId('row-actions-menu') + expect(actionsMenu).toBeVisible() + expect( + within(actionsMenu).getByText('Delete').closest('li') + ).toHaveClass('disabled') + }) + + it('delete an org unit when possible', async () => { + const rootOrg = testOrgUnit({ level: 1, childCount: 2 }) + const child1 = testOrgUnit({ + level: 2, + ancestors: [rootOrg], + parentId: rootOrg.id, + childCount: 0, + access: testAccess({ deleteAccess: true }), + }) + const child2 = testOrgUnit({ + level: 2, + ancestors: [rootOrg], + parentId: rootOrg.id, + childCount: 0, + }) + + const screen = await renderList({ + rootOrgUnits: [rootOrg], + otherOrgUnits: [child1, child2], + }) + + const tableRows = screen.getAllByTestId('dhis2-uicore-datatablerow') + expect(tableRows.length).toBe(4) + + expect(tableRows[2]).toHaveTextContent(child1.displayName!) + const actionButton = within(tableRows[2]).getByTestId( + 'row-actions-menu-button' + ) + fireEvent.click(actionButton) + const actionsMenu = screen.getByTestId('row-actions-menu') + expect(actionsMenu).toBeVisible() + fireEvent.click(within(actionsMenu).getByText('Delete')) + + const deleteConfirmationModal = await screen.findByTestId( + 'delete-confirmation-modal' + ) + expect(deleteConfirmationModal).toBeVisible() + + fireEvent.click( + within(deleteConfirmationModal).getByRole('button', { + name: 'Confirm deletion', + }) + ) + await waitFor(() => { + expect(deleteOrgUnitMock).toHaveBeenCalledWith( + expect.objectContaining({ id: child1.id }) + ) + }) + }) + + it('has a link to an org unit edit page in the row actions menu', async () => { + const rootOrg = testOrgUnit({ + level: 1, + childCount: 2, + access: testAccess({ deleteAccess: true }), + }) + const child1 = testOrgUnit({ + level: 2, + ancestors: [rootOrg], + parentId: rootOrg.id, + childCount: 0, + access: testAccess({ deleteAccess: true }), + }) + const child2 = testOrgUnit({ + level: 2, + ancestors: [rootOrg], + parentId: rootOrg.id, + childCount: 0, + }) + + const screen = await renderList({ + rootOrgUnits: [rootOrg], + otherOrgUnits: [child1, child2], + }) + + expect(screen.queryByText('Organisation unit management')).toBeVisible() + + const tableRows = screen.getAllByTestId('dhis2-uicore-datatablerow') + expect(tableRows.length).toBe(4) + + expect(tableRows[2]).toHaveTextContent(child1.displayName!) + const actionButton = within(tableRows[2]).getByTestId( + 'row-actions-menu-button' + ) + fireEvent.click(actionButton) + const actionsMenu = screen.getByTestId('row-actions-menu') + expect(actionsMenu).toBeVisible() + expect( + within(actionsMenu).getByText('Edit').closest('a') + ).toHaveAttribute('href', `/organisationUnits/${child1.id}`) + }) + + it('has a link to an org unit edit page outside the action menu', async () => { + const rootOrg = testOrgUnit({ + level: 1, + childCount: 2, + access: testAccess({ deleteAccess: true }), + }) + const child1 = testOrgUnit({ + level: 2, + ancestors: [rootOrg], + parentId: rootOrg.id, + childCount: 0, + access: testAccess({ deleteAccess: true }), + }) + const child2 = testOrgUnit({ + level: 2, + ancestors: [rootOrg], + parentId: rootOrg.id, + childCount: 0, + }) + + const screen = await renderList({ + rootOrgUnits: [rootOrg], + otherOrgUnits: [child1, child2], + }) + + expect(screen.queryByText('Organisation unit management')).toBeVisible() + + const tableRows = screen.getAllByTestId('dhis2-uicore-datatablerow') + expect(tableRows.length).toBe(4) + + expect(tableRows[2]).toHaveTextContent(child1.displayName!) + const actionCell = within(tableRows[2]).getByTestId('row-actions') + const links = within(actionCell).getAllByRole('link') + expect(links[0]).toHaveAttribute( + 'href', + `/organisationUnits/${child1.id}` + ) + }) +}) diff --git a/src/pages/organisationUnits/list/OrganisationUnitList.tsx b/src/pages/organisationUnits/list/OrganisationUnitList.tsx index 60f4d19a..7c4ffc9d 100644 --- a/src/pages/organisationUnits/list/OrganisationUnitList.tsx +++ b/src/pages/organisationUnits/list/OrganisationUnitList.tsx @@ -114,6 +114,7 @@ export const OrganisationUnitList = () => { const { rootOrgUnits, flatOrgUnits } = useMemo(() => { const rootOrgUnits = new Map() //gather all loaded orgUnits and their ancestors and deduplicate them + const deduplicatedOrgUnits = queries .concat(orgUnitFiltered) .flatMap((q) => { diff --git a/src/pages/organisationUnits/list/OrganisationUnitListActions.tsx b/src/pages/organisationUnits/list/OrganisationUnitListActions.tsx index 7cfdb469..09aceae6 100644 --- a/src/pages/organisationUnits/list/OrganisationUnitListActions.tsx +++ b/src/pages/organisationUnits/list/OrganisationUnitListActions.tsx @@ -77,6 +77,7 @@ const OrganisationUnitActionMore = ({ small secondary onClick={() => setOpen(!open)} + dataTest="row-actions-menu-button" icon={} /> {open && ( @@ -85,6 +86,7 @@ const OrganisationUnitActionMore = ({ placement="bottom-end" reference={ref} onClickOutside={() => setOpen(false)} + dataTest="row-actions-menu" > const TestComponentWithRouter = ({ diff --git a/src/testUtils/builders.ts b/src/testUtils/builders.ts new file mode 100644 index 00000000..a82d9b84 --- /dev/null +++ b/src/testUtils/builders.ts @@ -0,0 +1,91 @@ +import { faker } from '@faker-js/faker' +import { OrganisationUnit, User } from '../types/generated' + +export const randomDhis2Id = () => + faker.helpers.fromRegExp(/[a-zA-Z]{1}[a-zA-Z0-9]{10}/) + +export const testPager = ({ + page = faker.number.int({ min: 0, max: 5 }), + total = faker.number.int({ min: 0, max: 50 }), + pageSize = 50, + pageCount = faker.number.int({ min: 0, max: 5 }), +} = {}) => ({ + page, + total, + pageSize, + pageCount, +}) + +export const testAccess = ({ + deleteAccess = faker.datatype.boolean(), + externalizeAccess = faker.datatype.boolean(), + manageAccess = faker.datatype.boolean(), + readAccess = faker.datatype.boolean(), + updateAccess = faker.datatype.boolean(), + writeAccess = faker.datatype.boolean(), + readDataAcess = faker.datatype.boolean(), + writeDataAccess = faker.datatype.boolean(), +} = {}) => ({ + data: { + read: readDataAcess, + write: writeDataAccess, + }, + delete: deleteAccess, + externalize: externalizeAccess, + manage: manageAccess, + read: readAccess, + update: updateAccess, + write: writeAccess, +}) + +export const testUser = ({ + id = randomDhis2Id(), + code = null, + name = faker.person.fullName(), + username = faker.internet.userName(), +} = {}) => + ({ + id, + code, + name, + displayName: name, + username, + } as User) + +export const testOrgUnit = ({ + id = randomDhis2Id(), + code = faker.string.alphanumeric(6), + name = faker.location.city(), + created = faker.date.past().toUTCString(), + lastUpdated = faker.date.past().toUTCString(), + createdBy = testUser(), + lastUpdatedBy = testUser(), + parentId = null as string | null, + ancestors = [] as Partial[], + level = null as number | null, + childCount = 0, + access = testAccess(), +} = {}) => + ({ + code, + name, + created: created, + lastUpdated, + createdBy, + lastUpdatedBy, + sharing: {}, + shortName: name.slice(0, 5), + parent: parentId + ? { + id: parentId, + } + : undefined, + path: `/${id}`, + displayName: name, + href: faker.internet.url(), + id, + level: level || ancestors.length, + ancestors, + childCount, + access, + } as Partial) diff --git a/src/types/generated/models.ts b/src/types/generated/models.ts index b44138ea..42d47c20 100644 --- a/src/types/generated/models.ts +++ b/src/types/generated/models.ts @@ -6316,7 +6316,7 @@ export type OrganisationUnit = { phoneNumber: string programs: Array queryMods: QueryModifiers - sharing: Sharing + sharing: Sharing | {} shortName: string translations: Array type: string @@ -9484,20 +9484,23 @@ export type UpdateFollowUpForDataValuesRequest = { } export type User = { + id: string + code: string | null + displayName: string + username: string + name: string access: Access accountExpiry: string attributeValues: Array avatar: FileResource birthday: string catDimensionConstraints: Array - code: string cogsDimensionConstraints: Array created: string createdBy: User dataViewMaxOrganisationUnitLevel: number dataViewOrganisationUnits: Array disabled: boolean - displayName: string education: string email: string employer: string @@ -9508,7 +9511,6 @@ export type User = { firstName: string gender: string href: string - id: string interests: string introduction: string invitation: boolean @@ -9539,7 +9541,6 @@ export type User = { userCredentials: UserCredentialsDto userGroups: Array userRoles: Array - username: string welcomeMessage: string whatsApp: string } diff --git a/yarn.lock b/yarn.lock index 31430535..baae26f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2415,6 +2415,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@faker-js/faker@^8.4.1": + version "8.4.1" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.4.1.tgz#5d5e8aee8fce48f5e189bf730ebd1f758f491451" + integrity sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" From 84cfd3eb8d5161b3ee7d47779fae88bd13790021 Mon Sep 17 00:00:00 2001 From: Flaminia Date: Thu, 12 Sep 2024 05:50:31 -0700 Subject: [PATCH 04/11] feat: remove select all checkbox from org list * feat: remove select all checkbox from org list * feat: disable ability to autocheck child when parent is selected this is because with multi pages we will never be able to select all the childs --- src/components/sectionList/SectionList.tsx | 20 +++++++++++-------- .../list/OrganisationUnitList.tsx | 3 +-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/components/sectionList/SectionList.tsx b/src/components/sectionList/SectionList.tsx index 1abb07e7..d6c7e863 100644 --- a/src/components/sectionList/SectionList.tsx +++ b/src/components/sectionList/SectionList.tsx @@ -16,7 +16,7 @@ import { SelectedColumns } from './types' type SectionListProps = { headerColumns: SelectedColumns - onSelectAll: (checked: boolean) => void + onSelectAll?: (checked: boolean) => void allSelected?: boolean } @@ -31,13 +31,17 @@ export const SectionList = ({ - - onSelectAll(checked) - } - /> + {onSelectAll && ( + + onSelectAll!(checked) + } + /> + )} {headerColumns.length > 0 && ( diff --git a/src/pages/organisationUnits/list/OrganisationUnitList.tsx b/src/pages/organisationUnits/list/OrganisationUnitList.tsx index 7c4ffc9d..20ca5a4d 100644 --- a/src/pages/organisationUnits/list/OrganisationUnitList.tsx +++ b/src/pages/organisationUnits/list/OrganisationUnitList.tsx @@ -192,6 +192,7 @@ export const OrganisationUnitList = () => { state: { expanded, }, + enableSubRowSelection: false, }) return ( @@ -200,12 +201,10 @@ export const OrganisationUnitList = () => { ({ label: h.column.columnDef.header as string, path: h.column.id, }))} - onSelectAll={() => table.toggleAllRowsSelected()} > Date: Thu, 12 Sep 2024 08:17:49 -0700 Subject: [PATCH 05/11] feat: org list deselect all + multi select actions * feat: add multi select actions with the ability to download selected org units * feat: make org unit deselect all button work --- .../list/OrganisationUnitList.module.css | 23 ++++++ .../list/OrganisationUnitList.tsx | 77 +++++++++++-------- 2 files changed, 69 insertions(+), 31 deletions(-) diff --git a/src/pages/organisationUnits/list/OrganisationUnitList.module.css b/src/pages/organisationUnits/list/OrganisationUnitList.module.css index e2c95ff7..b841b32f 100644 --- a/src/pages/organisationUnits/list/OrganisationUnitList.module.css +++ b/src/pages/organisationUnits/list/OrganisationUnitList.module.css @@ -1,3 +1,26 @@ .expandButton { border: 0 !important; } + +.listDetailsWrapper { + display: grid; + grid-template-columns: 1fr auto; + grid-template-rows: auto 1fr; + grid-template-areas: + 'header details' + 'list details'; + margin-top: var(--spacers-dp8); +} + +@media (max-width: 1200px) { + .listDetailsWrapper { + display: grid; + grid-template-rows: auto; + grid-template-columns: none; + grid-template-areas: + 'header' + 'list' + 'details'; + margin-top: var(--spacers-dp8); + } +} diff --git a/src/pages/organisationUnits/list/OrganisationUnitList.tsx b/src/pages/organisationUnits/list/OrganisationUnitList.tsx index 20ca5a4d..a002d8e3 100644 --- a/src/pages/organisationUnits/list/OrganisationUnitList.tsx +++ b/src/pages/organisationUnits/list/OrganisationUnitList.tsx @@ -12,10 +12,11 @@ import { IdentifiableFilter, SectionList } from '../../../components' import { useModelListView } from '../../../components/sectionList/listView' import { ModelValue } from '../../../components/sectionList/modelValue/ModelValue' import { SectionListTitle } from '../../../components/sectionList/SectionListTitle' -import { ToolbarNormal } from '../../../components/sectionList/toolbar/ToolbarNormal' +import { Toolbar } from '../../../components/sectionList/toolbar' import { SchemaName, useSchema, useSectionListFilter } from '../../../lib' import { getFieldFilter } from '../../../lib/models/path' import { useCurrentUserRootOrgUnits } from '../../../lib/user/currentUserStore' +import css from './OrganisationUnitList.module.css' import { OrganisationUnitListMessage } from './OrganisationUnitListMessage' import { OrganisationUnitRow } from './OrganisationUnitRow' import { @@ -199,39 +200,53 @@ export const OrganisationUnitList = () => {
- - ({ - label: h.column.columnDef.header as string, - path: h.column.id, - }))} - > - + r.id) + ) + } + onDeselectAll={() => {table.resetRowSelection(true)}} /> - {table.getRowModel().rows.map((row) => ( - - setParentIdsToLoad((prev) => { - const { [id]: wasShown, ...withoutId } = prev - if (wasShown) { - return withoutId - } - return { ...prev, [id]: true } - }) - } - showAllActive={ - parentIdsToLoad[row.original.id] === true - } + ({ + label: h.column.columnDef.header as string, + path: h.column.id, + }))} + > + - ))} - + {table.getRowModel().rows.map((row) => ( + + setParentIdsToLoad((prev) => { + const { [id]: wasShown, ...withoutId } = + prev + if (wasShown) { + return withoutId + } + return { ...prev, [id]: true } + }) + } + showAllActive={ + parentIdsToLoad[row.original.id] === true + } + isFiltering={isFiltering} + fetchNextPage={fetchNextPage} + /> + ))} + +
) } From 66216c4c4c7beb11411e790fd804a0761e980b19 Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Sat, 28 Sep 2024 14:09:42 +0200 Subject: [PATCH 06/11] feat(categories): category forms and form refactor (#407) * fix: add utility type for picking based on field-filters * refactor: simplify PickWithFieldFilters * fix: simplify createJsonpatchOperation and formcontents * fix: simplify getAllAttributes * fix: fix PickWithFieldFilters * wip: simplify editform * fix: implement basic category form * feat: Edit and New form base * fix: get defaults using zod * refactor: add defaultformcontents for new * feat(form): caregory forms, formbase * chore: fix eslint warnings * fix: cleanup * fix(category-form): add options-transfer, generic ModelTransfer * fix: improve model-transfer * fix: fix lint and build issues * fix(model-transferfield): expose filterPlaceholder * fix(formbase): allow support for no attributes * fix(formcontents): fix new form layout * fix(types): prettify PickWithFieldFilter result-type * fix(list): add filter and columns descriptors to category * fix: test * refactor: add common zod schemas * fix: format * fix(translation): add missing translations * fix: improve modeltransfer types * fix: upgrade upload-artifact action * fix(validation): catch async validation - prevents locking up form * fix(form): improve form notice box * style: run prettier * fix: fix lint * chore: upgrade download-artifact action --- .github/workflows/dhis2-verify-app.yml | 4 +- i18n/en.pot | 74 +++++++-- src/components/form/DefaultFormContents.tsx | 71 +++++---- .../form/DefaultFormErrorNotice.module.css | 3 + .../form/DefaultFormErrorNotice.tsx | 138 +++++++++++++++++ src/components/form/FormBase.tsx | 65 ++++++++ .../attributes/useCustomAttributesQuery.ts | 37 +++-- .../helpers/HorizontalFieldGroup.module.css | 4 + .../form/helpers/HorizontalFieldGroup.tsx | 18 +++ src/components/form/helpers/index.ts | 1 + src/components/form/index.ts | 4 +- .../ModelTransfer/ModelTransfer.module.css | 12 ++ .../ModelTransfer/ModelTransfer.tsx | 140 ++++++++++++++++++ .../ModelTransfer/ModelTransferField.tsx | 121 +++++++++++++++ .../ModelTransfer/index.ts | 2 + src/components/metadataFormControls/index.ts | 1 + .../sectionList/filters/DynamicFilters.tsx | 2 + .../filterSelectors/ConstantFilters.tsx | 24 ++- src/lib/constants/translatedModelConstants.ts | 6 + .../constants/translatedModelProperties.ts | 2 + .../composeAsyncValidators.ts | 11 +- src/lib/form/createFormError.ts | 11 ++ src/lib/form/createJsonPatchOperations.ts | 15 +- src/lib/form/index.ts | 4 +- src/lib/form/modelFormSchemas.ts | 36 +++++ src/lib/form/useCreateModel.ts | 23 +++ src/lib/form/useOnSubmit.ts | 95 ++++++++++++ src/lib/form/validate.ts | 6 +- src/lib/models/attributes.ts | 25 ++-- src/lib/query/useBoundQueryFn.ts | 21 ++- src/lib/routeUtils/routePaths.ts | 7 +- src/lib/sectionList/filters/filterConfig.tsx | 4 +- .../filters/parseFiltersToQueryParams.ts | 7 +- .../listViews/sectionListViewsConfig.ts | 11 +- src/lib/zod/getDefaults.ts | 16 ++ src/lib/zod/index.ts | 1 + src/pages/DefaultSectionList.tsx | 6 +- src/pages/categories/Edit.tsx | 57 +++++++ src/pages/categories/List.tsx | 6 + src/pages/categories/New.tsx | 24 +++ .../categories/form/CategoryFormFields.tsx | 115 ++++++++++++++ src/pages/categories/form/categorySchema.ts | 27 ++++ src/pages/categories/form/index.ts | 1 + src/pages/dataElementGroupSets/Edit.tsx | 23 ++- src/pages/dataElementGroupSets/New.tsx | 4 +- src/pages/dataElementGroups/Edit.tsx | 23 ++- src/pages/dataElementGroups/New.tsx | 4 +- src/pages/dataElements/Edit.tsx | 12 +- src/pages/dataElements/New.tsx | 4 +- .../list/OrganisationUnitList.tsx | 4 +- src/types/generated/index.ts | 1 + src/types/generated/pickWithFieldFilters.ts | 77 ++++++++++ src/types/generated/utility.ts | 8 +- src/types/query.ts | 14 ++ 54 files changed, 1305 insertions(+), 127 deletions(-) create mode 100644 src/components/form/DefaultFormErrorNotice.module.css create mode 100644 src/components/form/DefaultFormErrorNotice.tsx create mode 100644 src/components/form/FormBase.tsx create mode 100644 src/components/form/helpers/HorizontalFieldGroup.module.css create mode 100644 src/components/form/helpers/HorizontalFieldGroup.tsx create mode 100644 src/components/form/helpers/index.ts create mode 100644 src/components/metadataFormControls/ModelTransfer/ModelTransfer.module.css create mode 100644 src/components/metadataFormControls/ModelTransfer/ModelTransfer.tsx create mode 100644 src/components/metadataFormControls/ModelTransfer/ModelTransferField.tsx create mode 100644 src/components/metadataFormControls/ModelTransfer/index.ts create mode 100644 src/lib/form/createFormError.ts create mode 100644 src/lib/form/modelFormSchemas.ts create mode 100644 src/lib/form/useCreateModel.ts create mode 100644 src/lib/form/useOnSubmit.ts create mode 100644 src/lib/zod/getDefaults.ts create mode 100644 src/pages/categories/Edit.tsx create mode 100644 src/pages/categories/List.tsx create mode 100644 src/pages/categories/New.tsx create mode 100644 src/pages/categories/form/CategoryFormFields.tsx create mode 100644 src/pages/categories/form/categorySchema.ts create mode 100644 src/pages/categories/form/index.ts create mode 100644 src/types/generated/pickWithFieldFilters.ts diff --git a/.github/workflows/dhis2-verify-app.yml b/.github/workflows/dhis2-verify-app.yml index 34f9b047..8a3ef598 100644 --- a/.github/workflows/dhis2-verify-app.yml +++ b/.github/workflows/dhis2-verify-app.yml @@ -30,7 +30,7 @@ jobs: - name: Build run: yarn d2-app-scripts build - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: app-build path: | @@ -119,7 +119,7 @@ jobs: with: node-version: 20 - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v4 with: name: app-build diff --git a/i18n/en.pot b/i18n/en.pot index d68cf807..428511c1 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2024-08-19T17:31:35.987Z\n" -"PO-Revision-Date: 2024-08-19T17:31:35.987Z\n" +"POT-Creation-Date: 2024-08-28T01:15:41.705Z\n" +"PO-Revision-Date: 2024-08-28T01:15:41.705Z\n" msgid "schemas" msgstr "schemas" @@ -72,6 +72,12 @@ msgstr "Something went wrong when submitting the form" msgid "Save and close" msgstr "Save and close" +msgid "Exit without saving" +msgstr "Exit without saving" + +msgid "Create {{modelName}} " +msgstr "Create {{modelName}} " + msgid "" msgstr "" @@ -123,6 +129,18 @@ msgstr "Filter data elements" msgid "Filter legend sets" msgstr "Filter legend sets" +msgid "Filter available items" +msgstr "Filter available items" + +msgid "Filter selected items" +msgstr "Filter selected items" + +msgid "Refresh list" +msgstr "Refresh list" + +msgid "Add new" +msgstr "Add new" + msgid "Option set" msgstr "Option set" @@ -789,6 +807,9 @@ msgstr "Image" msgid "GeoJSON" msgstr "GeoJSON" +msgid "Disaggregation" +msgstr "Disaggregation" + msgid "Favorite" msgstr "Favorite" @@ -810,14 +831,50 @@ msgstr "Owner" msgid "Zero is significant" msgstr "Zero is significant" +msgid "Data dimension type" +msgstr "Data dimension type" + msgid "This field requires a unique value, please choose another one" msgstr "This field requires a unique value, please choose another one" msgid "Required" msgstr "Required" -msgid "Exit without saving" -msgstr "Exit without saving" +msgid "Basic information" +msgstr "Basic information" + +msgid "Set up the basic information for this category." +msgstr "Set up the basic information for this category." + +msgid "Explain the purpose of this category." +msgstr "Explain the purpose of this category." + +msgid "Data configuration" +msgstr "Data configuration" + +msgid "Choose how this category will be used to capture and analyze" +msgstr "Choose how this category will be used to capture and analyze" + +msgid "Use as data dimension" +msgstr "Use as data dimension" + +msgid "Category will be available to the analytics as another dimension" +msgstr "Category will be available to the analytics as another dimension" + +msgid "Choose the category options to include in this category." +msgstr "Choose the category options to include in this category." + +msgid "Available category options" +msgstr "Available category options" + +msgid "Selected category options" +msgstr "Selected category options" + +msgid "Filter available category options" +msgstr "Filter available category options" + +msgid "Filter selected category options" +msgstr "Filter selected category options" msgid "Create data element group" msgstr "Create data element group" @@ -831,15 +888,6 @@ msgstr "Data dimension" msgid "Selected data element groups" msgstr "Selected data element groups" -msgid "Refresh list" -msgstr "Refresh list" - -msgid "Add new" -msgstr "Add new" - -msgid "Basic information" -msgstr "Basic information" - msgid "Set up the information for this data element group" msgstr "Set up the information for this data element group" diff --git a/src/components/form/DefaultFormContents.tsx b/src/components/form/DefaultFormContents.tsx index 76322b8b..c200b1e4 100644 --- a/src/components/form/DefaultFormContents.tsx +++ b/src/components/form/DefaultFormContents.tsx @@ -1,50 +1,36 @@ import i18n from '@dhis2/d2-i18n' -import { NoticeBox } from '@dhis2/ui' -import React, { useEffect, useRef } from 'react' +import React from 'react' +import { useFormState } from 'react-final-form' import { useNavigate } from 'react-router-dom' import { getSectionPath } from '../../lib' import { ModelSection } from '../../types' import { StandardFormSection, StandardFormActions } from '../standardForm' import classes from './DefaultFormContents.module.css' +import { DefaultFormErrorNotice } from './DefaultFormErrorNotice' -export function DefaultFormContents({ +export function DefaultEditFormContents({ children, section, - submitError, - submitting, }: { children: React.ReactNode section: ModelSection - submitting: boolean - submitError?: string }) { - const formErrorRef = useRef(null) + const { submitting } = useFormState({ + subscription: { submitting: true }, + }) const navigate = useNavigate() const listPath = `/${getSectionPath(section)}` - useEffect(() => { - if (submitError) { - formErrorRef.current?.scrollIntoView({ behavior: 'smooth' }) - } - }, [submitError]) return ( <> -
{children}
- {submitError && ( +
+ {children} + -
- - {submitError} - -
+
- )} +
) } + +export function DefaultNewFormContents({ + section, + children, +}: { + children: React.ReactNode + section: ModelSection +}) { + const { submitting } = useFormState({ + subscription: { submitting: true }, + }) + + const navigate = useNavigate() + + const listPath = `/${getSectionPath(section)}` + + return ( +
+ {children} + + + + navigate(listPath)} + /> +
+ ) +} diff --git a/src/components/form/DefaultFormErrorNotice.module.css b/src/components/form/DefaultFormErrorNotice.module.css new file mode 100644 index 00000000..2bece296 --- /dev/null +++ b/src/components/form/DefaultFormErrorNotice.module.css @@ -0,0 +1,3 @@ +.noticeBox { + max-width: 640px; +} diff --git a/src/components/form/DefaultFormErrorNotice.tsx b/src/components/form/DefaultFormErrorNotice.tsx new file mode 100644 index 00000000..c5102749 --- /dev/null +++ b/src/components/form/DefaultFormErrorNotice.tsx @@ -0,0 +1,138 @@ +import i18n from '@dhis2/d2-i18n' +import { NoticeBox } from '@dhis2/ui' +import { FormState } from 'final-form' +import React, { useEffect, useRef } from 'react' +import { useFormState } from 'react-final-form' +import css from './DefaultFormErrorNotice.module.css' + +const formStateSubscriptions = { + errors: true, + submitError: true, + submitFailed: true, + hasValidationErrors: true, + hasSubmitErrors: true, + dirtySinceLastSubmit: true, +} + +type FormStateErrors = Pick< + FormState, + keyof typeof formStateSubscriptions +> + +export function DefaultFormErrorNotice() { + const partialFormState: FormStateErrors = useFormState({ + subscription: formStateSubscriptions, + }) + // only show after trying to submit + if ( + !partialFormState.submitFailed || + (partialFormState.submitFailed && partialFormState.dirtySinceLastSubmit) + ) { + return null + } + + if (partialFormState.hasValidationErrors) { + return + } + + if (partialFormState.hasSubmitErrors) { + return + } + return null +} + +const ValidationErrors = ({ + formStateErrors, +}: { + formStateErrors: FormStateErrors +}) => { + const ref = useRef(null) + useEffect(() => { + if (ref.current) { + ref.current.scrollIntoView({ behavior: 'smooth' }) + } + }, []) + return ( +
+ +

+ {i18n.t( + 'Some fields have validation errors. Please fix them before saving.' + )} +

+ {formStateErrors.errors && ( + + )} +
+
+ ) +} + +const ErrorList = ({ errors }: { errors: Record }) => { + const labels = getFieldLabelsBestEffort() + + return ( +
    + {Object.entries(errors).map(([key, value]) => { + return ( +
  • + + {labels.get(key) || key}: + + {value} +
  • + ) + })} +
+ ) +} + +const ServerSubmitError = ({ + formStateErrors, +}: { + formStateErrors: FormStateErrors +}) => { + const ref = useRef(null) + useEffect(() => { + if (ref.current) { + ref.current.scrollIntoView({ behavior: 'smooth' }) + } + }, []) + return ( +
+ +

{formStateErrors.submitError}

+
+
+ ) +} + +/** + * We don't have a good way to get the translated labels, so for now + * we get these from the DOM. This is a best-effort approach. + * TODO: Find a better way to get the labels, eg. by wrapping Field components + * in a generic component that can register fields with metadata such as labels. + */ +const getFieldLabelsBestEffort = () => { + const labels = Array.from(document.getElementsByTagName('label')) + .filter((elem) => elem.htmlFor) + .map((elem) => { + const fieldName = elem.htmlFor + const label = elem.firstChild?.textContent + ?.replace('(required)', '') + .trim() + return [fieldName, label] as const + }) + return new Map(labels) +} diff --git a/src/components/form/FormBase.tsx b/src/components/form/FormBase.tsx new file mode 100644 index 00000000..55acf870 --- /dev/null +++ b/src/components/form/FormBase.tsx @@ -0,0 +1,65 @@ +import { NoticeBox } from '@dhis2/ui' +import React, { useMemo } from 'react' +import { FormProps, Form as ReactFinalForm } from 'react-final-form' +import { + PartialAttributeValue, + getAllAttributeValues, +} from '../../lib/models/attributes' +import { LoadingSpinner } from '../loading/LoadingSpinner' +import { useCustomAttributesQuery } from './attributes' + +type MaybeModelWithAttributes = { + id?: string + attributeValues?: PartialAttributeValue[] | undefined +} + +type OwnProps> = { + initialValues: TValues | undefined + children: React.ReactNode + includeAttributes?: boolean +} + +type FormBaseProps = FormProps & OwnProps + +export function FormBase({ + children, + initialValues, + includeAttributes = true, + ...reactFinalFormProps +}: FormBaseProps) { + const customAttributes = useCustomAttributesQuery({ + enabled: includeAttributes, + }) + + const initialValuesWithAttributes = useMemo(() => { + if (!includeAttributes || !initialValues) { + return initialValues + } + return { + ...initialValues, + attributeValues: getAllAttributeValues( + initialValues.attributeValues || [], + customAttributes.data || [] + ), + } + }, [customAttributes.data, initialValues, includeAttributes]) + + if (customAttributes.error) { + return + } + + if (!initialValuesWithAttributes || customAttributes.loading) { + return + } + + return ( + + validateOnBlur={true} + initialValues={initialValuesWithAttributes} + render={({ handleSubmit }) => ( +
{children}
+ )} + {...reactFinalFormProps} + /> + ) +} diff --git a/src/components/form/attributes/useCustomAttributesQuery.ts b/src/components/form/attributes/useCustomAttributesQuery.ts index 97d2209e..bda6c250 100644 --- a/src/components/form/attributes/useCustomAttributesQuery.ts +++ b/src/components/form/attributes/useCustomAttributesQuery.ts @@ -1,19 +1,26 @@ import { useDataQuery } from '@dhis2/app-runtime' import { useMemo } from 'react' import { useSchemaSectionHandleOrThrow } from '../../../lib' -import { Attribute } from '../../../types/generated' +import { Attribute, PickWithFieldFilters } from '../../../types/generated' + +const attributeFields = [ + 'id', + 'mandatory', + 'displayFormName', + 'valueType', + 'optionSet[options[id,displayName,name,code]]', +] as const + +export type AttributeMetadata = PickWithFieldFilters< + Attribute, + typeof attributeFields +> const CUSTOM_ATTRIBUTES_QUERY = { attributes: { resource: 'attributes', params: ({ modelName }: Record) => ({ - fields: [ - 'id', - 'mandatory', - 'displayFormName', - 'valueType', - 'optionSet[options[id,displayName,name,code]]', - ], + fields: attributeFields.concat(), paging: false, filter: `${modelName}Attribute:eq:true`, }), @@ -22,15 +29,23 @@ const CUSTOM_ATTRIBUTES_QUERY = { interface QueryResponse { attributes: { - attributes: Attribute[] + attributes: AttributeMetadata[] } } -export function useCustomAttributesQuery() { +type UseCustomAttributesQueryOptions = { + enabled?: boolean +} +export function useCustomAttributesQuery({ + enabled = true, +}: UseCustomAttributesQueryOptions = {}) { const schemaSection = useSchemaSectionHandleOrThrow() const customAttributes = useDataQuery( CUSTOM_ATTRIBUTES_QUERY, - { variables: { modelName: schemaSection.name } } + { + lazy: !enabled, + variables: { modelName: schemaSection.name }, + } ) return useMemo( diff --git a/src/components/form/helpers/HorizontalFieldGroup.module.css b/src/components/form/helpers/HorizontalFieldGroup.module.css new file mode 100644 index 00000000..8479e4e0 --- /dev/null +++ b/src/components/form/helpers/HorizontalFieldGroup.module.css @@ -0,0 +1,4 @@ +.horizontalField div { + display: flex; + gap: var(--spacers-dp16); +} diff --git a/src/components/form/helpers/HorizontalFieldGroup.tsx b/src/components/form/helpers/HorizontalFieldGroup.tsx new file mode 100644 index 00000000..a90a0040 --- /dev/null +++ b/src/components/form/helpers/HorizontalFieldGroup.tsx @@ -0,0 +1,18 @@ +import { Field, FieldProps, FieldSet } from '@dhis2/ui' +import React from 'react' +import css from './HorizontalFieldGroup.module.css' + +export type HorizontalRadioGroupProps = FieldProps + +/* Note this can be simplified to use FieldGroup once FieldGroup className is fixed in UI */ +export const HorizontalFieldGroup = ({ + className, + children, + ...fieldProps +}: HorizontalRadioGroupProps) => ( +
+ + {children} + +
+) diff --git a/src/components/form/helpers/index.ts b/src/components/form/helpers/index.ts new file mode 100644 index 00000000..e32c7807 --- /dev/null +++ b/src/components/form/helpers/index.ts @@ -0,0 +1 @@ +export * from './HorizontalFieldGroup' diff --git a/src/components/form/index.ts b/src/components/form/index.ts index 9e37a7b4..1a898317 100644 --- a/src/components/form/index.ts +++ b/src/components/form/index.ts @@ -1,3 +1,5 @@ export * from './fields' -export { DefaultFormContents } from './DefaultFormContents' +export { DefaultEditFormContents } from './DefaultFormContents' export * from './attributes' +export * from './helpers' +export * from './FormBase' diff --git a/src/components/metadataFormControls/ModelTransfer/ModelTransfer.module.css b/src/components/metadataFormControls/ModelTransfer/ModelTransfer.module.css new file mode 100644 index 00000000..ec1aea1e --- /dev/null +++ b/src/components/metadataFormControls/ModelTransfer/ModelTransfer.module.css @@ -0,0 +1,12 @@ +.modelTransferField { + width: 100%; +} + +.modelTransferFooter { + padding: var(--spacers-dp8) 0; +} + +.modelTransferHeader { + padding-block: var(--spacers-dp8); + padding-inline: var(--spacers-dp4); +} diff --git a/src/components/metadataFormControls/ModelTransfer/ModelTransfer.tsx b/src/components/metadataFormControls/ModelTransfer/ModelTransfer.tsx new file mode 100644 index 00000000..8629c43a --- /dev/null +++ b/src/components/metadataFormControls/ModelTransfer/ModelTransfer.tsx @@ -0,0 +1,140 @@ +import { Transfer, TransferProps } from '@dhis2/ui' +import React, { + forwardRef, + RefAttributes, + useImperativeHandle, + useMemo, + useState, +} from 'react' +import { useInfiniteQuery } from 'react-query' +import { useBoundResourceQueryFn } from '../../../lib/query/useBoundQueryFn' +import { PlainResourceQuery } from '../../../types' +import { PagedResponse } from '../../../types/generated' + +type Response = PagedResponse + +export type DisplayableModel = { + id: string + displayName: string +} + +const defaultQuery = { + params: { + order: 'displayName:asc', + fields: ['id', 'displayName'], + }, +} + +const toDisplayOption = (model: DisplayableModel) => ({ + value: model.id, + label: model.displayName, +}) + +type OwnProps = { + selected: TModel[] + onChange: ({ selected }: { selected: TModel[] }) => void + query: PlainResourceQuery +} +type ModelTransferProps = Omit< + TransferProps, + | keyof OwnProps + | 'options' + | 'selected' + | 'filterable' + | 'onFilterChange' +> & + OwnProps + +type ImperativeRef = { refetch: () => void } + +const BaseModelTransfer = ( + { selected, onChange, query, ...transferProps }: ModelTransferProps, + ref: React.Ref +) => { + const queryFn = useBoundResourceQueryFn() + const [searchTerm, setSearchTerm] = useState('') + + const searchFilter = `identifiable:token:${searchTerm}` + const filter: string[] = searchTerm ? [searchFilter] : [] + const params = query.params + + const queryObject = { + ...query, + params: { + ...defaultQuery.params, + ...params, + filter: filter.concat(params?.filter || []), + }, + } + const modelName = query.resource + + const queryResult = useInfiniteQuery({ + queryKey: [queryObject] as const, + queryFn: queryFn>, + keepPreviousData: true, + getNextPageParam: (lastPage) => + lastPage.pager.nextPage ? lastPage.pager.page + 1 : undefined, + getPreviousPageParam: (firstPage) => + firstPage.pager.prevPage ? firstPage.pager.page - 1 : undefined, + }) + + useImperativeHandle(ref, () => ({ + refetch: () => queryResult.refetch(), + })) + + const allDataMap = useMemo( + () => + new Map( + queryResult.data?.pages.flatMap((page) => + page[modelName].map((d) => [d.id, d] as const) + ) + ), + [queryResult.data, modelName] + ) + + const selectedOptions = selected.map(toDisplayOption) + const loadedOptions = Array.from(allDataMap.values()).map(toDisplayOption) + // always include selected options + const allOptions = selectedOptions.concat(loadedOptions || []) + + const handleOnChange = ({ selected }: { selected: string[] }) => { + // map the selected ids to the full model + // loop through selected to keep order + const selectedModels = selected + .map((id) => allDataMap.get(id)) + .filter((model): model is TModel => !!model) + + onChange({ + selected: selectedModels, + }) + } + + return ( + + value !== undefined && setSearchTerm(value) + } + selected={selectedOptions.map((o) => o.value)} + onChange={handleOnChange} + /> + ) +} + +// this is needed to support generics with ref-forwarding +interface ModelTransferWithForwardedRef + extends React.FC> { + ( + props: ModelTransferProps & RefAttributes + ): React.ReactNode +} + +export const ModelTransfer: ModelTransferWithForwardedRef = + forwardRef(BaseModelTransfer) diff --git a/src/components/metadataFormControls/ModelTransfer/ModelTransferField.tsx b/src/components/metadataFormControls/ModelTransfer/ModelTransferField.tsx new file mode 100644 index 00000000..2a04a0a7 --- /dev/null +++ b/src/components/metadataFormControls/ModelTransfer/ModelTransferField.tsx @@ -0,0 +1,121 @@ +import i18n from '@dhis2/d2-i18n' +import { Button, ButtonStrip, Field, TransferProps } from '@dhis2/ui' +import React, { useRef } from 'react' +import { useField } from 'react-final-form' +import { useHref } from 'react-router' +import { DisplayableModel, ModelTransfer } from '../../../components' +import { getSectionNewPath } from '../../../lib' +import { PlainResourceQuery } from '../../../types' +import { LinkButton } from '../../LinkButton' +import css from './ModelTransfer.module.css' + +// this currently does not need a generic, because the value of the field is not passed +// or available from props. However if it's made available, +// the generic of should be added. +type ModelTransferFieldProps = { + name: string + query: PlainResourceQuery + label?: string +} & Pick< + TransferProps, + | 'rightHeader' + | 'leftHeader' + | 'rightFooter' + | 'leftFooter' + | 'filterPlaceholder' + | 'filterPlaceholderPicked' +> + +export function ModelTransferField({ + name, + query, + label, + rightHeader, + leftHeader, + rightFooter, + leftFooter, + filterPlaceholder, + filterPlaceholderPicked, +}: ModelTransferFieldProps) { + const modelName = query.resource + const { input, meta } = useField(name, { + multiple: true, + validateFields: [], + }) + const newLink = useHref(`/${getSectionNewPath(modelName)}`) + + const modelTransferHandle = useRef({ + refetch: () => { + throw new Error('Not initialized') + }, + }) + + return ( + + { + input.onChange(selected) + input.onBlur() + }} + leftHeader={{leftHeader}} + rightHeader={{rightHeader}} + leftFooter={ + leftFooter ?? ( + + ) + } + rightFooter={rightFooter} + query={query} + height={'350px'} + optionsWidth="500px" + selectedWidth="500px" + enableOrderChange={true} + /> + + ) +} + +const TransferHeader = ({ children }: { children: React.ReactNode }) => { + if (typeof children === 'string') { + return
{children}
+ } + return <>{children} +} + +const DefaultTransferLeftFooter = ({ + onRefreshClick, + newLink, +}: { + onRefreshClick: () => void + newLink: string +}) => { + return ( + + + + + {i18n.t('Add new')} + + + ) +} diff --git a/src/components/metadataFormControls/ModelTransfer/index.ts b/src/components/metadataFormControls/ModelTransfer/index.ts new file mode 100644 index 00000000..f2239e8e --- /dev/null +++ b/src/components/metadataFormControls/ModelTransfer/index.ts @@ -0,0 +1,2 @@ +export * from './ModelTransfer' +export * from './ModelTransferField' diff --git a/src/components/metadataFormControls/index.ts b/src/components/metadataFormControls/index.ts index cf20aca5..d6b8b522 100644 --- a/src/components/metadataFormControls/index.ts +++ b/src/components/metadataFormControls/index.ts @@ -4,3 +4,4 @@ export * from './DataElementGroupsTransfer' export * from './DataElementsTransfer' export * from './LegendSetTransfer' export * from './OptionSetSelect' +export * from './ModelTransfer' diff --git a/src/components/sectionList/filters/DynamicFilters.tsx b/src/components/sectionList/filters/DynamicFilters.tsx index c668feb5..07479fc7 100644 --- a/src/components/sectionList/filters/DynamicFilters.tsx +++ b/src/components/sectionList/filters/DynamicFilters.tsx @@ -7,6 +7,7 @@ import { DomainTypeSelectionFilter, ValueTypeSelectionFilter, PublicAccessFilter, + DataDimensionTypeFilter, } from './filterSelectors' import { useFilterKeys } from './useFilterKeys' @@ -19,6 +20,7 @@ const filterKeyToComponentMap: FilterKeyToComponentMap = { valueType: ValueTypeSelectionFilter, aggregationType: AggregationTypeFilter, publicAccess: PublicAccessFilter, + dataDimensionType: DataDimensionTypeFilter, } export const DynamicFilters = () => { diff --git a/src/components/sectionList/filters/filterSelectors/ConstantFilters.tsx b/src/components/sectionList/filters/filterSelectors/ConstantFilters.tsx index 202ee16a..2eb2ac45 100644 --- a/src/components/sectionList/filters/filterSelectors/ConstantFilters.tsx +++ b/src/components/sectionList/filters/filterSelectors/ConstantFilters.tsx @@ -1,11 +1,17 @@ import React from 'react' -import { AGGREGATION_TYPE, DOMAIN_TYPE, VALUE_TYPE } from '../../../../lib' +import { + AGGREGATION_TYPE, + DATA_DIMENSION_TYPE, + DOMAIN_TYPE, + getTranslatedProperty, + VALUE_TYPE, +} from '../../../../lib' import { ConstantSelectionFilter } from './ConstantSelectionFilter' export const DomainTypeSelectionFilter = () => { return ( @@ -15,7 +21,7 @@ export const DomainTypeSelectionFilter = () => { export const ValueTypeSelectionFilter = () => { return ( { export const AggregationTypeFilter = () => { return ( ) } + +export const DataDimensionTypeFilter = () => { + return ( + + ) +} diff --git a/src/lib/constants/translatedModelConstants.ts b/src/lib/constants/translatedModelConstants.ts index fa69acac..e3ed1315 100644 --- a/src/lib/constants/translatedModelConstants.ts +++ b/src/lib/constants/translatedModelConstants.ts @@ -64,10 +64,16 @@ export const VALUE_TYPE = { GEOJSON: i18n.t('GeoJSON'), } +export const DATA_DIMENSION_TYPE = { + DISAGGREGATION: i18n.t('Disaggregation'), + ATTRIBUTE: i18n.t('Attribute'), +} + const allConstantTranslations: Record = { ...AGGREGATION_TYPE, ...DOMAIN_TYPE, ...VALUE_TYPE, + ...DATA_DIMENSION_TYPE, } export const getConstantTranslation = (constant: string): string => { diff --git a/src/lib/constants/translatedModelProperties.ts b/src/lib/constants/translatedModelProperties.ts index 72911c18..6a51e8fe 100644 --- a/src/lib/constants/translatedModelProperties.ts +++ b/src/lib/constants/translatedModelProperties.ts @@ -1,6 +1,7 @@ import i18n from '@dhis2/d2-i18n' const TRANSLATED_PROPERTY: Record = { + aggregationType: i18n.t('Aggregation type'), categoryCombo: i18n.t('Category combination'), code: i18n.t('Code'), createdBy: i18n.t('Created by'), @@ -20,6 +21,7 @@ const TRANSLATED_PROPERTY: Record = { valueType: i18n.t('Value type'), user: i18n.t('Owner'), // user refers to the owner of the object zeroIsSignificant: i18n.t('Zero is significant'), + dataDimensionType: i18n.t('Data dimension type'), } const camelCaseToSentenceCase = (camelCase: string) => diff --git a/src/lib/form/composeAsyncValidators/composeAsyncValidators.ts b/src/lib/form/composeAsyncValidators/composeAsyncValidators.ts index 38c98939..ae8c134c 100644 --- a/src/lib/form/composeAsyncValidators/composeAsyncValidators.ts +++ b/src/lib/form/composeAsyncValidators/composeAsyncValidators.ts @@ -6,9 +6,14 @@ export const composeAsyncValidators = ( return async (value?: Value, formValues?: FormValues) => { for (let i = 0; i < validators.length; ++i) { const validator = validators[i] - const result = await validator(value, formValues) - if (result) { - return result + try { + const result = await validator(value, formValues) + if (result) { + return result + } + } catch (e) { + console.error(e) + return `Failed to run validation: ${(e as Error).toString()} ` } } } diff --git a/src/lib/form/createFormError.ts b/src/lib/form/createFormError.ts new file mode 100644 index 00000000..9205b794 --- /dev/null +++ b/src/lib/form/createFormError.ts @@ -0,0 +1,11 @@ +import { FORM_ERROR } from 'final-form' + +export const createFormError = (error: unknown) => { + let errorMessage + if (error instanceof Error || typeof error === 'string') { + errorMessage = error.toString() + } else { + errorMessage = 'An unknown error occurred' + } + return { [FORM_ERROR]: errorMessage } +} diff --git a/src/lib/form/createJsonPatchOperations.ts b/src/lib/form/createJsonPatchOperations.ts index a4b5f09f..4c55b061 100644 --- a/src/lib/form/createJsonPatchOperations.ts +++ b/src/lib/form/createJsonPatchOperations.ts @@ -16,12 +16,12 @@ type PatchAttributeValue = { } type ModelWithAttributeValues = IdentifiableObject & { - attributeValues: PatchAttributeValue[] + attributeValues?: PatchAttributeValue[] } interface FormatFormValuesArgs { originalValue: unknown - dirtyFields: { [key in keyof FormValues]?: boolean } + dirtyFields: Record values: FormValues } @@ -55,12 +55,11 @@ export function createJsonPatchOperations< // Remove attribute values without a value const values = { ...unsanitizedValues, - attributeValues: unsanitizedValues.attributeValues - .filter(({ value }) => !!value) - .map((value) => ({ - value: value.value, - attribute: { id: value.attribute.id }, - })), + ...(unsanitizedValues.attributeValues && { + attributeValues: unsanitizedValues.attributeValues.filter( + ({ value }) => !!value + ), + }), } const dirtyFieldsKeys = Object.keys(dirtyFields) diff --git a/src/lib/form/index.ts b/src/lib/form/index.ts index 917f9475..7c368a48 100644 --- a/src/lib/form/index.ts +++ b/src/lib/form/index.ts @@ -2,4 +2,6 @@ export { usePatchModel } from './usePatchModel' export { composeAsyncValidators } from './composeAsyncValidators' export type { FormFieldValidator } from './composeAsyncValidators' export { required } from './validators' -export { validate } from './validate' +export { validate, createFormValidate } from './validate' +export { useOnSubmitEdit, useOnSubmitNew } from './useOnSubmit' +export { modelFormSchemas } from './modelFormSchemas' diff --git a/src/lib/form/modelFormSchemas.ts b/src/lib/form/modelFormSchemas.ts new file mode 100644 index 00000000..b6857d87 --- /dev/null +++ b/src/lib/form/modelFormSchemas.ts @@ -0,0 +1,36 @@ +import { z } from 'zod' + +/* Note that these schemas describes validations for what we send to the server, + and not what is stored in the form. Unknown keys are stripped by default. */ + +const modelReference = z.object({ id: z.string() }) +const referenceCollection = z.array(modelReference) + +/* Note that ID is optional here because we don't have ID when creating/POSTING models */ +const identifiable = z.object({ + id: z.string().optional(), + name: z.string().trim(), +}) + +const attributeValues = z + .array( + z.object({ + value: z.string(), + attribute: z.object({ + id: z.string(), + }), + }) + ) + .default([]) + +const withAttributeValues = z.object({ + attributeValues: attributeValues, +}) + +export const modelFormSchemas = { + objectReference: modelReference, + referenceCollection, + identifiable, + attributeValues, + withAttributeValues, +} diff --git a/src/lib/form/useCreateModel.ts b/src/lib/form/useCreateModel.ts new file mode 100644 index 00000000..db9d8486 --- /dev/null +++ b/src/lib/form/useCreateModel.ts @@ -0,0 +1,23 @@ +import { useDataEngine } from '@dhis2/app-runtime' +import { FORM_ERROR } from 'final-form' +import { useCallback } from 'react' + +export const useCreateModel = (resource: string) => { + const dataEngine = useDataEngine() + + const create = useCallback( + async (data: Record) => { + try { + await dataEngine.mutate({ + resource, + type: 'create', + data: data, + }) + } catch (error) { + return { [FORM_ERROR]: (error as Error | string).toString() } + } + }, + [dataEngine, resource] + ) + return create +} diff --git a/src/lib/form/useOnSubmit.ts b/src/lib/form/useOnSubmit.ts new file mode 100644 index 00000000..ba6f5d4b --- /dev/null +++ b/src/lib/form/useOnSubmit.ts @@ -0,0 +1,95 @@ +import { useAlert } from '@dhis2/app-runtime' +import i18n from '@dhis2/d2-i18n' +import { useMemo } from 'react' +import { FormProps } from 'react-final-form' +import { useNavigate } from 'react-router-dom' +import { ModelSection } from '../../types' +import { IdentifiableObject } from '../../types/generated' +import { getSectionPath } from '../routeUtils' +import { createJsonPatchOperations } from './createJsonPatchOperations' +import { useCreateModel } from './useCreateModel' +import { usePatchModel } from './usePatchModel' + +type OnSubmit = FormProps['onSubmit'] + +type UseOnSubmitEditOptions = { + modelId: string + section: ModelSection +} + +export const useOnSubmitEdit = ({ + modelId, + section, +}: UseOnSubmitEditOptions) => { + const patchDirtyFields = usePatchModel(modelId, section.namePlural) + const saveAlert = useAlert( + ({ message }) => message, + (options) => options + ) + const navigate = useNavigate() + + return useMemo>( + () => async (values, form) => { + const jsonPatchOperations = createJsonPatchOperations({ + values, + dirtyFields: form.getState().dirtyFields, + originalValue: form.getState().initialValues, + }) + if (jsonPatchOperations.length < 1) { + saveAlert.show({ + message: i18n.t('No changes to be saved'), + }) + navigate(`/${getSectionPath(section)}`) + return + } + const errors = await patchDirtyFields(jsonPatchOperations) + if (errors) { + return errors + } + saveAlert.show({ + message: i18n.t('Saved successfully'), + success: true, + }) + navigate(`/${getSectionPath(section)}`) + }, + [patchDirtyFields, saveAlert, navigate, section] + ) +} + +export const useOnSubmitNew = ({ + section, +}: { + section: ModelSection +}) => { + const createModel = useCreateModel(section.namePlural) + const saveAlert = useAlert( + ({ message }) => message, + (options) => options + ) + const navigate = useNavigate() + + return useMemo>( + () => async (values) => { + if (!values) { + console.error('Tried to save new object without any changes', { + values, + }) + saveAlert.show({ + message: i18n.t('Cannot save empty object'), + error: true, + }) + return + } + const errors = await createModel(values) + if (errors) { + return errors + } + saveAlert.show({ + message: i18n.t('Created successfully'), + success: true, + }) + navigate(`/${getSectionPath(section)}`) + }, + [createModel, saveAlert, navigate, section] + ) +} diff --git a/src/lib/form/validate.ts b/src/lib/form/validate.ts index c1c1aa58..46f3cb07 100644 --- a/src/lib/form/validate.ts +++ b/src/lib/form/validate.ts @@ -8,7 +8,6 @@ export function validate( values: FormValues ) { const zodResult = zodSchema.safeParse(values) - if (zodResult.success !== false) { return undefined } @@ -17,6 +16,9 @@ export function validate( const errorPath = segmentsToPath(error.path) return setIn(formErrors, errorPath, error.message) }, {}) - return allFormErrors } + +export function createFormValidate(zodSchema: z.AnyZodObject) { + return (values: FormValues) => validate(zodSchema, values) +} diff --git a/src/lib/models/attributes.ts b/src/lib/models/attributes.ts index f9d7f210..fca140a4 100644 --- a/src/lib/models/attributes.ts +++ b/src/lib/models/attributes.ts @@ -1,25 +1,28 @@ import type { IdentifiableObject, - Attribute, AttributeValue, + PickWithFieldFilters, } from '../../types/generated' -type ModelWithAttributes = IdentifiableObject & { - attributeValues: AttributeValue[] -} - +export type PartialAttributeValue = PickWithFieldFilters< + AttributeValue, + ['attribute[id]', 'value'] +> /* Gather all assigned attributes from both model.attributeValues and attributes. Normally a metadata model will only return attributes with a value. However, in a form we should still show assigned attributes, so the user can edit them */ -export const getAllAttributeValues = ( - model: ModelWithAttributes, - attributes: Attribute[] -): AttributeValue[] => { +export const getAllAttributeValues = < + TAttributeValue extends PartialAttributeValue, + TAttribute extends IdentifiableObject +>( + modelAttributeValues: TAttributeValue[], + attributes: TAttribute[] +) => { const attributeValuesMap = new Map( - model.attributeValues.map((a) => [a.attribute.id, a]) + modelAttributeValues.map((a) => [a.attribute.id, a]) ) - const attributeValues: AttributeValue[] = attributes.map((attribute) => { + const attributeValues = attributes.map((attribute) => { const value = attributeValuesMap.get(attribute.id)?.value || '' return { attribute, value } }) diff --git a/src/lib/query/useBoundQueryFn.ts b/src/lib/query/useBoundQueryFn.ts index 8cf8bdb1..187c99a9 100644 --- a/src/lib/query/useBoundQueryFn.ts +++ b/src/lib/query/useBoundQueryFn.ts @@ -20,13 +20,32 @@ export const useBoundQueryFn = () => { return useMemo(() => createBoundQueryFn(dataEngine), [dataEngine]) } +const mergePageParam = (query: ResourceQuery, pageParam?: number) => { + return { + ...query, + params: { + ...query.params, + page: pageParam, + }, + } +} + export const createBoundResourceQueryFn = (engine: DataEngine) => async ({ queryKey: [query], + pageParam, signal, }: QueryFunctionContext) => { - const result = await engine.query({ result: query }, { signal }) + const result = await engine.query( + { + result: + typeof pageParam === 'number' + ? mergePageParam(query, pageParam) + : query, + }, + { signal } + ) return result.result as TData } diff --git a/src/lib/routeUtils/routePaths.ts b/src/lib/routeUtils/routePaths.ts index 6557fcd1..55b21728 100644 --- a/src/lib/routeUtils/routePaths.ts +++ b/src/lib/routeUtils/routePaths.ts @@ -9,10 +9,13 @@ export const getOverviewPath = (section: Section) => { return `${routePaths.overviewRoot}/${section.namePlural}` } -export const getSectionPath = (section: Section) => { +export const getSectionPath = (section: Section | string) => { + if (typeof section === 'string') { + return section + } return section.namePlural } -export const getSectionNewPath = (section: Section) => { +export const getSectionNewPath = (section: Section | string) => { return `${getSectionPath(section)}/${routePaths.sectionNew}` } diff --git a/src/lib/sectionList/filters/filterConfig.tsx b/src/lib/sectionList/filters/filterConfig.tsx index f850ce1a..cb2fda52 100644 --- a/src/lib/sectionList/filters/filterConfig.tsx +++ b/src/lib/sectionList/filters/filterConfig.tsx @@ -1,6 +1,6 @@ import { StringParam } from 'use-query-params' import { z } from 'zod' -import { DataElement } from '../../../types/generated' +import { Category, DataElement } from '../../../types/generated' import { IDENTIFIABLE_FILTER_KEY } from '../../constants' import { isValidUid, parseAccessString } from '../../models' import { CustomDelimitedArrayParam } from './customParams' @@ -19,6 +19,7 @@ export const filterParamsSchema = z z.string().refine((val) => parseAccessString(val) !== null) ), valueType: z.array(z.nativeEnum(DataElement.valueType)), + dataDimensionType: z.nativeEnum(Category.dataDimensionType), }) .partial() @@ -32,6 +33,7 @@ export const filterQueryParamType = { dataSet: CustomDelimitedArrayParam, categoryCombo: CustomDelimitedArrayParam, publicAccess: CustomDelimitedArrayParam, + dataDimensionType: StringParam, } as const satisfies QueryParamsConfigMap export const validFilterKeys = Object.keys(filterQueryParamType) diff --git a/src/lib/sectionList/filters/parseFiltersToQueryParams.ts b/src/lib/sectionList/filters/parseFiltersToQueryParams.ts index 0fcb7e84..16ae3fa0 100644 --- a/src/lib/sectionList/filters/parseFiltersToQueryParams.ts +++ b/src/lib/sectionList/filters/parseFiltersToQueryParams.ts @@ -30,7 +30,12 @@ const defaultFilter = ( const filterToQueryParamMap: FilterToQueryParamsMap = { identifiable: (value) => `identifiable:token:${value}`, - categoryCombo: (value) => inFilter('categoryCombo.id', value), + categoryCombo: (value, section) => { + if (section.name === 'category') { + return inFilter('categoryCombos.id', value) + } + return inFilter('categoryCombo.id', value) + }, dataSet: (value, section) => section.name === SchemaName.dataElement ? inFilter('dataSetElements.dataSet.id', value) diff --git a/src/lib/sectionList/listViews/sectionListViewsConfig.ts b/src/lib/sectionList/listViews/sectionListViewsConfig.ts index 7e9e35d9..3efa3845 100644 --- a/src/lib/sectionList/listViews/sectionListViewsConfig.ts +++ b/src/lib/sectionList/listViews/sectionListViewsConfig.ts @@ -1,4 +1,5 @@ import i18n from '@dhis2/d2-i18n' +import { SectionName } from '../../constants' import type { ConfigurableFilterKey } from '../filters' export interface ModelPropertyDescriptor { @@ -106,4 +107,12 @@ export const modelListViewsConfig = { default: [], }, }, -} satisfies SectionListViewConfig + category: { + columns: { + default: ['name', 'dataDimensionType', DESCRIPTORS.publicAccess], + }, + filters: { + default: ['dataDimensionType', 'categoryCombo'], + }, + }, +} satisfies SectionListViewConfig diff --git a/src/lib/zod/getDefaults.ts b/src/lib/zod/getDefaults.ts new file mode 100644 index 00000000..181969fe --- /dev/null +++ b/src/lib/zod/getDefaults.ts @@ -0,0 +1,16 @@ +import { z } from 'zod' + +// from: https://github.com/colinhacks/zod/discussions/1953#discussioncomment-4811588 +export function getDefaults(schema: Schema) { + return Object.fromEntries( + Object.entries(schema.shape).map(([key, value]) => { + if (value instanceof z.ZodOptional) { + value = value._def.innerType + } + if (value instanceof z.ZodDefault) { + return [key, value._def.defaultValue()] + } + return [key, undefined] + }) + ) +} diff --git a/src/lib/zod/index.ts b/src/lib/zod/index.ts index 4d3fa136..a2af32c3 100644 --- a/src/lib/zod/index.ts +++ b/src/lib/zod/index.ts @@ -1 +1,2 @@ export { segmentsToPath } from './segmentsToPath' +export { getDefaults } from './getDefaults' diff --git a/src/pages/DefaultSectionList.tsx b/src/pages/DefaultSectionList.tsx index 0b291f5a..d9a1766b 100644 --- a/src/pages/DefaultSectionList.tsx +++ b/src/pages/DefaultSectionList.tsx @@ -15,7 +15,10 @@ import { PagedResponse } from '../types/models' type ModelListResponse = WrapQueryResponse> -export const DefaultSectionList = () => { +type DefaultSectionListProps = { + filters: string[] +} +export const DefaultSectionList = ({ filters }: DefaultSectionListProps) => { const { columns } = useModelListView() const schema = useSchemaFromHandle() const engine = useDataEngine() @@ -28,6 +31,7 @@ export const DefaultSectionList = () => { resource: modelListName, params: { ...initialParams, + filter: initialParams.filter.concat(filters ?? []), fields: columns .map((column) => getFieldFilter(schema, column.path)) .concat(DEFAULT_FIELD_FILTERS), diff --git a/src/pages/categories/Edit.tsx b/src/pages/categories/Edit.tsx new file mode 100644 index 00000000..56fcc92b --- /dev/null +++ b/src/pages/categories/Edit.tsx @@ -0,0 +1,57 @@ +import React from 'react' +import { useQuery } from 'react-query' +import { useParams } from 'react-router-dom' +import { DefaultEditFormContents, FormBase } from '../../components' +import { DEFAULT_FIELD_FILTERS, SECTIONS_MAP, useOnSubmitEdit } from '../../lib' +import { useBoundResourceQueryFn } from '../../lib/query/useBoundQueryFn' +import { PickWithFieldFilters } from '../../types/generated' +import { Category } from '../../types/models' +import { validate } from './form' +import { CategoryFormFields } from './form/CategoryFormFields' + +const fieldFilters = [ + ...DEFAULT_FIELD_FILTERS, + 'name', + 'shortName', + 'code', + 'description', + 'categoryOptions[id,displayName]', + 'dataDimension', + 'dataDimensionType', + 'attributeValues[value,attribute[id]]', +] as const + +export type CategoryFormValues = PickWithFieldFilters< + Category, + typeof fieldFilters +> + +export const Component = () => { + const section = SECTIONS_MAP.category + const queryFn = useBoundResourceQueryFn() + const modelId = useParams().id as string + const query = { + resource: 'categories', + id: modelId, + params: { + fields: fieldFilters.concat(), + }, + } + const categoryQuery = useQuery({ + queryKey: [query], + queryFn: queryFn, + }) + + return ( + + + + + + ) +} diff --git a/src/pages/categories/List.tsx b/src/pages/categories/List.tsx new file mode 100644 index 00000000..7133f024 --- /dev/null +++ b/src/pages/categories/List.tsx @@ -0,0 +1,6 @@ +import React from 'react' +import { DefaultSectionList } from '../DefaultSectionList' + +export const Component = () => ( + +) diff --git a/src/pages/categories/New.tsx b/src/pages/categories/New.tsx new file mode 100644 index 00000000..82fa1c49 --- /dev/null +++ b/src/pages/categories/New.tsx @@ -0,0 +1,24 @@ +import React from 'react' +import { FormBase } from '../../components' +import { DefaultNewFormContents } from '../../components/form/DefaultFormContents' +import { SECTIONS_MAP, useOnSubmitNew } from '../../lib' +import { validate } from './form' +import { CategoryFormFields } from './form/CategoryFormFields' +import { initialValues } from './form/categorySchema' + +const section = SECTIONS_MAP.category + +export const Component = () => { + return ( + + + + + + ) +} diff --git a/src/pages/categories/form/CategoryFormFields.tsx b/src/pages/categories/form/CategoryFormFields.tsx new file mode 100644 index 00000000..a02304fd --- /dev/null +++ b/src/pages/categories/form/CategoryFormFields.tsx @@ -0,0 +1,115 @@ +import i18n from '@dhis2/d2-i18n' +import { CheckboxFieldFF, RadioFieldFF } from '@dhis2/ui' +import React from 'react' +import { Field } from 'react-final-form' +import { + CustomAttributesSection, + DefaultIdentifiableFields, + StandardFormField, + StandardFormSection, + StandardFormSectionTitle, + StandardFormSectionDescription, + DescriptionField, + HorizontalFieldGroup, + ModelTransferField, +} from '../../../components' +import { SECTIONS_MAP } from '../../../lib' + +export const CategoryFormFields = () => { + const section = SECTIONS_MAP.category + + return ( + <> + + + {i18n.t('Basic information')} + + + {i18n.t('Set up the basic information for this category.')} + + + + + + + + {i18n.t('Data configuration')} + + + {i18n.t( + 'Choose how this category will be used to capture and analyze' + )} + + + + + name="dataDimensionType" + component={RadioFieldFF} + label={i18n.t('Disaggregation')} + type="radio" + value={'DISAGGREGATION'} + /> + + name="dataDimensionType" + component={RadioFieldFF} + label={i18n.t('Attribute')} + type="radio" + value={'ATTRIBUTE'} + /> + + + + + + + + + + + + + {i18n.t( + 'Choose the category options to include in this category.' + )} + + + + + + + + + + ) +} diff --git a/src/pages/categories/form/categorySchema.ts b/src/pages/categories/form/categorySchema.ts new file mode 100644 index 00000000..d8f09607 --- /dev/null +++ b/src/pages/categories/form/categorySchema.ts @@ -0,0 +1,27 @@ +import { z } from 'zod' +import { getDefaults, createFormValidate, modelFormSchemas } from '../../../lib' +import { Category } from '../../../types/generated' +import { CategoryFormValues } from '../Edit' + +/* Note that this describes what we send to the server, + and not what is stored in the form. */ +const { identifiable, referenceCollection, withAttributeValues } = + modelFormSchemas + +export const categorySchema = identifiable.merge(withAttributeValues).extend({ + shortName: z.string().trim(), + code: z.string().trim().optional(), + description: z.string().trim().optional(), + dataDimensionType: z + .nativeEnum(Category.dataDimensionType) + .default(Category.dataDimensionType.DISAGGREGATION), + dataDimension: z.boolean().default(true), + categoryOptions: referenceCollection + .min(1, 'At least one category option is required') + .default([]), +}) + +export const initialValues: Partial = + getDefaults(categorySchema) + +export const validate = createFormValidate(categorySchema) diff --git a/src/pages/categories/form/index.ts b/src/pages/categories/form/index.ts new file mode 100644 index 00000000..73d6da2a --- /dev/null +++ b/src/pages/categories/form/index.ts @@ -0,0 +1 @@ +export { categorySchema, validate } from './categorySchema' diff --git a/src/pages/dataElementGroupSets/Edit.tsx b/src/pages/dataElementGroupSets/Edit.tsx index 0a16ea61..3d6dcf6b 100644 --- a/src/pages/dataElementGroupSets/Edit.tsx +++ b/src/pages/dataElementGroupSets/Edit.tsx @@ -6,9 +6,10 @@ import { withTypes } from 'react-final-form' import { useNavigate, useParams } from 'react-router-dom' import { Loader } from '../../components' import { - DefaultFormContents, + DefaultEditFormContents, useCustomAttributesQuery, } from '../../components/form' +import { AttributeMetadata } from '../../components/form/attributes/useCustomAttributesQuery' import { SCHEMA_SECTIONS, getSectionPath, @@ -17,7 +18,7 @@ import { } from '../../lib' import { createJsonPatchOperations } from '../../lib/form/createJsonPatchOperations' import { getAllAttributeValues } from '../../lib/models/attributes' -import { Attribute, DataElementGroupSet } from '../../types/generated' +import { DataElementGroupSet } from '../../types/generated' import { DataElementGroupSetFormFields, dataElementGroupSetSchema, @@ -55,7 +56,7 @@ function computeInitialValues({ customAttributes, }: { dataElementGroupSet: DataElementGroupSet - customAttributes: Attribute[] + customAttributes: AttributeMetadata[] }) { if (!dataElementGroupSet) { return {} @@ -64,7 +65,7 @@ function computeInitialValues({ // We want to have an array in the state with all attributes, not just the // ones that are set const attributeValues = getAllAttributeValues( - dataElementGroupSet, + dataElementGroupSet.attributeValues, customAttributes ) @@ -78,7 +79,7 @@ function computeInitialValues({ dataDimension: dataElementGroupSet.dataDimension, dataElementGroups: dataElementGroupSet.dataElementGroups || [], attributeValues, - } + } as FormValues } export const Component = () => { @@ -117,7 +118,7 @@ function DataElementGroupSetForm({ attributes, }: { dataElementGroupSet: DataElementGroupSet - attributes: Attribute[] + attributes: AttributeMetadata[] }) { const navigate = useNavigate() const patchDirtyFields = usePatchModel( @@ -152,15 +153,11 @@ function DataElementGroupSetForm({ customAttributes: attributes, })} > - {({ handleSubmit, submitting, submitError }) => ( + {({ handleSubmit }) => (
- + - +
)} diff --git a/src/pages/dataElementGroupSets/New.tsx b/src/pages/dataElementGroupSets/New.tsx index 215e57d1..b0dac080 100644 --- a/src/pages/dataElementGroupSets/New.tsx +++ b/src/pages/dataElementGroupSets/New.tsx @@ -11,8 +11,8 @@ import { StandardFormSection, } from '../../components' import { useCustomAttributesQuery } from '../../components/form' +import { AttributeMetadata } from '../../components/form/attributes/useCustomAttributesQuery' import { SCHEMA_SECTIONS, getSectionPath, validate } from '../../lib' -import { Attribute } from '../../types/generated' import { DataElementGroupSetFormFields, dataElementGroupSetSchema, @@ -22,7 +22,7 @@ import classes from './New.module.css' const listPath = `/${getSectionPath(SCHEMA_SECTIONS.dataElementGroupSet)}` -function useInitialValues(customAttributes: Attribute[]) { +function useInitialValues(customAttributes: AttributeMetadata[]) { const attributeValues = useMemo( () => customAttributes.map((attribute) => ({ diff --git a/src/pages/dataElementGroups/Edit.tsx b/src/pages/dataElementGroups/Edit.tsx index 052e8352..b51ca5fe 100644 --- a/src/pages/dataElementGroups/Edit.tsx +++ b/src/pages/dataElementGroups/Edit.tsx @@ -6,9 +6,10 @@ import { withTypes } from 'react-final-form' import { useNavigate, useParams } from 'react-router-dom' import { Loader } from '../../components' import { - DefaultFormContents, + DefaultEditFormContents, useCustomAttributesQuery, } from '../../components/form' +import { AttributeMetadata } from '../../components/form/attributes/useCustomAttributesQuery' import { SCHEMA_SECTIONS, getSectionPath, @@ -17,7 +18,7 @@ import { } from '../../lib' import { createJsonPatchOperations } from '../../lib/form/createJsonPatchOperations' import { getAllAttributeValues } from '../../lib/models/attributes' -import { Attribute, DataElementGroup } from '../../types/generated' +import { DataElementGroup } from '../../types/generated' import { DataElementGroupFormFields, dataElementGroupSchema } from './form' import type { FormValues } from './form' @@ -52,7 +53,7 @@ function computeInitialValues({ customAttributes, }: { dataElementGroup: DataElementGroup - customAttributes: Attribute[] + customAttributes: AttributeMetadata[] }) { if (!dataElementGroup) { return {} @@ -61,7 +62,7 @@ function computeInitialValues({ // We want to have an array in the state with all attributes, not just the // ones that are set const attributeValues = getAllAttributeValues( - dataElementGroup, + dataElementGroup.attributeValues, customAttributes ) @@ -72,7 +73,7 @@ function computeInitialValues({ code: dataElementGroup.code, dataElements: dataElementGroup.dataElements, attributeValues, - } + } as FormValues } export const Component = () => { @@ -106,7 +107,7 @@ function DataElementGroupForm({ attributes, }: { dataElementGroup: DataElementGroup - attributes: Attribute[] + attributes: AttributeMetadata[] }) { const navigate = useNavigate() const patchDirtyFields = usePatchModel( @@ -141,15 +142,11 @@ function DataElementGroupForm({ customAttributes: attributes, })} > - {({ handleSubmit, submitting, submitError }) => ( + {({ handleSubmit }) => (
- + - +
)} diff --git a/src/pages/dataElementGroups/New.tsx b/src/pages/dataElementGroups/New.tsx index a67dea49..d97d7006 100644 --- a/src/pages/dataElementGroups/New.tsx +++ b/src/pages/dataElementGroups/New.tsx @@ -11,15 +11,15 @@ import { StandardFormSection, } from '../../components' import { useCustomAttributesQuery } from '../../components/form' +import { AttributeMetadata } from '../../components/form/attributes/useCustomAttributesQuery' import { SCHEMA_SECTIONS, getSectionPath, validate } from '../../lib' -import { Attribute } from '../../types/generated' import { DataElementGroupFormFields, dataElementGroupSchema } from './form' import type { FormValues } from './form' import classes from './New.module.css' const listPath = `/${getSectionPath(SCHEMA_SECTIONS.dataElementGroup)}` -function useInitialValues(customAttributes: Attribute[]) { +function useInitialValues(customAttributes: AttributeMetadata[]) { const attributeValues = useMemo( () => customAttributes.map((attribute) => ({ diff --git a/src/pages/dataElements/Edit.tsx b/src/pages/dataElements/Edit.tsx index 6c033f12..563a5080 100644 --- a/src/pages/dataElements/Edit.tsx +++ b/src/pages/dataElements/Edit.tsx @@ -11,11 +11,12 @@ import { StandardFormSection, } from '../../components' import { useCustomAttributesQuery } from '../../components/form' +import { AttributeMetadata } from '../../components/form/attributes/useCustomAttributesQuery' import { SCHEMA_SECTIONS, getSectionPath, validate } from '../../lib' import { createJsonPatchOperations } from '../../lib/form/createJsonPatchOperations' import { getAllAttributeValues } from '../../lib/models/attributes' import { JsonPatchOperation } from '../../types' -import { Attribute, DataElement } from '../../types/generated' +import { DataElement } from '../../types/generated' import classes from './Edit.module.css' import { DataElementFormFields, dataElementSchema } from './form' import type { FormValues } from './form' @@ -51,14 +52,17 @@ function computeInitialValues({ customAttributes, }: { dataElement: DataElement - customAttributes: Attribute[] + customAttributes: AttributeMetadata[] dataElementId: string }) { if (!dataElement) { return {} } - const attributeValues = getAllAttributeValues(dataElement, customAttributes) + const attributeValues = getAllAttributeValues( + dataElement.attributeValues, + customAttributes + ) return { id: dataElementId, @@ -83,7 +87,7 @@ function computeInitialValues({ aggregationLevels: dataElement.aggregationLevels || [], zeroIsSignificant: dataElement.zeroIsSignificant, attributeValues, - } + } as FormValues } function usePatchDirtyFields() { diff --git a/src/pages/dataElements/New.tsx b/src/pages/dataElements/New.tsx index 629d6d25..b3a23d42 100644 --- a/src/pages/dataElements/New.tsx +++ b/src/pages/dataElements/New.tsx @@ -11,6 +11,7 @@ import { StandardFormSection, } from '../../components' import { useCustomAttributesQuery } from '../../components/form' +import { AttributeMetadata } from '../../components/form/attributes/useCustomAttributesQuery' import { DEFAULT_CATEGORY_COMBO, SCHEMA_SECTIONS, @@ -18,14 +19,13 @@ import { useSchemas, validate, } from '../../lib' -import { Attribute } from '../../types/generated' import { DataElementFormFields, dataElementSchema } from './form' import type { FormValues } from './form' import classes from './New.module.css' const listPath = `/${getSectionPath(SCHEMA_SECTIONS.dataElement)}` -function useInitialValues(customAttributes: Attribute[]) { +function useInitialValues(customAttributes: AttributeMetadata[]) { const schemas = useSchemas() const attributeValues = useMemo( diff --git a/src/pages/organisationUnits/list/OrganisationUnitList.tsx b/src/pages/organisationUnits/list/OrganisationUnitList.tsx index a002d8e3..f20d2e14 100644 --- a/src/pages/organisationUnits/list/OrganisationUnitList.tsx +++ b/src/pages/organisationUnits/list/OrganisationUnitList.tsx @@ -209,7 +209,9 @@ export const OrganisationUnitList = () => { .flatRows.map((r) => r.id) ) } - onDeselectAll={() => {table.resetRowSelection(true)}} + onDeselectAll={() => { + table.resetRowSelection(true) + }} /> = S extends `${infer T} ${infer U}` + ? RemoveSpaces<`${T}${U}`> + : S + +// utility type to convert a union to an intersection +type UnionToIntersection = (U extends any ? (x: U) => void : never) extends ( + x: infer I +) => void + ? I + : never + +// utility type to get the base type of a model, so get an object we can pick from +// if in an array, return the model in the array +// remove undefined and null modifiers, because we cannot pick if those are present +type GetModel = NonNullable ? U : T> + +// we cannot pick within collections, so we keep the original model if it is an array +// then we wrap in this helper to get the array-type back +// use extract to keep modifiers like undefined | null +type MaybeCollection = FullModel extends Array + ? Model[] | Extract + : Model | Extract + +type RecursivePickWithFieldFilter< + Model, + S extends string, + D extends string = ',' +> = string extends S + ? // eslint-disable-next-line @typescript-eslint/ban-types + Model // if we cant infer the actual value of the string, return full model + : S extends '' + ? never + : S extends `${infer Root extends string & keyof Model}[${infer Nested}]` // we have a nested filter eg. user[access] + ? { + // create an object with root key, and recursively pick the nested fields + [K in Root]: MaybeCollection< + Prettify< + RecursivePickWithFieldFilter, Nested> + >, + Model[Root] + > + } + : S extends `${infer T extends string & keyof Model}${D}${infer U}` // simple filter eg. id,name + ? Pick & RecursivePickWithFieldFilter + : S extends keyof Model + ? Pick + : S extends ':owner' + ? BaseIdentifiableObject + : never //[Model, S] // not a key of Model, ignore + +/** + * From Model, Pick properties (and nested properties) using a field filter-array. + * Field-filters are of the type ['name', 'id', 'access[read,delete]' and can be as deep as needed, to pick the nested fields. + * + * @example + * type DataElementWithCategoryCombo = PickWithFieldFilters + * const de = {} as DataElementWithCategoryCombo + * de.categoryCombo.categories.map(c => c.displayName) + **/ + +export type PickWithFieldFilters< + TModel, + TFieldFilters extends readonly string[] +> = + // RecursivePick will return an union of objects for each entry in fieldFilter-array. + // Thus we convert this to an intersection to get one object with all the picked properties. + Prettify< + UnionToIntersection< + RecursivePickWithFieldFilter< + TModel, + RemoveSpaces + > + > + > diff --git a/src/types/generated/utility.ts b/src/types/generated/utility.ts index eee3030e..887860b2 100644 --- a/src/types/generated/utility.ts +++ b/src/types/generated/utility.ts @@ -1,6 +1,12 @@ /* GENERATED BY https://github.com/Birkbjo/dhis2-open-api-ts */ import { IdentifiableObject, GistPager, Pager } from './' -// import { CategoryCombo, DataElement } from "../generated"; + +/* This is used to resolve types, so it's easier to see what +properties the types actually consist of for complex objects/types +https://www.totaltypescript.com/concepts/the-prettify-helper */ +export type Prettify = { + [K in keyof T]: T[K] +} & unknown export type ModelCollection = Array type ModelReference = IdentifiableObject | ModelCollection diff --git a/src/types/query.ts b/src/types/query.ts index b97d1da6..4cf166b4 100644 --- a/src/types/query.ts +++ b/src/types/query.ts @@ -6,6 +6,20 @@ export type QueryResponse = ReturnType export type Query = Parameters[0] +type QueryParams = { + pageSize?: number + page?: number + fields?: string | string[] + filter: string | string[] + [key: string]: unknown +} + +export type PlainResourceQuery = { + resource: string + id?: string + params?: QueryParams +} + export type ResourceQuery = Query[keyof Query] export type QueryRefetchFunction = QueryResponse['refetch'] From c603a25119a80f9cf70b90c6ee3f1df00377fb58 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Sat, 28 Sep 2024 12:12:56 +0000 Subject: [PATCH 07/11] chore(release): cut 0.4.0 [skip release] # [0.4.0](https://github.com/dhis2/maintenance-app-beta/compare/v0.3.1...v0.4.0) (2024-09-28) ### Features * **categories:** category forms and form refactor ([#407](https://github.com/dhis2/maintenance-app-beta/issues/407)) ([66216c4](https://github.com/dhis2/maintenance-app-beta/commit/66216c4c4c7beb11411e790fd804a0761e980b19)) * org list deselect all + multi select actions ([56fa5fc](https://github.com/dhis2/maintenance-app-beta/commit/56fa5fc572903636e802a2ff0c47d23432abe38a)) * remove select all checkbox from org list ([84cfd3e](https://github.com/dhis2/maintenance-app-beta/commit/84cfd3eb8d5161b3ee7d47779fae88bd13790021)) --- CHANGELOG.md | 9 +++++++++ package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07ce1e73..83cf9530 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# [0.4.0](https://github.com/dhis2/maintenance-app-beta/compare/v0.3.1...v0.4.0) (2024-09-28) + + +### Features + +* **categories:** category forms and form refactor ([#407](https://github.com/dhis2/maintenance-app-beta/issues/407)) ([66216c4](https://github.com/dhis2/maintenance-app-beta/commit/66216c4c4c7beb11411e790fd804a0761e980b19)) +* org list deselect all + multi select actions ([56fa5fc](https://github.com/dhis2/maintenance-app-beta/commit/56fa5fc572903636e802a2ff0c47d23432abe38a)) +* remove select all checkbox from org list ([84cfd3e](https://github.com/dhis2/maintenance-app-beta/commit/84cfd3eb8d5161b3ee7d47779fae88bd13790021)) + ## [0.3.1](https://github.com/dhis2/maintenance-app-beta/compare/v0.3.0...v0.3.1) (2024-08-20) diff --git a/package.json b/package.json index 66b2ad3c..475a7c08 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maintenance-app", - "version": "0.3.1", + "version": "0.4.0", "description": "", "license": "BSD-3-Clause", "private": true, From 7687c13d99335154880275e7631af9c221d0aceb Mon Sep 17 00:00:00 2001 From: Birk Johansson Date: Mon, 30 Sep 2024 17:16:21 +0200 Subject: [PATCH 08/11] feat(catCombo): add category combo form and list (#410) * fix: add utility type for picking based on field-filters * refactor: simplify PickWithFieldFilters * fix: simplify createJsonpatchOperation and formcontents * fix: simplify getAllAttributes * fix: fix PickWithFieldFilters * wip: simplify editform * fix: implement basic category form * feat: Edit and New form base * fix: get defaults using zod * refactor: add defaultformcontents for new * feat(form): caregory forms, formbase * chore: fix eslint warnings * fix: cleanup * fix(category-form): add options-transfer, generic ModelTransfer * fix: improve model-transfer * fix: fix lint and build issues * fix(model-transferfield): expose filterPlaceholder * fix(formbase): allow support for no attributes * fix(formcontents): fix new form layout * fix(types): prettify PickWithFieldFilter result-type * fix(list): add filter and columns descriptors to category * fix: test * refactor: add common zod schemas * fix: format * feat(form): add catCombo form * fix: add categoryCombo filters and columns * fix: fix categoryCombo edit save * fix: add missing file - categoryFilter * refactor: use common form schemas * fix: translate validation message * fix: add label for category options --- i18n/en.pot | 88 +++++++++++--- .../attributes/useCustomAttributesQuery.ts | 1 + .../sectionList/filters/DynamicFilters.tsx | 2 + .../filterSelectors/CategoryFilter.tsx | 24 ++++ .../filters/filterSelectors/index.ts | 1 + src/lib/sectionList/filters/filterConfig.tsx | 3 + .../filters/parseFiltersToQueryParams.ts | 1 + .../listViews/sectionListViewsConfig.ts | 20 +++- src/pages/categoryCombos/Edit.tsx | 54 +++++++++ src/pages/categoryCombos/List.tsx | 6 + src/pages/categoryCombos/New.tsx | 24 ++++ .../form/CategoryComboFormFields.tsx | 110 ++++++++++++++++++ .../form/categoryComboSchema.ts | 27 +++++ src/pages/categoryCombos/form/index.ts | 2 + src/pages/categoryCombos/form/types.ts | 0 15 files changed, 345 insertions(+), 18 deletions(-) create mode 100644 src/components/sectionList/filters/filterSelectors/CategoryFilter.tsx create mode 100644 src/pages/categoryCombos/Edit.tsx create mode 100644 src/pages/categoryCombos/List.tsx create mode 100644 src/pages/categoryCombos/New.tsx create mode 100644 src/pages/categoryCombos/form/CategoryComboFormFields.tsx create mode 100644 src/pages/categoryCombos/form/categoryComboSchema.ts create mode 100644 src/pages/categoryCombos/form/index.ts create mode 100644 src/pages/categoryCombos/form/types.ts diff --git a/i18n/en.pot b/i18n/en.pot index 428511c1..8e3d64b6 100644 --- a/i18n/en.pot +++ b/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2024-08-28T01:15:41.705Z\n" -"PO-Revision-Date: 2024-08-28T01:15:41.705Z\n" +"POT-Creation-Date: 2024-09-30T15:09:50.864Z\n" +"PO-Revision-Date: 2024-09-30T15:09:50.864Z\n" msgid "schemas" msgstr "schemas" @@ -66,9 +66,6 @@ msgstr "All" msgid "Filter options" msgstr "Filter options" -msgid "Something went wrong when submitting the form" -msgstr "Something went wrong when submitting the form" - msgid "Save and close" msgstr "Save and close" @@ -78,6 +75,15 @@ msgstr "Exit without saving" msgid "Create {{modelName}} " msgstr "Create {{modelName}} " +msgid "Validation errors" +msgstr "Validation errors" + +msgid "Some fields have validation errors. Please fix them before saving." +msgstr "Some fields have validation errors. Please fix them before saving." + +msgid "Something went wrong when submitting the form" +msgstr "Something went wrong when submitting the form" + msgid "" msgstr "" @@ -114,6 +120,21 @@ msgstr "Failed to load {{label}}" msgid "Failed to load" msgstr "Failed to load" +msgid "Download" +msgstr "Download" + +msgid "Merge" +msgstr "Merge" + +msgid "Delete source data element values" +msgstr "Delete source data element values" + +msgid "Last updated" +msgstr "Last updated" + +msgid "Discard" +msgstr "Discard" + msgid "Aggregation level(s)" msgstr "Aggregation level(s)" @@ -213,9 +234,6 @@ msgstr "Created" msgid "Last updated by" msgstr "Last updated by" -msgid "Last updated" -msgstr "Last updated" - msgid "Id" msgstr "Id" @@ -237,9 +255,6 @@ msgstr "Details" msgid "Failed to load details" msgstr "Failed to load details" -msgid "Download" -msgstr "Download" - msgid "Download {{section}}" msgstr "Download {{section}}" @@ -276,6 +291,9 @@ msgstr "Include user sharing settings" msgid "Clear all filters" msgstr "Clear all filters" +msgid "Category" +msgstr "Category" + msgid "Type to filter options" msgstr "Type to filter options" @@ -408,9 +426,6 @@ msgstr "Edit and view" msgid "Search for a user or group" msgstr "Search for a user or group" -msgid "Category" -msgstr "Category" - msgid "Categories" msgstr "Categories" @@ -810,6 +825,9 @@ msgstr "GeoJSON" msgid "Disaggregation" msgstr "Disaggregation" +msgid "Aggregation type" +msgstr "Aggregation type" + msgid "Favorite" msgstr "Favorite" @@ -837,6 +855,21 @@ msgstr "Data dimension type" msgid "This field requires a unique value, please choose another one" msgstr "This field requires a unique value, please choose another one" +msgid "{{label}} (required)" +msgstr "{{label}} (required)" + +msgid "No changes to be saved" +msgstr "No changes to be saved" + +msgid "Saved successfully" +msgstr "Saved successfully" + +msgid "Cannot save empty object" +msgstr "Cannot save empty object" + +msgid "Created successfully" +msgstr "Created successfully" + msgid "Required" msgstr "Required" @@ -876,6 +909,30 @@ msgstr "Filter available category options" msgid "Filter selected category options" msgstr "Filter selected category options" +msgid "Choose how this category combo will be used to capture and analyze data." +msgstr "Choose how this category combo will be used to capture and analyze data." + +msgid "Skip category total in reports" +msgstr "Skip category total in reports" + +msgid "Choose the categories to include in this category combo." +msgstr "Choose the categories to include in this category combo." + +msgid "Available categories" +msgstr "Available categories" + +msgid "Selected categories" +msgstr "Selected categories" + +msgid "Filter available categories" +msgstr "Filter available categories" + +msgid "Filter selected categories" +msgstr "Filter selected categories" + +msgid "At least one category is required" +msgstr "At least one category is required" + msgid "Create data element group" msgstr "Create data element group" @@ -909,9 +966,6 @@ msgstr "The default way to aggregate this data element in analytics." msgid "Disabled for the selected value type." msgstr "Disabled for the selected value type." -msgid "Aggregation type" -msgstr "Aggregation type" - msgid "Color and icon" msgstr "Color and icon" diff --git a/src/components/form/attributes/useCustomAttributesQuery.ts b/src/components/form/attributes/useCustomAttributesQuery.ts index bda6c250..2663b5c9 100644 --- a/src/components/form/attributes/useCustomAttributesQuery.ts +++ b/src/components/form/attributes/useCustomAttributesQuery.ts @@ -40,6 +40,7 @@ export function useCustomAttributesQuery({ enabled = true, }: UseCustomAttributesQueryOptions = {}) { const schemaSection = useSchemaSectionHandleOrThrow() + const customAttributes = useDataQuery( CUSTOM_ATTRIBUTES_QUERY, { diff --git a/src/components/sectionList/filters/DynamicFilters.tsx b/src/components/sectionList/filters/DynamicFilters.tsx index 07479fc7..3dbfded4 100644 --- a/src/components/sectionList/filters/DynamicFilters.tsx +++ b/src/components/sectionList/filters/DynamicFilters.tsx @@ -8,12 +8,14 @@ import { ValueTypeSelectionFilter, PublicAccessFilter, DataDimensionTypeFilter, + Categoryfilter, } from './filterSelectors' import { useFilterKeys } from './useFilterKeys' type FilterKeyToComponentMap = Partial> const filterKeyToComponentMap: FilterKeyToComponentMap = { + category: Categoryfilter, categoryCombo: CategoryComboFilter, dataSet: DataSetFilter, domainType: DomainTypeSelectionFilter, diff --git a/src/components/sectionList/filters/filterSelectors/CategoryFilter.tsx b/src/components/sectionList/filters/filterSelectors/CategoryFilter.tsx new file mode 100644 index 00000000..9b73efff --- /dev/null +++ b/src/components/sectionList/filters/filterSelectors/CategoryFilter.tsx @@ -0,0 +1,24 @@ +import i18n from '@dhis2/d2-i18n' +import React from 'react' +import { useSectionListFilter } from '../../../../lib' +import { createFilterDataQuery } from './createFilterDataQuery' +import { ModelFilterSelect } from './ModelFilter' + +const query = createFilterDataQuery('categories') + +export const Categoryfilter = () => { + const [filter, setFilter] = useSectionListFilter('category') + + const selected = filter?.[0] + + return ( + + setFilter(selected ? [selected] : undefined) + } + /> + ) +} diff --git a/src/components/sectionList/filters/filterSelectors/index.ts b/src/components/sectionList/filters/filterSelectors/index.ts index 55442aca..db287c03 100644 --- a/src/components/sectionList/filters/filterSelectors/index.ts +++ b/src/components/sectionList/filters/filterSelectors/index.ts @@ -4,3 +4,4 @@ export * from './CategoryComboFilter' export * from './IdentifiableFilter' export * from './ConstantSelectionFilter' export * from './PublicAccessFilter' +export * from './CategoryFilter' diff --git a/src/lib/sectionList/filters/filterConfig.tsx b/src/lib/sectionList/filters/filterConfig.tsx index cb2fda52..92232623 100644 --- a/src/lib/sectionList/filters/filterConfig.tsx +++ b/src/lib/sectionList/filters/filterConfig.tsx @@ -13,6 +13,7 @@ export const filterParamsSchema = z [IDENTIFIABLE_FILTER_KEY]: z.string(), aggregationType: z.array(z.nativeEnum(DataElement.aggregationType)), categoryCombo: zodArrayIds, + category: zodArrayIds, dataSet: zodArrayIds, domainType: z.array(z.nativeEnum(DataElement.domainType)), publicAccess: z.array( @@ -31,6 +32,7 @@ export const filterQueryParamType = { domainType: CustomDelimitedArrayParam, valueType: CustomDelimitedArrayParam, dataSet: CustomDelimitedArrayParam, + category: CustomDelimitedArrayParam, categoryCombo: CustomDelimitedArrayParam, publicAccess: CustomDelimitedArrayParam, dataDimensionType: StringParam, @@ -59,4 +61,5 @@ export type ConfigurableFilterKey = Exclude< FilterKey, typeof IDENTIFIABLE_FILTER_KEY > + export type FilterKeys = FilterKey[] diff --git a/src/lib/sectionList/filters/parseFiltersToQueryParams.ts b/src/lib/sectionList/filters/parseFiltersToQueryParams.ts index 16ae3fa0..49fc0bc0 100644 --- a/src/lib/sectionList/filters/parseFiltersToQueryParams.ts +++ b/src/lib/sectionList/filters/parseFiltersToQueryParams.ts @@ -30,6 +30,7 @@ const defaultFilter = ( const filterToQueryParamMap: FilterToQueryParamsMap = { identifiable: (value) => `identifiable:token:${value}`, + category: (value) => inFilter('categories.id', value), categoryCombo: (value, section) => { if (section.name === 'category') { return inFilter('categoryCombos.id', value) diff --git a/src/lib/sectionList/listViews/sectionListViewsConfig.ts b/src/lib/sectionList/listViews/sectionListViewsConfig.ts index 3efa3845..53207a35 100644 --- a/src/lib/sectionList/listViews/sectionListViewsConfig.ts +++ b/src/lib/sectionList/listViews/sectionListViewsConfig.ts @@ -109,10 +109,28 @@ export const modelListViewsConfig = { }, category: { columns: { - default: ['name', 'dataDimensionType', DESCRIPTORS.publicAccess], + default: [ + 'name', + 'dataDimensionType', + DESCRIPTORS.publicAccess, + 'lastUpdated', + ], }, filters: { default: ['dataDimensionType', 'categoryCombo'], }, }, + categoryCombo: { + columns: { + default: [ + 'name', + 'dataDimensionType', + DESCRIPTORS.publicAccess, + 'lastUpdated', + ], + }, + filters: { + default: ['dataDimensionType', 'category'], + }, + }, } satisfies SectionListViewConfig diff --git a/src/pages/categoryCombos/Edit.tsx b/src/pages/categoryCombos/Edit.tsx new file mode 100644 index 00000000..717844ea --- /dev/null +++ b/src/pages/categoryCombos/Edit.tsx @@ -0,0 +1,54 @@ +import React from 'react' +import { useQuery } from 'react-query' +import { useParams } from 'react-router-dom' +import { DefaultEditFormContents, FormBase } from '../../components' +import { DEFAULT_FIELD_FILTERS, SECTIONS_MAP, useOnSubmitEdit } from '../../lib' +import { useBoundResourceQueryFn } from '../../lib/query/useBoundQueryFn' +import { CategoryCombo, PickWithFieldFilters } from '../../types/generated' +import { validate, CategoryComboFormFields } from './form' + +const fieldFilters = [ + ...DEFAULT_FIELD_FILTERS, + 'name', + 'code', + 'categories[id,displayName]', + 'skipTotal', + 'dataDimensionType', +] as const + +export type CategoryComboFormValues = PickWithFieldFilters< + CategoryCombo, + typeof fieldFilters +> + +const section = SECTIONS_MAP.categoryCombo + +export const Component = () => { + const queryFn = useBoundResourceQueryFn() + const modelId = useParams().id as string + const query = { + resource: 'categoryCombos', + id: modelId, + params: { + fields: fieldFilters.concat(), + }, + } + const categoryCombo = useQuery({ + queryKey: [query], + queryFn: queryFn, + }) + + return ( + + + + + + ) +} diff --git a/src/pages/categoryCombos/List.tsx b/src/pages/categoryCombos/List.tsx new file mode 100644 index 00000000..7133f024 --- /dev/null +++ b/src/pages/categoryCombos/List.tsx @@ -0,0 +1,6 @@ +import React from 'react' +import { DefaultSectionList } from '../DefaultSectionList' + +export const Component = () => ( + +) diff --git a/src/pages/categoryCombos/New.tsx b/src/pages/categoryCombos/New.tsx new file mode 100644 index 00000000..e222ee3c --- /dev/null +++ b/src/pages/categoryCombos/New.tsx @@ -0,0 +1,24 @@ +import React from 'react' +import { FormBase } from '../../components' +import { DefaultNewFormContents } from '../../components/form/DefaultFormContents' +import { SECTIONS_MAP, useOnSubmitNew } from '../../lib' +import { validate } from './form' +import { CategoryComboFormFields } from './form/CategoryComboFormFields' +import { initialValues } from './form/categoryComboSchema' + +const section = SECTIONS_MAP.categoryCombo + +export const Component = () => { + return ( + + + + + + ) +} diff --git a/src/pages/categoryCombos/form/CategoryComboFormFields.tsx b/src/pages/categoryCombos/form/CategoryComboFormFields.tsx new file mode 100644 index 00000000..11f2004b --- /dev/null +++ b/src/pages/categoryCombos/form/CategoryComboFormFields.tsx @@ -0,0 +1,110 @@ +import i18n from '@dhis2/d2-i18n' +import { CheckboxFieldFF, RadioFieldFF } from '@dhis2/ui' +import React from 'react' +import { Field } from 'react-final-form' +import { + StandardFormField, + StandardFormSection, + StandardFormSectionTitle, + StandardFormSectionDescription, + HorizontalFieldGroup, + ModelTransferField, + NameField, + CodeField, +} from '../../../components' +import { SECTIONS_MAP } from '../../../lib' + +const section = SECTIONS_MAP.categoryCombo + +export const CategoryComboFormFields = () => { + return ( + <> + + + {i18n.t('Basic information')} + + + {i18n.t('Set up the basic information for this category.')} + + + + + + + + + + + + + {i18n.t('Data configuration')} + + + {i18n.t( + 'Choose how this category combo will be used to capture and analyze data.' + )} + + + + + name="dataDimensionType" + component={RadioFieldFF} + label={i18n.t('Disaggregation')} + type="radio" + value={'DISAGGREGATION'} + /> + + name="dataDimensionType" + component={RadioFieldFF} + label={i18n.t('Attribute')} + type="radio" + value={'ATTRIBUTE'} + /> + + + + + + + + + + + + + {i18n.t( + 'Choose the categories to include in this category combo.' + )} + + + + + + + + + ) +} diff --git a/src/pages/categoryCombos/form/categoryComboSchema.ts b/src/pages/categoryCombos/form/categoryComboSchema.ts new file mode 100644 index 00000000..95e06d28 --- /dev/null +++ b/src/pages/categoryCombos/form/categoryComboSchema.ts @@ -0,0 +1,27 @@ +import i18n from '@dhis2/d2-i18n' +import { z } from 'zod' +import { getDefaults, modelFormSchemas } from '../../../lib' +import { createFormValidate } from '../../../lib/form/validate' +import { CategoryComboFormValues } from '../Edit' +import { CategoryCombo } from './../../../types/generated/models' + +const { identifiable, withAttributeValues, referenceCollection } = + modelFormSchemas + +export const categoryComboSchema = identifiable + .merge(withAttributeValues) + .extend({ + code: z.string().trim().optional(), + dataDimensionType: z + .nativeEnum(CategoryCombo.dataDimensionType) + .default(CategoryCombo.dataDimensionType.DISAGGREGATION), + skipTotal: z.boolean().default(false), + categories: referenceCollection + .min(1, i18n.t('At least one category is required')) + .default([]), + }) + +export const initialValues: Partial = + getDefaults(categoryComboSchema) + +export const validate = createFormValidate(categoryComboSchema) diff --git a/src/pages/categoryCombos/form/index.ts b/src/pages/categoryCombos/form/index.ts new file mode 100644 index 00000000..d977c120 --- /dev/null +++ b/src/pages/categoryCombos/form/index.ts @@ -0,0 +1,2 @@ +export { categoryComboSchema, validate } from './categoryComboSchema' +export { CategoryComboFormFields } from './CategoryComboFormFields' diff --git a/src/pages/categoryCombos/form/types.ts b/src/pages/categoryCombos/form/types.ts new file mode 100644 index 00000000..e69de29b From 8f5fdca6502d8e177dd0dfa980958ec26a97d832 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Mon, 30 Sep 2024 15:19:27 +0000 Subject: [PATCH 09/11] chore(release): cut 0.5.0 [skip release] # [0.5.0](https://github.com/dhis2/maintenance-app-beta/compare/v0.4.0...v0.5.0) (2024-09-30) ### Features * **catCombo:** add category combo form and list ([#410](https://github.com/dhis2/maintenance-app-beta/issues/410)) ([7687c13](https://github.com/dhis2/maintenance-app-beta/commit/7687c13d99335154880275e7631af9c221d0aceb)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83cf9530..dacd9ef8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [0.5.0](https://github.com/dhis2/maintenance-app-beta/compare/v0.4.0...v0.5.0) (2024-09-30) + + +### Features + +* **catCombo:** add category combo form and list ([#410](https://github.com/dhis2/maintenance-app-beta/issues/410)) ([7687c13](https://github.com/dhis2/maintenance-app-beta/commit/7687c13d99335154880275e7631af9c221d0aceb)) + # [0.4.0](https://github.com/dhis2/maintenance-app-beta/compare/v0.3.1...v0.4.0) (2024-09-28) diff --git a/package.json b/package.json index 475a7c08..b35b2a44 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maintenance-app", - "version": "0.4.0", + "version": "0.5.0", "description": "", "license": "BSD-3-Clause", "private": true, From 8d3b87b7c47399bac5a8c4b88a8c0046fd69ca74 Mon Sep 17 00:00:00 2001 From: Flaminia Date: Mon, 30 Sep 2024 08:32:00 -0700 Subject: [PATCH 10/11] feat: add details panel to org list * feat: add details panel to org list * feat: add tests for additionsl org unit list features --- .../detailsPanel/DefaultDetailsPanel.tsx | 6 +- .../sectionList/detailsPanel/DetailsPanel.tsx | 2 +- .../sectionList/download/DownloadDialog.tsx | 2 +- .../download/DownloadDialogContent.tsx | 1 + src/pages/organisationUnits/List.spec.tsx | 137 +++++++++++++++++- .../list/OrganisationUnitList.tsx | 32 +++- .../list/OrganisationUnitListActions.tsx | 17 ++- .../list/OrganisationUnitRow.tsx | 4 + src/types/generated/utility.ts | 2 +- 9 files changed, 193 insertions(+), 10 deletions(-) diff --git a/src/components/sectionList/detailsPanel/DefaultDetailsPanel.tsx b/src/components/sectionList/detailsPanel/DefaultDetailsPanel.tsx index c4939f95..14d19154 100644 --- a/src/components/sectionList/detailsPanel/DefaultDetailsPanel.tsx +++ b/src/components/sectionList/detailsPanel/DefaultDetailsPanel.tsx @@ -89,15 +89,15 @@ const DetailsContent = ({ data }: { data: DetailsResponse }) => { )} {data.code} - {data.createdBy.displayName} + {data.createdBy?.displayName} {data.lastUpdatedBy - ? data.lastUpdatedBy.displayName - : data.createdBy.displayName} + ? data.lastUpdatedBy?.displayName + : data.createdBy?.displayName} diff --git a/src/components/sectionList/detailsPanel/DetailsPanel.tsx b/src/components/sectionList/detailsPanel/DetailsPanel.tsx index 52d63885..e5937a11 100644 --- a/src/components/sectionList/detailsPanel/DetailsPanel.tsx +++ b/src/components/sectionList/detailsPanel/DetailsPanel.tsx @@ -13,7 +13,7 @@ type DetailsPanelProps = { export const DetailsPanel = ({ children, onClose }: DetailsPanelProps) => { return (
) diff --git a/src/pages/organisationUnits/list/OrganisationUnitListActions.tsx b/src/pages/organisationUnits/list/OrganisationUnitListActions.tsx index 09aceae6..d4430b51 100644 --- a/src/pages/organisationUnits/list/OrganisationUnitListActions.tsx +++ b/src/pages/organisationUnits/list/OrganisationUnitListActions.tsx @@ -3,6 +3,7 @@ import { Button, FlyoutMenu, IconEdit16, + IconMore16, IconMore24, MenuItem, Popover, @@ -21,14 +22,14 @@ import { canDeleteModel } from '../../../lib/models/access' type OrganisationUnitListActionProps = { model: BaseListModel + onShowDetailsClick: (model: BaseListModel) => void // onOpenTranslationClick: (model: BaseListModel) => void - // onDeleteSuccess: () => void } export const OrganisationUnitListActions = ({ model, + onShowDetailsClick, }: // onOpenTranslationClick, -// onDeleteSuccess, OrganisationUnitListActionProps) => { const deletable = canDeleteModel(model) const queryClient = useQueryClient() @@ -47,6 +48,7 @@ OrganisationUnitListActionProps) => { model={model} // onTranslateClick={() => onOpenTranslationClick(model)} onDeleteSuccess={handleDeleteSuccess} + onShowDetailsClick={onShowDetailsClick} /> ) @@ -57,6 +59,7 @@ type OrganisationUnitActionMoreProps = { model: BaseListModel // onTranslateClick: () => void onDeleteSuccess: () => void + onShowDetailsClick: (model: BaseListModel) => void } const OrganisationUnitActionMore = ({ @@ -64,6 +67,7 @@ const OrganisationUnitActionMore = ({ model, // onTranslateClick, onDeleteSuccess, + onShowDetailsClick, }: OrganisationUnitActionMoreProps) => { const [open, setOpen] = useState(false) const ref = useRef(null) @@ -89,6 +93,15 @@ const OrganisationUnitActionMore = ({ dataTest="row-actions-menu" > + } + onClick={() => { + onShowDetailsClick(model) + setOpen(false) + }} + /> toggleShowAll: (id: string) => void showAllActive: boolean isFiltering: boolean fetchNextPage: (id: string) => void + onShowDetailsClick: (model: BaseListModel) => void }) => { const parentRow = row.getParentRow() @@ -103,6 +106,7 @@ export const OrganisationUnitRow = ({ {}} /> diff --git a/src/types/generated/utility.ts b/src/types/generated/utility.ts index 887860b2..110a1400 100644 --- a/src/types/generated/utility.ts +++ b/src/types/generated/utility.ts @@ -135,7 +135,7 @@ export type GistParams = { * A utility type that takes a Model (eg. DataElement) * and returns a type with the properties that are references * Note that in case of collections, the type of the property will be the type of the items in the collection - * + * * Eg. GetReferencedModels will return: * { * categoryCombo: CategoryCombo; From f53707eebd5f6cea0f62ccaae936466167851b88 Mon Sep 17 00:00:00 2001 From: "@dhis2-bot" Date: Mon, 30 Sep 2024 15:35:49 +0000 Subject: [PATCH 11/11] chore(release): cut 0.6.0 [skip release] # [0.6.0](https://github.com/dhis2/maintenance-app-beta/compare/v0.5.0...v0.6.0) (2024-09-30) ### Features * add details panel to org list ([8d3b87b](https://github.com/dhis2/maintenance-app-beta/commit/8d3b87b7c47399bac5a8c4b88a8c0046fd69ca74)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dacd9ef8..2ed9d8d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [0.6.0](https://github.com/dhis2/maintenance-app-beta/compare/v0.5.0...v0.6.0) (2024-09-30) + + +### Features + +* add details panel to org list ([8d3b87b](https://github.com/dhis2/maintenance-app-beta/commit/8d3b87b7c47399bac5a8c4b88a8c0046fd69ca74)) + # [0.5.0](https://github.com/dhis2/maintenance-app-beta/compare/v0.4.0...v0.5.0) (2024-09-30) diff --git a/package.json b/package.json index b35b2a44..0bfba2d6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "maintenance-app", - "version": "0.5.0", + "version": "0.6.0", "description": "", "license": "BSD-3-Clause", "private": true,